1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
/*
E T O C . C
Convert expression to pure code
*/
#include "iccomp.h"
void etoc(e)
ESTRUC_
*e;
{
ESTRUC_
pre;
switch
(
test_type
(
e,
e_const | e_var | e_bool | e_reg |
e_pre_inc_dec | e_post_inc_dec
)
)
{
case e_const:
gencode(e,
test_type(e, e_int) ?
op_push_imm
:
op_push_strconst,
e->evalue);
break;
case e_var:
if (!e->codelen)
gencode(e, op_push_var, e->evalue);
break;
case e_bool:
patchup_true(e, 1);
gencode(e, op_push_1_jmp_end);
patchup_false(e, 1);
gencode(e, op_push_0);
set_type(e, e_int);
break;
case e_reg:
gencode(e, op_push_reg);
break;
case e_post_inc_dec:
pre = stackframe(0);
gencode(&pre, op_push_var, e->evalue);
*e = *catcode(&pre, e); /* prefix push before var++, var-- */
break;
case e_pre_inc_dec: /* append push after ++var, --var */
gencode(e, op_push_var, e->evalue);
break;
}
down_type(e, e_const | e_var | e_bool | e_reg |
e_pre_inc_dec | e_post_inc_dec);
up_type(e, e_code);
}
|