diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-23 12:34:37 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-23 13:35:21 +0100 |
| commit | 2accb00adc4a6d0c87737d7ca0c3b3fb9f661825 (patch) | |
| tree | bd08b0bb846b4735a78f5cf0040a0573a7714d14 /src | |
| parent | 65c672fa1c70e62562a219cc2e0e53bba67ba627 (diff) | |
| download | box64-2accb00adc4a6d0c87737d7ca0c3b3fb9f661825.tar.gz box64-2accb00adc4a6d0c87737d7ca0c3b3fb9f661825.zip | |
Added/Fixed 66 0F 3A 14/15/16 opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_660f.c | 51 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 25 |
2 files changed, 66 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 6d6e26e6..73669980 100755 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -730,16 +730,57 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n } break; + case 0x14: + INST_NAME("PEXTRB Ed, Gx, Ib"); + nextop = F8; + GETGX(q0, 0); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + u8 = F8; + VMOVBto(ed, q0, (u8&15)); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1); + u8 = F8; + VST1_8(q0, (u8&15), wback); + SMWRITE2(); + } + break; + case 0x15: + INST_NAME("PEXTRW Ed, Gx, Ib"); + nextop = F8; + GETGX(q0, 0); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + u8 = F8; + VMOVHto(ed, q0, (u8&7)); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1); + u8 = F8; + VST1_16(q0, (u8&7), wback); + SMWRITE2(); + } + break; case 0x16: if(rex.w) {INST_NAME("PEXTRQ Ed, Gx, Ib");} else {INST_NAME("PEXTRD Ed, Gx, Ib");} nextop = F8; GETGX(q0, 0); - GETED(1); - u8 = F8; - if(rex.w) { - VMOVQDto(ed, q0, (u8&1)); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + u8 = F8; + if(rex.w) { + VMOVQDto(ed, q0, (u8&1)); + } else { + VMOVSto(ed, q0, (u8&3)); + } } else { - VMOVSto(ed, q0, (u8&3)); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1); + u8 = F8; + if(rex.w) { + VST1_64(q0, (u8&1), wback); + } else { + VST1_32(q0, (u8&3), wback); + } + SMWRITE2(); } break; diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index 8bed5cbf..e06c3fb5 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -767,14 +767,26 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) } break; - case 0x14: // PEXTRB EB, GX, u8 + case 0x14: // PEXTRB ED, GX, u8 nextop = F8; - GETEB(1); + GETED(1); GETGX; tmp8u = F8; - EB->byte[0] = GX->ub[tmp8u&0x0f]; + if(MODREG) + ED->q[0] = GX->ub[tmp8u&0x0f]; + else + ED->byte[0] = GX->ub[tmp8u&0x0f]; + break; + case 0x15: // PEXTRW Ew,Gx,Ib + nextop = F8; + GETED(1); + GETGX; + tmp8u = F8; + if(MODREG) + ED->q[0] = GX->uw[tmp8u&7]; // 16bits extract, 0 extended + else + ED->word[0] = GX->uw[tmp8u&7]; break; - case 0x16: // PEXTRD/Q ED, GX, u8 nextop = F8; GETED(1); @@ -783,7 +795,10 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) if(rex.w) { ED->q[0] = GX->q[tmp8u&1]; } else { - ED->q[0] = GX->ud[tmp8u&3]; + if(MODREG) + ED->q[0] = GX->ud[tmp8u&3]; + else + ED->dword[0] = GX->ud[tmp8u&3]; } break; case 0x17: // EXTRACTPS ED, GX, u8 |