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


Reply via email to