[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 49/60] target-i386: Rewrite leave
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 49/60] target-i386: Rewrite leave |
Date: |
Fri, 29 Nov 2013 16:00:36 +1300 |
Unify the code across stack pointer widths. Fix the note about
not updating ESP before the potential exception.
Signed-off-by: Richard Henderson <address@hidden>
---
target-i386/translate.c | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/target-i386/translate.c b/target-i386/translate.c
index c5bbb5d..53e3103 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -2394,6 +2394,20 @@ static void gen_enter(DisasContext *s, int esp_addend,
int level)
gen_op_mov_reg_v(a_ot, R_ESP, cpu_T[1]);
}
+static void gen_leave(DisasContext *s)
+{
+ TCGMemOp d_ot = mo_pushpop(s, s->dflag);
+ TCGMemOp a_ot = mo_stacksize(s);
+
+ gen_lea_v_seg(s, a_ot, cpu_regs[R_EBP], R_SS, -1);
+ gen_op_ld_v(s, d_ot, cpu_T[0], cpu_A0);
+
+ tcg_gen_addi_tl(cpu_T[1], cpu_regs[R_EBP], 1 << d_ot);
+
+ gen_op_mov_reg_v(d_ot, R_EBP, cpu_T[0]);
+ gen_op_mov_reg_v(a_ot, R_ESP, cpu_T[1]);
+}
+
static void gen_exception(DisasContext *s, int trapno, target_ulong cur_eip)
{
gen_update_cc_op(s);
@@ -5139,20 +5153,7 @@ static target_ulong disas_insn(CPUX86State *env,
DisasContext *s,
}
break;
case 0xc9: /* leave */
- /* XXX: exception not precise (ESP is updated before potential
exception) */
- if (CODE64(s)) {
- gen_op_mov_TN_reg(MO_64, 0, R_EBP);
- gen_op_mov_reg_T0(MO_64, R_ESP);
- } else if (s->ss32) {
- gen_op_mov_TN_reg(MO_32, 0, R_EBP);
- gen_op_mov_reg_T0(MO_32, R_ESP);
- } else {
- gen_op_mov_TN_reg(MO_16, 0, R_EBP);
- gen_op_mov_reg_T0(MO_16, R_ESP);
- }
- ot = gen_pop_T0(s);
- gen_op_mov_reg_T0(ot, R_EBP);
- gen_pop_update(s, ot);
+ gen_leave(s);
break;
case 0x06: /* push es */
case 0x0e: /* push cs */
--
1.8.3.1
- [Qemu-devel] [PATCH v2 36/60] target-i386: Change gen_op_mov_reg_A0 size parameter to TCGMemOp, (continued)
- [Qemu-devel] [PATCH v2 36/60] target-i386: Change gen_op_mov_reg_A0 size parameter to TCGMemOp, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 37/60] target-i386: Change dflag to TCGMemOp, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 38/60] target-i386: Tidy addr16 code in gen_lea_modrm, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 39/60] target-i386: Combine gen_push_T* into gen_push_v, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 40/60] target_i386: Clean up gen_pop_T0, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 41/60] target-i386: Create gen_lea_v_seg, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 42/60] target-i386: Use gen_lea_v_seg in gen_lea_modrm, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 43/60] target-i386: Use gen_lea_v_seg in stack subroutines, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 44/60] target-i386: Tidy cpu_regs initialization, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 48/60] target-i386: Introduce mo_stacksize, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 49/60] target-i386: Rewrite leave,
Richard Henderson <=
- [Qemu-devel] [PATCH v2 50/60] target-i386: Remove gen_op_mov_reg_T0, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 51/60] target-i386: Remove gen_op_mov_reg_T1, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 52/60] target-i386: Remove gen_op_addl_T0_T1, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 53/60] target-i386: Remove gen_op_mov_TN_reg, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 54/60] target-i386: Remove gen_op_mov_reg_A0, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 55/60] target-i386: Remove gen_op_movl_A0_reg, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 56/60] target-i386: Tidy gen_add_A0_im, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 57/60] target-i386: Tidy some size computation, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 58/60] target-i386: Rename gen_op_jmp_T0 to gen_op_jmp_v, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 59/60] target-i386: Tidy ljmp, Richard Henderson, 2013/11/28