diff options
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 |