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

компилятор ТСС. 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
страница28 из 38
1   ...   24   25   26   27   28   29   30   31   ...   38
void save_reg(int r) Сбрасывается флаг saved Цикл обходит SValue начиная с vstack и заканчивая vtop. Следующая обработка выполнится в одном из двух случаев; Если поле r содержит биты, входящие в VT_VALMASK идентичные переменной r CType связанный с текущим SValue кодирует VT_LLONG и при этом поле поле r2 содержит биты, входящие в VT_VALMASK идентичные переменной r Если флаг saved сброшен начинается следующая обработка: Переменная r обновляетя побитовым И поля r и VT_VALMASK CType сохнаняестя в ременную переменную Если поле r содержит бит VT_LVAL, проварка CType с помощью is_float() возвращает нулевой результат при этом CType кодирует VT_LLONG, то сохраненный CType обновляется адресом int_type Переменная size обновляется вызовом type_size() Глобальная переменная loc уменшается на значение size с учетом выравнивания align Во временном SValue обноляется поле t связного CType значенимем поля t временного CType Во временном SValue обновляется поле r побитовым или VT_LOCAL и VT_LVAL Во временном SValue обновляется поле ul связанного CValue, значением глобальной loc Вызывается store() Если переменная r равна TREG_ST0, вызывается o() Если временный CType кодирует VT_LLONG, то во временном SValue увеличивается на 4 поле ul связанного CValue, вызывается store() Сохраняется значение loc Устанавливается флаг saved Если поле r содержит биты VT_LVAL, то это в этом поле сбрасываются биты VT_VALMASK | VT_BOUNDED и устанавливаются VT_LLOCAL, иначе поле обновляется результатом побитового ИЛИ вызова lvalue_type() и VT_LOCAL Поле r2 обновляется значением VT_CONST; Поле ul связанного CValue обновляется сохраненным значеним loc static int lvalue_type(int t) Временному результату присваивается VT_LVAL; В переданном типе сбрасываются биты не входящие в VT_BTYPE; Если кодируется VT_BYTE или VT_BOOL в результат добавляется бит VT_LVAL_BYTE Если кодируется VT_SHORT в результат добавляется бит VT_LVAL_SHORT Если предыдущие два типа не кодируются, возвращается VT_LVAL Если кодируется VT_UNSIGNED в результат добавляется бит VT_LVAL_UNSIGNED void store(int r, SValue *v) Сохраняется поле t связанного CType Сохраняется поле ul Связанного CValue Сохраняются биты поля r входящие в VT_VALMASK Сохраняются биты кодирующие тип Если кодируется VT_FLOAT, вызывается o(), переменной r присваивается 2 Если кодируется VT_DOUBLE, вызывается o(), переменной r присваивается 2 Если кодируется VT_LDOUBLE, дважды вызывается o(), переменной r присваивается 7 Если кодируюется другой тип выполняется следующая обработака Если кодируется VT_SHORT, вызывается o() Если кодируется VT_BYTE или VT_BOOL, вызывается o() с другим параметром. Если кодируется другой тип вызывается o() с параметром 0x89 Если сохраненное поле r равно VT_CONST или VT_LOCAL, или содержит биты VT_LVAL, то вызывается gen_modrm(). Если сохранено другое значение и оно отличется от переменной r, вызывается o() void gv2(int rc1, int rc2) Сохраняется побитовое И поля r последней SValue и VT_VALMASK Если полчившееся значени отличается от VT_CMP и это значение со сброшенным младшим битом отличается от VT_JMP и первый параметр меньше или равен второго.ю начинается следующая обработка. Вызываются vswap(), gv(rc1) еще раз vswap() и еще раз gv() Если биты r предпоследнего SValue входящие в VT_VALMASK формируют число больше VT_CONST, вызываются vswap(), gv() и еще раз vswap(); Если проверка сохраненного значения не проходит, вызывается gv(), vswap() и еще раз gv() и vswap() Если биты r предпоследнего SValue входящие в VT_VALMASK формируют число больше VT_CONST, вызываются gv()
1   ...   24   25   26   27   28   29   30   31   ...   38


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