about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-03-27 22:43:02 +0800
committerGitHub <noreply@github.com>2025-03-27 15:43:02 +0100
commit30689882f0f1f02777306272a7652c057c4b9fdb (patch)
tree7cd36e1c9c9165d4b7d0bf13ccd44d21282f74a8 /src
parentd2e8ff5118706d5b20b10a2a6a60771f6d67ba13 (diff)
downloadbox64-30689882f0f1f02777306272a7652c057c4b9fdb.tar.gz
box64-30689882f0f1f02777306272a7652c057c4b9fdb.zip
[LA64_DYNAREC] Added more opcodes (#2473)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_660f.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_660f.c b/src/dynarec/la64/dynarec_la64_660f.c
index 4eb07fb8..d70f9b80 100644
--- a/src/dynarec/la64/dynarec_la64_660f.c
+++ b/src/dynarec/la64/dynarec_la64_660f.c
@@ -839,6 +839,53 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
                         VINSGR2VR_W(q0, ed, (u8 & 3));
                     }
                     break;
+                case 0x40:
+                    INST_NAME("DPPS Gx, Ex, Ib");
+                    nextop = F8;
+                    GETGX(q0, 1);
+                    GETEX(q1, 0, 1);
+                    u8 = F8;
+                    v0 = fpu_get_scratch(dyn);
+                    v1 = fpu_get_scratch(dyn);
+                    VXOR_V(v0, v0, v0);
+                    VXOR_V(v1, v1, v1);
+                    if(u8 & 0x10){
+                        VEXTRINS_W(v0, q0, 0x00);
+                        VEXTRINS_W(v1, q1, 0x00);
+                    }
+                    if(u8 & 0x20){
+                        VEXTRINS_W(v0, q0, 0x11);
+                        VEXTRINS_W(v1, q1, 0x11);
+                    }
+                    if(u8 & 0x40){
+                        VEXTRINS_W(v0, q0, 0x22);
+                        VEXTRINS_W(v1, q1, 0x22);
+                    }
+                    if(u8 & 0x80){
+                        VEXTRINS_W(v0, q0, 0x33);
+                        VEXTRINS_W(v1, q1, 0x33);
+                    }
+                    VFMUL_S(v0, v0, v1);
+                    VPACKOD_W(v1, v0, v0);
+                    VPACKEV_W(v0, v0, v0);
+                    VFADD_S(v0, v0, v1);
+                    VPACKOD_D(v1, v0, v0);
+                    VPACKEV_D(v0, v0, v0);
+                    VFADD_S(v0, v0, v1);
+                    VXOR_V(q0, q0, q0);
+                    if(u8 & 0x1){
+                        VEXTRINS_W(q0, v0, 0x00);
+                    }
+                    if(u8 & 0x2){
+                        VEXTRINS_W(q0, v0, 0x11);
+                    }
+                    if(u8 & 0x4){
+                        VEXTRINS_W(q0, v0, 0x22);
+                    }
+                    if(u8 & 0x8){
+                        VEXTRINS_W(q0, v0, 0x33);
+                    }
+                    break;
                 case 0x44:
                     INST_NAME("PCLMULQDQ Gx, Ex, Ib");
                     nextop = F8;
@@ -1512,6 +1559,30 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
             GETEX(q0, 0, 0);
             VSEQ_W(v0, v0, q0);
             break;
+        case 0x7C:
+            INST_NAME("HADDPD Gx, Ex");
+            nextop = F8;
+            GETGX(q1, 1);
+            GETEX(q0, 0, 0);
+            d0 = fpu_get_scratch(dyn);
+            VPICKEV_D(d0, q0, q1);
+            VPICKOD_D(q1, q0, q1);
+            if (!BOX64ENV(dynarec_fastnan)) {
+                v0 = fpu_get_scratch(dyn);
+                v1 = fpu_get_scratch(dyn);
+                VFCMP_D(v0, d0, q1, cUN);
+            }
+            VFADD_D(q1, d0, q1);
+            if (!BOX64ENV(dynarec_fastnan)) {
+                VFCMP_D(v1, q1, q1, cUN);
+                VANDN_V(v0, v0, v1);
+                VLDI(v1, 0b011111111000); // broadcast 0xFFFFFFFFFFFFFFF8
+                VSLLI_D(v1, v1, 48);
+                VAND_V(v1, v0, v1);
+                VANDN_V(v0, v0, q1);
+                VOR_V(q1, v0, v1);
+            }
+            break;
         case 0x7E:
             INST_NAME("MOVD Ed,Gx");
             nextop = F8;