In order to decode 0F38/0F3A-prefixed instructions, we need to load an
additional byte. This poses a problem if the instruction is not
implemented yet; implement a rewind in this (default) case.
Signed-off-by: Jan Bobek <jan.bobek@gmail.com>
---
target/i386/translate.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/target/i386/translate.c b/target/i386/translate.c
index 661010973b..bd9c62dc54 100644
--- a/target/i386/translate.c
+++ b/target/i386/translate.c
@@ -4545,7 +4545,23 @@ static void gen_sse_ng(CPUX86State *env, DisasContext *s, int b)
#define CASES_VEX_LIG(e, N, ...) CASES_VEX_L128(e, N, ## __VA_ARGS__) \
CASES_VEX_L256(e, N, ## __VA_ARGS__)
+ CASES(0x38, 3, W, IG, M, 0F, P, IG)
+ CASES(0x38, 4, W, IG, M, 0F, P, IG, VEX_L, IG) {
+ m = M_0F38;
+ op = x86_ldub_code(env, s);
+ } break;
+
+ CASES(0x3a, 3, W, IG, M, 0F, P, IG)
+ CASES(0x3a, 4, W, IG, M, 0F, P, IG, VEX_L, IG) {
+ m = M_0F3A;
+ op = x86_ldub_code(env, s);
+ } break;
+
default: {
+ if (m == M_0F38 || m == M_0F3A) {
+ /* rewind the advance_pc() x86_ldub_code() did */
+ advance_pc(env, s, -1);
+ }
gen_sse(env, s, b);
} return;
--
2.20.1