diff options
Diffstat (limited to 'src/dynarec/arm64/dynarec_arm64_00.c')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 91e0159d..f09f0803 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -2206,7 +2206,19 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin STRH_U12(x1, xEmu, offsetof(x64emu_t, segs[_ES])); STRw_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_ES])); } else { - DEFAULT; + vex_t vex = {0}; + vex.rex = rex; + u8 = nextop; + vex.m = u8&0b00011111; + vex.rex.b = (u8&0b00100000)?0:1; + vex.rex.x = (u8&0b01000000)?0:1; + vex.rex.r = (u8&0b10000000)?0:1; + u8 = F8; + vex.p = u8&0b00000011; + vex.l = (u8>>2)&1; + vex.v = ((~u8)>>3)&0b1111; + vex.rex.w = (u8>>7)&1; + addr = dynarec64_AVX(dyn, addr, ip, ninst, vex, ok, need_epilog); } break; case 0xC5: @@ -2220,7 +2232,18 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin STRH_U12(x1, xEmu, offsetof(x64emu_t, segs[_DS])); STRw_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_DS])); } else { - DEFAULT; + vex_t vex = {0}; + vex.rex = rex; + u8 = nextop; + vex.p = u8&0b00000011; + vex.l = (u8>>2)&1; + vex.v = ((~u8)>>3)&0b1111; + vex.rex.r = (u8&0b10000000)?0:1; + vex.rex.b = 0; + vex.rex.x = 0; + vex.rex.w = 0; + vex.m = VEX_M_0F; + addr = dynarec64_AVX(dyn, addr, ip, ninst, vex, ok, need_epilog); } break; case 0xC6: |