diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_660f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_f30f.c | 10 |
2 files changed, 9 insertions, 3 deletions
diff --git a/src/dynarec/la64/dynarec_la64_660f.c b/src/dynarec/la64/dynarec_la64_660f.c index 55134eb5..16b5cb9e 100644 --- a/src/dynarec/la64/dynarec_la64_660f.c +++ b/src/dynarec/la64/dynarec_la64_660f.c @@ -926,7 +926,7 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int v0 = fpu_get_scratch(dyn); VMSKLTZ_B(v0, q0); MOVFR2GR_D(x1, v0); - BSTRINS_D(gd, x1, 15, 0); + BSTRPICK_D(gd, x1, 15, 0); break; case 0xDB: INST_NAME("PAND Gx,Ex"); diff --git a/src/dynarec/la64/dynarec_la64_f30f.c b/src/dynarec/la64/dynarec_la64_f30f.c index e340474e..8aa54ecf 100644 --- a/src/dynarec/la64/dynarec_la64_f30f.c +++ b/src/dynarec/la64/dynarec_la64_f30f.c @@ -254,8 +254,14 @@ uintptr_t dynarec64_F30F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(v1, 0, 1); GETGX(v0, 1); u8 = F8; - VSHUF4I_H(v0, v1, u8); - VEXTRINS_D(v0, v1, 0); // v0[63:0] = v1[63:0] + if (v0 == v1) { + q0 = fpu_get_scratch(dyn); + VSHUF4I_H(q0, v1, u8); + VEXTRINS_D(v0, q0, 0x11); // v0[127:64] = q0[127:64] + } else { + VSHUF4I_H(v0, v1, u8); + VEXTRINS_D(v0, v1, 0); // v0[63:0] = v1[63:0] + } break; case 0x7E: INST_NAME("MOVQ Gx, Ex"); |