about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_660f.c2
-rw-r--r--src/dynarec/la64/dynarec_la64_f30f.c10
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");