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 --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,
--
2.20.1