void gen_opf(int op) Если предпоследняя SValue кодирует VT_CONST, вызываются vswap(), gv() и vswap() Если последняя SValue кодирует VT_CONST, вызываются gv() Если предпоследняя и последняя SValue содержат биты входящие в VT_LVAL, вызываются vswap(), gv() и vswap() Сбрасывается флаг swapped Если предпоследняя SValue содержит биты входящие в VT_LVAL, вызываются vswap(), устанавливается флаг swapped Если код переданной операции больше или равен TOK_ULT и меньше или равен TOK_GT, происходит следующая обработка: Вызываются load() и save_reg() Если передана операция TOK_GE или TOK_GT, инвертируется флаг swapped Если передана операция TOK_EQ или TOK_NE, сбрасывается флаг swapped Если установлен флаг swapped, вызывается o() Дважды вызывается o() Если передана TOK_EQ, дважды вызывается o() Если передана TOK_EQ, дважды вызывается o(), код операции обновляется значением TOK_NE Если передана TOK_GE или TOK_LE, вызывается o(), код операции обновляется значением op = TOK_EQ Если передана другая операция, вызывается o(), код операции обновляется значением op = TOK_EQ Уменьшается цепочка vtop Поле r последней SValue обновляется значением VT_CMP Поле i связанного СValue обновляется кодом операции. Если старвение с TOK_ULT и TOK_GT не проходит, происходит следующая обработка: Если CType связанный с последней SValue кодирует VT_DOUBLE, вызывается load(), инвертируется swapped Далее происходит обработка в соостветствии с переданной операщии Обработка '+' аналогична обрабтке операции, отличной от тех, для которых предусмотерна особая обработка. Перемення a обнуляется. Для '-', переменой a присваивается 4, если swapped установлен, переменная a увеличивается Для '*', переменой a присваивается 1 Для '/', переменой a присваивается 6, если swapped установлен, переменная a увеличивается Из CType связанного с последней SValue сохраняются биты коидирующие тип в переменну ft Из CValue связанного с последней SValue сохраняется поле ul d переменную fc Если fc кодирует VT_LDOUBLE, дважды вызывается o(), иначе начинается следующая обработка: В переменню r сохраняется поле r последней SValue Если r кодируетс VT_LLOCAL, происходит следующая обработка: Переменная r обновляется вызыовом get_reg() Поле r структуры CType связанного со временной SValue обновляется значением VT_INT Поле r временной SValue обновляется побитовым или VT_LOCAL и VT_LVAL Поле ul структуры CValue связанного со временной SValue обновляется значением fc Вызывается load(), обнуляется fc Если ft кодирует VT_DOUBLE, вызывается o(), иначе так же вызывается o(), но с другим параметром Вызывается gen_modrm() Уменьшается цепочка vtop void gaddrof(void) В поле r последней SValue сбрасываются биты входящие в VT_LVAL Если это поле кодирует VT_LLOCAL, то в нем сбрасываются биты входящие в VT_VALMASK и VT_LVAL_TYPE и устанавливаются биты входящие VT_LOCAL и VT_LVAL static void gen_cast(CType *type) Если оле r последней SValue содержит биты VT_MUSTCAST, биты по этой маске сбрасываются, вызывается force_charshort_cast() Если поле t структуры CType связанной с последней SValue содержит биты входящие в VT_BITFIELD вызываетстя gv() В переменную dbt сохраняются биты переданного CType кодирующие простые типы, бит знака срасывается. В переменную sbt сохраняются биты CType связанной с последней SValue кодирующие простые типы, бит знака сбрабсывается. Если полученные значения не равны и флаг nocode_wanted сброшен, происходит следующая обработка: sbt проверяется функцией is_float(). Результат проверки записывается в переменную df. dbt проверяется функцией is_float(). Результат проверки записывается в переменную sf. В переменную c записывается результат проверки кодирует ли поле r последней SValue значение VT_CONST. Если sf и df содержат ненулевые значения, происходит следующая обработка: Если c содержит ненулевое значение, происходит побработака dbt и sbt Если первое значение кодирует VT_FLOAT, а второе VT_DOUBLE, в поле f структуры СValue последней SValue записывается значение поля d той же СValue. Перед значение приводится к типу |