diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_00.c | 8 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_66.c | 24 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_660f.c | 58 |
3 files changed, 90 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c index 925959f0..e27f2acf 100644 --- a/src/dynarec/la64/dynarec_la64_00.c +++ b/src/dynarec/la64/dynarec_la64_00.c @@ -1674,6 +1674,14 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni WBACK; if (!wback && !rex.w) ZEROUP(ed); break; + case 1: + INST_NAME("ROR Ed, 1"); + SETFLAGS(X_OF | X_CF, SF_SUBSET_PENDING); + GETED(0); + emit_ror32c(dyn, ninst, rex, ed, 1, x3, x4); + WBACK; + if (!wback && !rex.w) ZEROUP(ed); + break; case 4: case 6: INST_NAME("SHL Ed, 1"); diff --git a/src/dynarec/la64/dynarec_la64_66.c b/src/dynarec/la64/dynarec_la64_66.c index b5e594a1..6432dc0e 100644 --- a/src/dynarec/la64/dynarec_la64_66.c +++ b/src/dynarec/la64/dynarec_la64_66.c @@ -687,6 +687,30 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni emit_neg16(dyn, ninst, ed, x2, x4); EWBACK; break; + case 7: + INST_NAME("IDIV Ew"); + NOTEST(x1); + SETFLAGS(X_ALL, SF_SET); + SET_DFNONE(); + GETSEW(x1, 0); + if (box64_dynarec_div0) { + BNE_MARK3(ed, xZR); + GETIP_(ip); + STORE_XEMU_CALL(); + CALL(native_div0, -1); + CLEARIP(); + LOAD_XEMU_CALL(); + jump_to_epilog(dyn, 0, xRIP, ninst); + MARK3; + } + BSTRPICK_D(x2, xRAX, 15, 0); + SLLI_D(x3, xRDX, 16); + OR(x2, x2, x3); + DIV_W(x3, x2, ed); + MOD_W(x4, x2, ed); + BSTRINS_D(xRAX, x3, 15, 0); + BSTRINS_D(xRAX, x4, 15, 0); + break; default: DEFAULT; } diff --git a/src/dynarec/la64/dynarec_la64_660f.c b/src/dynarec/la64/dynarec_la64_660f.c index 16b5cb9e..5ced23af 100644 --- a/src/dynarec/la64/dynarec_la64_660f.c +++ b/src/dynarec/la64/dynarec_la64_660f.c @@ -798,6 +798,20 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int DEFAULT; } break; + case 0x74: + INST_NAME("PCMPEQB Gx,Ex"); + nextop = F8; + GETGX(v0, 1); + GETEX(q0, 0, 0); + VSEQ_B(v0, v0, q0); + break; + case 0x75: + INST_NAME("PCMPEQW Gx,Ex"); + nextop = F8; + GETGX(v0, 1); + GETEX(q0, 0, 0); + VSEQ_H(v0, v0, q0); + break; case 0x76: INST_NAME("PCMPEQD Gx,Ex"); nextop = F8; @@ -882,6 +896,50 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int } BSTRINS_D(gd, x1, 15, 0); break; + case 0xC4: + INST_NAME("PINSRW Gx, Ed, Ib"); + nextop = F8; + GETGX(v0, 1); + if (MODREG) { + u8 = (F8) & 7; + ed = TO_LA64((nextop & 7) + (rex.b << 3)); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x4, &fixedaddress, rex, NULL, 1, 1); + u8 = (F8) & 7; + ed = x3; + LD_HU(ed, wback, fixedaddress); + } + d0 = fpu_get_scratch(dyn); + MOVGR2FR_D(d0, ed); + VEXTRINS_H(v0, d0, (u8 << 4)); + break; + case 0xC5: + INST_NAME("PEXTRW Gd, Ex, Ib"); + nextop = F8; + GETGD; + if (MODREG) { + GETEX(v0, 0, 1); + u8 = (F8) & 7; + v1 = fpu_get_scratch(dyn); + VBSRL_V(v1, v0, (u8 << 1)); + MOVFR2GR_D(gd, v1); + BSTRPICK_D(gd, gd, 15, 0); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x4, &fixedaddress, rex, NULL, 1, 1); + u8 = (F8) & 7; + LD_HU(gd, wback, (u8 << 1)); + } + break; + case 0xC6: + INST_NAME("SHUFPD Gx, Ex, Ib"); + nextop = F8; + GETGX(v0, 1); + GETEX(v1, 0, 1); + u8 = F8; + VSHUF4I_D(v0, v1, (u8 & 1) | ((u8 & 2) << 1)); + break; case 0xD4: INST_NAME("PADDQ Gx, Ex"); nextop = F8; |