These address the general-purpose register file. The corresponding 32-bit or 64-bit register is passed as the operand value.
Signed-off-by: Jan Bobek <jan.bo...@gmail.com> --- target/i386/translate.c | 78 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/target/i386/translate.c b/target/i386/translate.c index 2374876b38..779b692942 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -4933,6 +4933,84 @@ DEF_INSNOP_ALIAS(Mq, M) DEF_INSNOP_ALIAS(Mdq, M) DEF_INSNOP_ALIAS(Mqq, M) +/* + * 32-bit general register operands + */ +DEF_INSNOP_LDST(Gd, tcg_temp_i32, modrm_reg) +DEF_INSNOP_LDST(Rd, tcg_temp_i32, modrm_rm_direct) + +INSNOP_LDST(tcg_temp_i32, modrm_reg) +{ + assert(0 <= ptr && ptr < CPU_NB_REGS); + if (is_write) { + tcg_gen_extu_i32_tl(cpu_regs[ptr], arg); + } else { + tcg_gen_trunc_tl_i32(arg, cpu_regs[ptr]); + } +} +INSNOP_LDST(tcg_temp_i32, modrm_rm_direct) +{ + insnop_ldst(tcg_temp_i32, modrm_reg)(env, s, modrm, is_write, arg, ptr); +} + +DEF_INSNOP_LDST(MEd, tcg_temp_i32, Md) +DEF_INSNOP_EITHER(Ed, Rd, MEd) +DEF_INSNOP_LDST(MRdMw, tcg_temp_i32, Mw) +DEF_INSNOP_EITHER(RdMw, Rd, MRdMw) + +INSNOP_LDST(tcg_temp_i32, Md) +{ + if (is_write) { + tcg_gen_qemu_st_i32(arg, ptr, s->mem_index, MO_LEUL); + } else { + tcg_gen_qemu_ld_i32(arg, ptr, s->mem_index, MO_LEUL); + } +} +INSNOP_LDST(tcg_temp_i32, Mw) +{ + if (is_write) { + tcg_gen_qemu_st_i32(arg, ptr, s->mem_index, MO_LEUW); + } else { + tcg_gen_qemu_ld_i32(arg, ptr, s->mem_index, MO_LEUW); + } +} + +/* + * 64-bit general register operands + */ +DEF_INSNOP_LDST(Gq, tcg_temp_i64, modrm_reg) +DEF_INSNOP_LDST(Rq, tcg_temp_i64, modrm_rm_direct) + +INSNOP_LDST(tcg_temp_i64, modrm_reg) +{ +#ifdef TARGET_X86_64 + assert(0 <= ptr && ptr < CPU_NB_REGS); + if (is_write) { + tcg_gen_mov_i64(cpu_regs[ptr], arg); + } else { + tcg_gen_mov_i64(arg, cpu_regs[ptr]); + } +#else /* !TARGET_X86_64 */ + g_assert_not_reached(); +#endif /* !TARGET_X86_64 */ +} +INSNOP_LDST(tcg_temp_i64, modrm_rm_direct) +{ + insnop_ldst(tcg_temp_i64, modrm_reg)(env, s, modrm, is_write, arg, ptr); +} + +DEF_INSNOP_LDST(MEq, tcg_temp_i64, Mq) +DEF_INSNOP_EITHER(Eq, Rq, MEq) + +INSNOP_LDST(tcg_temp_i64, Mq) +{ + if (is_write) { + tcg_gen_qemu_st_i64(arg, ptr, s->mem_index, MO_LEQ); + } else { + tcg_gen_qemu_ld_i64(arg, ptr, s->mem_index, MO_LEQ); + } +} + static void gen_sse_ng(CPUX86State *env, DisasContext *s, int b) { enum { -- 2.20.1