The memory-pointer operand decodes the indirect form of ModR/M byte, loads the effective address into a register and passes that register as the operand.
Note: This operand has a known flaw: if an instruction is writing to memory (rather than reading), this operand cannot and will not load the effective address into the register (as it should). The current workaround is to declare the memory operand as read (rather than write); this flaw will be addressed in the next iteration. Signed-off-by: Jan Bobek <jan.bo...@gmail.com> --- target/i386/translate.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/target/i386/translate.c b/target/i386/translate.c index b8e6eaebb4..301dc4eddf 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -4705,6 +4705,31 @@ INSNOP(Ib, int8_t, \ (*op = x86_ldub_code(env, s)), \ INSNOP_FINALIZE_INVALID) +/* + * Memory-pointer operand + */ +INSNOP( + M, TCGv, + do { + if (decode_modrm_mod(env, s, modrm) == 3) { + INSNOP_INIT_FAIL; + } else { + INSNOP_INIT_OK(s->A0); + } + } while (0), + do { + assert(*op == s->A0); + gen_lea_modrm(env, s, modrm); + } while (0), + INSNOP_FINALIZE_NOOP) + +INSNOP_ALIAS(Mb, M) +INSNOP_ALIAS(Mw, M) +INSNOP_ALIAS(Mq, M) +INSNOP_ALIAS(Md, M) +INSNOP_ALIAS(Mdq, M) +INSNOP_ALIAS(Mqq, M) + /* * Code generators */ -- 2.20.1