компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов
Скачать 191.99 Kb.
|
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 |