diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_660f.c | 24 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 12 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c index 9d575f94..c35f0224 100755 --- a/src/dynarec/dynarec_arm64_660f.c +++ b/src/dynarec/dynarec_arm64_660f.c @@ -119,6 +119,30 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VLD1_64(v0, 1, ed); } break; + case 0x16: + INST_NAME("MOVHPD Gx, Eq"); + nextop = F8; + GETGX(v0); + if(MODREG) { + // access register instead of memory is bad opcode! + DEFAULT; + return addr; + } + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, 0, 0); + VLD1_64(v0, 1, ed); + break; + case 0x17: + INST_NAME("MOVHPD Eq, Gx"); + nextop = F8; + GETGX(v0); + if(MODREG) { + // access register instead of memory is bad opcode! + DEFAULT; + return addr; + } + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, 0, 0); + VST1_64(v0, 1, ed); + break; case 0x1F: INST_NAME("NOP (multibyte)"); diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index abcf0253..0f7c0f80 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -78,6 +78,18 @@ int Run660F(x64emu_t *emu, rex_t rex) GX->q[0] = GX->q[1]; GX->q[1] = EX->q[1]; break; + case 0x16: /* MOVHPD Gx, Ed */ + nextop = F8; + GETED(0); + GETGX; + GX->q[1] = ED->q[0]; + break; + case 0x17: /* MOVHPD Ed, Gx */ + nextop = F8; + GETED(0); + GETGX; + ED->q[0] = GX->q[1]; + break; case 0x1F: /* NOP (multi-byte) */ nextop = F8; |