diff mbox series

[RFC,v2,17/39] target/i386: introduce helpers for decoding modrm fields

Message ID 20190810041255.6820-18-jan.bobek@gmail.com
State New
Headers show
Series rewrite MMX/SSE instruction translation | expand

Commit Message

Jan Bobek Aug. 10, 2019, 4:12 a.m. UTC
The old code uses bitshifts and bitwise-and all over the place for
decoding ModR/M fields. Avoid doing that by introducing proper
decoding macros.

Signed-off-by: Jan Bobek <jan.bobek@gmail.com>
---
 target/i386/translate.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
diff mbox series

Patch

diff --git a/target/i386/translate.c b/target/i386/translate.c
index 109e4922eb..4a2dae6238 100644
--- a/target/i386/translate.c
+++ b/target/i386/translate.c
@@ -4500,6 +4500,21 @@  static void gen_sse(CPUX86State *env, DisasContext *s, int b)
 #define tcg_gen_gvec_cmpgt(vece, dofs, aofs, bofs, oprsz, maxsz)        \
     tcg_gen_gvec_cmp(TCG_COND_GT, vece, dofs, aofs, bofs, oprsz, maxsz)
 
+#define decode_modrm_mod(env, s, modrm)         \
+    (((modrm) >> 6) & 3)
+
+#define decode_modrm_reg_norexr(env, s, modrm)  \
+    (((modrm) >> 3) & 7)
+#define decode_modrm_reg_rexr(env, s, modrm)    \
+    (decode_modrm_reg_norexr(env, s, modrm)     \
+     | REX_R(s))
+
+#define decode_modrm_rm_norexb(env, s, modrm)   \
+    ((modrm) & 7)
+#define decode_modrm_rm_rexb(env, s, modrm)     \
+    (decode_modrm_rm_norexb(env, s, modrm)      \
+     | REX_B(s))
+
 enum {
     CK_CPUID_MMX = 1,
     CK_CPUID_3DNOW,