1690 |
gen_op_mov_reg_T1[OT_WORD + s->dflag][R_ESP](); |
gen_op_mov_reg_T1[OT_WORD + s->dflag][R_ESP](); |
1691 |
} |
} |
1692 |
|
|
|
/* NOTE: wrap around in 16 bit not fully handled */ |
|
|
/* XXX: check this */ |
|
1693 |
static void gen_enter(DisasContext *s, int esp_addend, int level) |
static void gen_enter(DisasContext *s, int esp_addend, int level) |
1694 |
{ |
{ |
1695 |
int ot, level1, addend, opsize; |
int ot, opsize; |
1696 |
|
|
1697 |
ot = s->dflag + OT_WORD; |
ot = s->dflag + OT_WORD; |
1698 |
level &= 0x1f; |
level &= 0x1f; |
|
level1 = level; |
|
1699 |
opsize = 2 << s->dflag; |
opsize = 2 << s->dflag; |
1700 |
|
|
1701 |
gen_op_movl_A0_ESP(); |
gen_op_movl_A0_ESP(); |
1709 |
gen_op_mov_TN_reg[OT_LONG][0][R_EBP](); |
gen_op_mov_TN_reg[OT_LONG][0][R_EBP](); |
1710 |
gen_op_st_T0_A0[ot + s->mem_index](); |
gen_op_st_T0_A0[ot + s->mem_index](); |
1711 |
if (level) { |
if (level) { |
1712 |
while (level--) { |
gen_op_enter_level(level, s->dflag); |
|
gen_op_addl_A0_im(-opsize); |
|
|
gen_op_addl_T0_im(-opsize); |
|
|
gen_op_st_T0_A0[ot + s->mem_index](); |
|
|
} |
|
|
gen_op_addl_A0_im(-opsize); |
|
|
gen_op_st_T1_A0[ot + s->mem_index](); |
|
1713 |
} |
} |
1714 |
gen_op_mov_reg_T1[ot][R_EBP](); |
gen_op_mov_reg_T1[ot][R_EBP](); |
1715 |
addend = -esp_addend; |
gen_op_addl_T1_im( -esp_addend + (-opsize * level) ); |
|
if (level1) |
|
|
addend -= opsize * (level1 + 1); |
|
|
gen_op_addl_T1_im(addend); |
|
1716 |
gen_op_mov_reg_T1[ot][R_ESP](); |
gen_op_mov_reg_T1[ot][R_ESP](); |
1717 |
} |
} |
1718 |
|
|