[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 08/10] target-i386: Rewrite leave
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 08/10] target-i386: Rewrite leave |
Date: |
Thu, 17 Dec 2015 11:19:24 -0800 |
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 b6749ff..2be4ba8 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -2362,6 +2362,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);
@@ -5117,20 +5131,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_v_reg(MO_64, cpu_T[0], R_EBP);
- gen_op_mov_reg_v(MO_64, R_ESP, cpu_T[0]);
- } else if (s->ss32) {
- gen_op_mov_v_reg(MO_32, cpu_T[0], R_EBP);
- gen_op_mov_reg_v(MO_32, R_ESP, cpu_T[0]);
- } else {
- gen_op_mov_v_reg(MO_16, cpu_T[0], R_EBP);
- gen_op_mov_reg_v(MO_16, R_ESP, cpu_T[0]);
- }
- ot = gen_pop_T0(s);
- gen_op_mov_reg_v(ot, R_EBP, cpu_T[0]);
- gen_pop_update(s, ot);
+ gen_leave(s);
break;
case 0x06: /* push es */
case 0x0e: /* push cs */
--
2.5.0
- [Qemu-devel] [PATCH v2 00/10] target-i386 addressing cleanups, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 05/10] target-i386: Access segs via TCG registers, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 03/10] target-i386: Use gen_lea_v_seg in gen_lea_modrm, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 01/10] target-i386: Create gen_lea_v_seg, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 04/10] target-i386: Use gen_lea_v_seg in stack subroutines, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 02/10] target-i386: Introduce mo_stacksize, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 07/10] target-i386: Rewrite gen_enter inline, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 06/10] target-i386: Use gen_lea_v_seg in pusha/popa, Richard Henderson, 2015/12/17
- [Qemu-devel] [PATCH v2 08/10] target-i386: Rewrite leave,
Richard Henderson <=
- [Qemu-devel] [PATCH v2 09/10] target-i386: Tidy gen_add_A0_im, Richard Henderson, 2015/12/17