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

компилятор ТСС. 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
страница29 из 38
1   ...   25   26   27   28   29   30   31   32   ...   38
void gen_opl(int op) Для '/' и TOK_PDIV выставляется функция TOK___divdi3, происходит переход на gen_func Для TOK_UDIV выставляется функция TOK___udivdi3, происходит переход на gen_func Для '%' выставляется функция TOK___moddi3, происходит переход на gen_func Для TOK_UMOD: выставляется функция TOK___umoddi3, начиная с метки gen_func происходит следующая обработка: Вызываются vpush_global_sym(), vrott(), gfunc_call(), vpushi(0) В поле r последнего SValue записывается REG_IRET, а в поле r2 записывается REG_LRET Для '^', '&', '|', '*', '+' и '-' происходит следующая обработка: Сохраняются биты кодирующие тип последнего SValue Вызываются vswap(), lexpand(), vrotb(), lexpand() Сохраняется последняя SValue, чтоб поменять ее местами с третьей с конца Сохраняется вторая с конца SValue, чтоб поменять ее местами с третье с конца Вызывается vswap() Если задана операция '*' происходит следующая обработка: Дважды вызываются vpushv(), за тем gen_op(), lexpand(), 4 раза vrotb() Сохраняется последняя SValue, чтоб поменять ее местами со второй с конца Вызывается gen_op('*'), дважды vrotb() и трижды gen_op() Если передана операция '+' или '-' происходит следующая обработка: Если передана операция '+', выставляется токен TOK_ADDC1, иначе TOK_SUBC1 Вызывается gen_op(), дважды vrotb() и еще раз gen_op() Если передана другая операция, вызывается gen_op(), дважды vrotb(), еще раз gen_op(op) Вызывается lbuild() Вызывается TOK_SAR, TOK_SHR и TOK_SHL: Если поле r последней SValue при побитовом И с VT_VALMASK, VT_LVAL, VT_SYM дает VT_CONST Сохраняются биты кодирующие тип предпоследней SValue Вызываются vswap(), lexpand() и vrotb(); В переменную c сохраняется поле i структуры CValue, связанного с последней SValue Вызывается vpop() Если передана операция отличная от TOK_SHL, вызывается vswap(); Если c больше или равна 32 происходит следующая обработка: Вызывается vpop() Если c больше 32, вызывается vpushi() и gen_op() Если операция отлична от TOK_SAR, вызывается vpushi(0), иначе gv_dup(), vpushi(), gen_op(TOK_SAR); Вызывается vswap(); Если c меньше 32 происходит следующая обработка: Вызываются vswap(), gv_dup(), vpushi(), gen_op(), vswap(), vpushi() Если передана TOK_SHL, вызывается gen_op(), иначе тоже gen_op() но с другим параметром. Вызываются vrotb() и vpushi(c); Если передана TOK_SHL, вызывается gen_op(), иначе тоже gen_op() но с другим параметром. Вызывается gen_op('|'); Если передана операция отличная от TOK_SHL, вызывается vswap() Вызывается lbuild() Если проверка на VT_CONST не проходит, происходит следующая обработка: Для TOK_SAR выставляется функция TOK___sardi3, управление передается на метку gen_func Для TOK_SHR выставляется функция TOK___shrdi3, управление передается на метку gen_func Для TOK_SHL выставляется функция TOK___shldi3, управление передается на метку gen_func Для операций, не отвечающих предыдущим условиям: Сохраняются биты кодирующие тип последней CValue Выхываются vswap(), lexpand(), vrotb(), lexpand(); Сохраняется последняя CValue чтобы поменять ее со второй с конца Сохраняется переданная операция Если сохранена TOK_LT, то она меняется на TOK_LE Если сохранена TOK_GT, то она меняется на TOK_GE Если сохранена TOK_ULT, то она меняется на TOK_ULE Если сохранена TOK_UGT, то она меняется на TOK_UGE Обнуляются a и b Вызывается gen_op() Если сохраненная операция отличается от TOK_NE, a обновляется вызовом gtst() Если переданная операция отличается от TOK_EQ, то проверяется значение a, если оно нулевое, то b ообновляется вызовом gtst(), иначе вызовом psym() Сохраненная операция обновляется значением переданной операции. Если сохранена TOK_LT, то она меняется на TOK_ULT Если сохранена TOK_LE, то она меняется на TOK_ULE Если сохранена TOK_GT, то она меняется на TOK_UGT Если сохранена TOK_GE, то она меняется на TOK_UGE Вызывается gen_op() Переменная a обновляется вызовом gtst() Вызываются gsym() и vseti()
1   ...   25   26   27   28   29   30   31   32   ...   38


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