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

компилятор ТСС. 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
страница30 из 38
1   ...   26   27   28   29   30   31   32   33   ...   38
void vseti(int r, int v) Во временном CType устанавливается тип VT_INT Вызывается vset() void vset(CType *type, int r, int v) Во временном CValue переданным значением обновляется поле i Вызывается vsetc() void vsetc(CType *type, int r, CValue *vc) Цепочка vtop проверяется на переполнение Если указатель vstack выходит за границы или совпадает с vtop, в временную переменную сохраняется биты поля r, входящие в VT_VALMASK. Если полученное значение равно VT_CMP или со сброшенным первым битом равно VT_JMP, вызывается gv() Цепочка vtop увеличивается. В последней SValue устанавливаются необходимые поля. void lexpand(void) В переменную u сохраняются биты кодирующие тип, входящие в VT_UNSIGNED Вызывается gv(), vdup() Поле r последней структуры SValue, обновляется значением поля r предпоследней SValue Поле r2 последней SValue обновляется значением VT_CONST Поле r2 предпоследней SValue обновляется значением VT_CONST Биты кодирующие тип последней SValue обновляется побитовым или u и VT_INT Биты кодирующие тип предпоследней SValue обновляется побитовым или u и VT_INT void vdup(void) Вызывается vpushv() для конца цепочки vtop void vpushv(SValue *v) Цепочка vtop проверяется на переполнение Цепочка vtop увеличивается. В ее конец записывается переданная SValue void vrotb(int n) Функция принимает номер SValue с конца цепочки vtop. Эта структура сохраняется во временной переменной. Цепочка vtop сдвигется вперед, сохраненный последний элемнт помещается в наало. void gv_dup(void) Сохраняются биты кодирующие тип последнего элемента цепочки vtop Если кодидуется VT_LLONG, вызываются lexpand(), gv_dup(), vswap(), vrotb(), gv_dup(), vrotb(), lbuild() дважды vrotb(), vswap(), lbuild() и vswap() Если кодируется другой тип, происходит следующая обработка: Переменной rc присваивается RC_INT Во временной SValue биты кодирующие тип обновляются значением VT_INT Если проверка типа с помощью is_float() дает положительный результат, rc присваивается RC_FLOAT, во временной SValue выставляется сохраненный тип. Переменная r обновляется вызовом gv() Переменная r1 обновляется вызовом get_reg() Во временной SValue обновляется поле r значением r Во временной SValue обнуляетя поле ul связанного CValue Вызываются load() и vdup() Поле r последней SValue обновляется значением r1; int get_reg(int rc) Происходит обход массива reg_classes. Если побитовое И с переданным значением дает ненулевой результат то происходит перебор SValue, начиная с vstack и заканчивая vtop. Если встречается структура в которой поле r или поле r2 совпадает с номер текущего элемента в массиве reg_classes, происходит переход на метку notfound, т. е. конец шага цикла обхода reg_classes. Если такой структуры не обнаружится, текущй номер элемента reg_classes Происходит перебор SValue, начиная с vstack и заканчивая vtop В переменню r сохраняются биты поля r текущей SValue, входящие в VT_VALMASK Если полученное значение меньше VT_CONST и соостетствующий элемент в массиве reg_classes при побитовом И с пререданным значением дает ненулевой резльутат, происходит переход на метку save_found В переменню r сохраняются биты поля r2 текущей SValue, входящие в VT_VALMASK Если полученное значение меньше VT_CONST и соостетствующий элемент в массиве reg_classes при побитовом И с пререданным значением дает ненулевой резльутат, вызывается save_reg() и функция заврешается возвращая значение r. Эти два шага предворяет метка save_found: Если номер не найден, функция возвращает-1 void lbuild(int t) Вызывается gv2() Поле r2 предпоследней SValue обновляется значением поля r последней SValue Биты кодирующие тип предпоследней SValue обновляется переданным значением Вызывается vpop()
1   ...   26   27   28   29   30   31   32   33   ...   38


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