Many operands can only decode successfully if the ModR/M byte has the direct form (i.e. MOD=3). Capture this common aspect by introducing a special operand-initialization statement wrapper.
Signed-off-by: Jan Bobek <jan.bo...@gmail.com> --- target/i386/translate.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/target/i386/translate.c b/target/i386/translate.c index 4a2dae6238..0bee7288e6 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -4601,6 +4601,15 @@ static int ck_cpuid(CPUX86State *env, DisasContext *s, int ck_cpuid_feat) #define INSNOP_FINALIZE_NOOP /* no-op */ #define INSNOP_FINALIZE_INVALID g_assert_not_reached() +#define INSNOP_INIT_DIRECT_ONLY(init_stmt) \ + do { \ + if (decode_modrm_mod(env, s, modrm) == 3) { \ + init_stmt; \ + } else { \ + INSNOP_INIT_FAIL; \ + } \ + } while (0) + static void gen_sse_ng(CPUX86State *env, DisasContext *s, int b) { enum { -- 2.20.1