[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 42/60] target-i386: Use gen_lea_v_seg in gen_lea_
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 42/60] target-i386: Use gen_lea_v_seg in gen_lea_modrm |
Date: |
Fri, 29 Nov 2013 16:00:29 +1300 |
Centralize handling of segment bases.
Signed-off-by: Richard Henderson <address@hidden>
---
target-i386/translate.c | 82 ++++++++++++++-----------------------------------
1 file changed, 23 insertions(+), 59 deletions(-)
diff --git a/target-i386/translate.c b/target-i386/translate.c
index 02b45ef..c655e65 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -1860,17 +1860,12 @@ static void gen_shifti(DisasContext *s1, int op,
TCGMemOp ot, int d, int c)
static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm)
{
target_long disp;
- int havesib;
- int base;
- int index;
- int scale;
- int mod, rm, code, override, must_add_seg;
+ int havesib, base, index, scale;
+ int mod, rm, code, def_seg, ovr_seg;
TCGv sum;
- override = s->override;
- must_add_seg = s->addseg;
- if (override >= 0)
- must_add_seg = 1;
+ def_seg = R_DS;
+ ovr_seg = s->override;
mod = (modrm >> 6) & 3;
rm = modrm & 7;
@@ -1940,61 +1935,34 @@ static void gen_lea_modrm(CPUX86State *env,
DisasContext *s, int modrm)
}
if (TCGV_IS_UNUSED(sum)) {
tcg_gen_movi_tl(cpu_A0, disp);
- } else {
+ sum = cpu_A0;
+ } else if (disp != 0) {
tcg_gen_addi_tl(cpu_A0, sum, disp);
+ sum = cpu_A0;
}
- if (must_add_seg) {
- if (override < 0) {
- if (base == R_EBP || base == R_ESP) {
- override = R_SS;
- } else {
- override = R_DS;
- }
- }
-
- tcg_gen_ld_tl(cpu_tmp0, cpu_env,
- offsetof(CPUX86State, segs[override].base));
- if (CODE64(s)) {
- if (s->aflag == MO_32) {
- tcg_gen_ext32u_tl(cpu_A0, cpu_A0);
- }
- tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0);
- return;
- }
-
- tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0);
- }
-
- if (s->aflag == MO_32) {
- tcg_gen_ext32u_tl(cpu_A0, cpu_A0);
+ if (base == R_EBP || base == R_ESP) {
+ def_seg = R_SS;
}
break;
case MO_16:
- switch (mod) {
- case 0:
+ sum = cpu_A0;
+ if (mod == 0) {
if (rm == 6) {
disp = cpu_lduw_code(env, s->pc);
s->pc += 2;
tcg_gen_movi_tl(cpu_A0, disp);
- rm = 0; /* avoid SS override */
- goto no_rm;
- } else {
- disp = 0;
+ break;
}
- break;
- case 1:
+ disp = 0;
+ } else if (mod == 1) {
disp = (int8_t)cpu_ldub_code(env, s->pc++);
- break;
- default:
- case 2:
+ } else {
disp = (int16_t)cpu_lduw_code(env, s->pc);
s->pc += 2;
- break;
}
- sum = cpu_A0;
switch (rm) {
case 0:
tcg_gen_add_tl(cpu_A0, cpu_regs[R_EBX], cpu_regs[R_ESI]);
@@ -2004,9 +1972,11 @@ static void gen_lea_modrm(CPUX86State *env, DisasContext
*s, int modrm)
break;
case 2:
tcg_gen_add_tl(cpu_A0, cpu_regs[R_EBP], cpu_regs[R_ESI]);
+ def_seg = R_SS;
break;
case 3:
tcg_gen_add_tl(cpu_A0, cpu_regs[R_EBP], cpu_regs[R_EDI]);
+ def_seg = R_SS;
break;
case 4:
sum = cpu_regs[R_ESI];
@@ -2016,30 +1986,24 @@ static void gen_lea_modrm(CPUX86State *env,
DisasContext *s, int modrm)
break;
case 6:
sum = cpu_regs[R_EBP];
+ def_seg = R_SS;
break;
default:
case 7:
sum = cpu_regs[R_EBX];
break;
}
- tcg_gen_addi_tl(cpu_A0, sum, disp);
- tcg_gen_ext16u_tl(cpu_A0, cpu_A0);
- no_rm:
- if (must_add_seg) {
- if (override < 0) {
- if (rm == 2 || rm == 3 || rm == 6) {
- override = R_SS;
- } else {
- override = R_DS;
- }
- }
- gen_op_addl_A0_seg(s, override);
+ if (disp != 0) {
+ tcg_gen_addi_tl(cpu_A0, sum, disp);
+ sum = cpu_A0;
}
break;
default:
tcg_abort();
}
+
+ gen_lea_v_seg(s, sum, def_seg, ovr_seg);
}
static void gen_nop_modrm(CPUX86State *env, DisasContext *s, int modrm)
--
1.8.3.1
- [Qemu-devel] [PATCH v2 30/60] target-i386: Remove gen_op_movl_T0_T1, (continued)
- [Qemu-devel] [PATCH v2 30/60] target-i386: Remove gen_op_movl_T0_T1, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 31/60] target-i386: Remove gen_op_andl_A0_ffff, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 32/60] target-i386: Use TCGMemOp for 'ot' variables, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 35/60] target-i386: Change aflag to TCGMemOp, Richard Henderson, 2013/11/28
- [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 <=
- [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 45/60] target-i386: Access segs via TCG registers, Richard Henderson, 2013/11/28
- [Qemu-devel] [PATCH v2 33/60] target-i386: Change gen_op_add_reg_* size parameter to TCGMemOp, 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, 2013/11/28
- [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