diff options
Diffstat (limited to 'src/dynarec/la64/dynarec_la64_660f.c')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_660f.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/dynarec/la64/dynarec_la64_660f.c b/src/dynarec/la64/dynarec_la64_660f.c index 5768cc62..6f2b2490 100644 --- a/src/dynarec/la64/dynarec_la64_660f.c +++ b/src/dynarec/la64/dynarec_la64_660f.c @@ -395,12 +395,35 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int nextop = F8; GETEX(v1, 0, 0); GETGX_empty(v0); - // TODO: is there any way to support !box64_dynarec_fastround? + // TODO: !box64_dynarec_fastround q0 = fpu_get_scratch(dyn); VFCVT_S_D(q0, v1, v1); VXOR_V(v0, v0, v0); VEXTRINS_D(v0, q0, 0); break; + case 0x5B: + INST_NAME("CVTPS2DQ Gx, Ex"); + nextop = F8; + GETEX(v1, 0, 0); + GETGX_empty(v0); + u8 = sse_setround(dyn, ninst, x6, x4); + VFTINT_W_S(v0, v1); + if (!box64_dynarec_fastround) { + q0 = fpu_get_scratch(dyn); + q1 = fpu_get_scratch(dyn); + d1 = fpu_get_scratch(dyn); + VFCMP_S(q0, v1, v1, cEQ); + VLDI(q1, 0b1001110000000); // broadcast 0x80000000 + VAND_V(v0, q0, v0); + VANDN_V(d1, q0, q1); + VOR_V(v0, v0, d1); + VSUBI_WU(d1, q1, 1); + VSEQ_W(q0, v0, d1); + VSRLI_W(q0, q0, 31); + VADD_W(v0, v0, q0); + } + x87_restoreround(dyn, ninst, u8); + break; case 0x5C: INST_NAME("SUBPD Gx, Ex"); nextop = F8; @@ -838,6 +861,13 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(q0, 0, 0); VAND_V(v0, v0, q0); break; + case 0xDC: + INST_NAME("PADDUSB Gx,Ex"); + nextop = F8; + GETGX(q0, 1); + GETEX(q1, 0, 0); + VSADD_BU(q0, q0, q1); + break; case 0xDF: INST_NAME("PANDN Gx,Ex"); nextop = F8; @@ -852,6 +882,18 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(v1, 0, 0); VMUH_HU(v0, v0, v1); break; + case 0xE7: + INST_NAME("MOVNTDQ Ex, Gx"); + nextop = F8; + GETGX(v0, 0); + if (MODREG) { + v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop & 7) + (rex.b << 3)); + VOR_V(v1, v0, v0); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x3, &fixedaddress, rex, NULL, 1, 0); + VST(v0, ed, fixedaddress); + } + break; case 0xEB: INST_NAME("POR Gx,Ex"); nextop = F8; |