qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH v2 25/39] target/i386: introduce M* (memptr) ope


From: Jan Bobek
Subject: [Qemu-devel] [RFC PATCH v2 25/39] target/i386: introduce M* (memptr) operands
Date: Sat, 10 Aug 2019 00:12:41 -0400

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 <address@hidden>
---
 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

[Prev in Thread] Current Thread [Next in Thread]