Главная страница

компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов


Скачать 191.99 Kb.
НазваниеTiny c compiler by Fabrice Bellard Описание алгоритмов
Анкоркомпилятор ТСС
Дата08.11.2019
Размер191.99 Kb.
Формат файлаodt
Имя файлаtcc book.odt
ТипДокументы
#94047
страница27 из 38
1   ...   23   24   25   26   27   28   29   30   ...   38

void gen_opi(int op) Для операций '+' и TOK_ADDC1 выставляется нулевой опкод Начиная с метки gen_op8 начинается следующая обработка:

Если поле r последней SValue при побитовом И с VT_VALMASK, VT_LVAL, VT_SYM дает VT_CONST, то начинается следующая обработка:

Вызывается vswap() В r записывается результат вызова gv() Вызывается vswap()

Поле i структуры CType связанной с последней SValue сохраняется в переменную c
Если это значение при отбасывании старших бит равно само себе, два раза вызывается o() и один раз g(). Если значения не равны, вызываются o() и oad() Если проверка на VT_CONST не проходит, вызывается gv2(), поле r последней и предпоследней SValue сохраняются в переменные r и fr, Дважды вызывается o() Уменьшается цепочка vtop--; Если код операции больше или равен TOK_ULT и меньше или равен TOK_GT Поле r предпоследней SValue обновляется значением VT_CMP, поле i связанной CType обновляется кодом операции Для '-' и TOK_SUBC1, выставляется опкод 5, управление передается на метку gen_op8 Для TOK_ADDC2, выставляется опкод 2, управление передается на метку gen_op8 Для TOK_SUBC2, выставляется опкод 3, управление передается на метку gen_op8 Для '&', выставляется опкод 4, управление передается на метку gen_op8 Для '^', выставляется опкод 6, управление передается на метку gen_op8 Для '|', выставляется опкод 1, управление передается на метку gen_op8 Для '*' вызывается gv2(), поле r последней и предпоследней SValue сохраняются в переменные r и fr Уменьшаетя цепочка vtop Дважды вызывается o() Для TOK_SHL, выставляется опкод 4, управление передается на метку gen_shift Для TOK_SHR, выставляется опкод 5, управление передается на метку gen_shift Для TOK_SAR, выставляется опкод 7, начиная с метки gen_shift начинается следующая обработка Опкод обновляется побитовым ИЛИ 0xc0 и предыдущего опкода сдвинутого влево на < 3 бита

Если поле r последней SValue при побитовом И с VT_VALMASK, VT_LVAL, VT_SYM дает VT_CONST, то начинается следующая обработка:

Вызывается vswap(), r обновляется вызовом gv(), еще раз вызывается vswap(), переменная c обновляентся побитовым И поля i структуры CType связанной с последней SValue и 0x1f Дважды вызывается o() и один раз g() Если проверка на VT_CONST не проходит, вызывается gv2(), поле r последней SValue сохраняются в r Дважды вызывается o() Уменьшаетя цепочка vtop Для '/', TOK_UDIV, TOK_PDIV, '%', TOK_UMOD, TOK_UMULL происходит следующая обработка: вызывается gv2(), поле r предпоследней и последней SValue сохраняются в переменные r и fr Уменьшаетя цепочка vtop Дважды вызывается o() Вызывается save_reg() Если передана операция TOK_UMULL, дважды вызывается o(), поле r2 последней SValue обновляется значением TREG_EDX, перменная r обновляется значением TREG_EAX Если операция отличаетя от TOK_UMULL происходит следующая обработка: Если преданы операции TOK_UDIV или TOK_UMOD, дважды вызывается o() в противном случае также дважды вызывается o(), но с другими параметрами. Если передана операция '%' или TOK_UMOD, переменная r обновляется занчением TREG_EDX, иначе значением TREG_EAX Поле r последней SValue обновляется значением переменной r Для других операции, выставляется опкод 7, управление предедается на метку gen_op8
1   ...   23   24   25   26   27   28   29   30   ...   38


написать администратору сайта