diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_0f.c | 25 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 19 | ||||
| -rw-r--r-- | src/tools/my_cpuid.c | 1 |
3 files changed, 45 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index b1308b09..79578406 100755 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -400,6 +400,31 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQRDMULH_16(q0, q0, q1); break; + case 0xF0: + INST_NAME("MOVBE Gd, Ed"); + nextop=F8; + GETGD; + if(MODREG) { + REVxw(gd, xRAX+(nextop&7)+(rex.b<<3)); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 0); + LDRxw_U12(gd, ed, fixedaddress); + REVxw(gd, gd); + } + break; + case 0xF1: + INST_NAME("MOVBE Ed, Gd"); + nextop=F8; + GETGD; + if(MODREG) { // reg <= reg + REVxw(xRAX+(nextop&7)+(rex.b<<3), gd); + } else { // mem <= reg + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 0); + REVxw(x1, gd); + STRxw_U12(x1, ed, fixedaddress); + } + break; + default: DEFAULT; } diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index a75ffc26..5cde4f53 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -304,6 +304,25 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) } break; + case 0xF0: /* MOVBE Gd, Ed*/ + nextop = F8; + GETGD; + GETED(0); + if(rex.w) + GD->q[0] = __builtin_bswap64(ED->q[0]); + else + GD->q[0] = __builtin_bswap32(ED->dword[0]); + break; + case 0xF1: /* MOVBE Ed, Gd*/ + nextop = F8; + GETGD; + GETED(0); + if(rex.w) + ED->q[0] = __builtin_bswap64(GD->q[0]); + else + ED->q[0] = __builtin_bswap32(GD->dword[0]); + break; + default: return 0; } diff --git a/src/tools/my_cpuid.c b/src/tools/my_cpuid.c index 7ab19db0..7e330bec 100644 --- a/src/tools/my_cpuid.c +++ b/src/tools/my_cpuid.c @@ -65,6 +65,7 @@ void my_cpuid(x64emu_t* emu, uint32_t tmp32u) | 1<<9 // SSSE3 | 1<<12 // fma | 1<<13 // cx16 (cmpxchg16) + | 1<<22 // MOVBE | 1<<25 // aesni ; break; |