about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-07-04 18:39:57 +0800
committerGitHub <noreply@github.com>2024-07-04 12:39:57 +0200
commit84b0e2f113a36fb364a7389eb03b08d99d61f3d1 (patch)
treecff57346ee6bdd5c03aea567c085db4c83c1fea9 /src
parenteb695d5553e82dce46d67019f48a3354ec611394 (diff)
downloadbox64-84b0e2f113a36fb364a7389eb03b08d99d61f3d1.tar.gz
box64-84b0e2f113a36fb364a7389eb03b08d99d61f3d1.zip
[LA64_DYNAREC] Fixed F2 0F 70 PSHUFLW opcode (#1634)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_f20f.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/dynarec/la64/dynarec_la64_f20f.c b/src/dynarec/la64/dynarec_la64_f20f.c
index 133b8a2b..ab6bcc1f 100644
--- a/src/dynarec/la64/dynarec_la64_f20f.c
+++ b/src/dynarec/la64/dynarec_la64_f20f.c
@@ -279,7 +279,14 @@ uintptr_t dynarec64_F20F(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);
+            if (v0 != v1) {
+                VSHUF4I_H(v0, v1, u8);
+                VEXTRINS_D(v0, v1, 0x11); // v0[127:64] = v1[127:64]
+            } else {
+                q0 = fpu_get_scratch(dyn);
+                VSHUF4I_H(q0, v1, u8);
+                VEXTRINS_D(v0, q0, 0x0); // v0[63:0] = q0[63:0]
+            }
             break;
         case 0xC2:
             INST_NAME("CMPSD Gx, Ex, Ib");