about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-09-04 11:16:04 +0200
committerGitHub <noreply@github.com>2023-09-04 11:16:04 +0200
commit2c7daa388be8448b3230555310f6e7977a019441 (patch)
tree33ed1dd78c2790bd5068110da8d40fe1f5bd143c /src
parent96025a19771dafc7d17d5f22207f64fde957930e (diff)
parentcc351402a1ec73c4e839d4236f41d7dd7d52f749 (diff)
downloadbox64-2c7daa388be8448b3230555310f6e7977a019441.tar.gz
box64-2c7daa388be8448b3230555310f6e7977a019441.zip
Merge pull request #964 from wannacu/main
[ARM64_DYNAREC] Added some opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c54
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c45
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f20f.c17
3 files changed, 69 insertions, 47 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index d5417113..2754c1de 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -538,7 +538,27 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     GETEM(q1, 0);

                     SQRDMULH_16(q0, q0, q1);

                     break;

-

+                case 0x1C:

+                    INST_NAME("PABSB Gm,Em");

+                    nextop = F8;

+                    GETGM(q0);

+                    GETEM(q1, 0);

+                    ABS_8(q0, q1);

+                    break;

+                case 0x1D:

+                    INST_NAME("PABSW Gm,Em");

+                    nextop = F8;

+                    GETGM(q0);

+                    GETEM(q1, 0);

+                    ABS_16(q0, q1);

+                    break;

+                case 0x1E:

+                    INST_NAME("PABSD Gm,Em");

+                    nextop = F8;

+                    GETGM(q0);

+                    GETEM(q1, 0);

+                    ABS_32(q0, q1);

+                    break;

                 case 0xF0:

                     INST_NAME("MOVBE Gd, Ed");

                     nextop=F8;

@@ -950,33 +970,17 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         VMOVeS(v0, 1, v1, 0);

                     }

                 } else if(u8==0x00) {

-                    // dumplicate lower 16bits to all spot

-                    if(v0!=v1) {

-                        VMOVeH(v0, 0, v1, 0);

-                    }

-                    VMOVeH(v0, 1, v1, 0);

-                    VMOVeS(v0, 1, v1, 0);

+                    // duplicate lower 16bits to all spot

+                    VDUP_16(v0, v1, 0);

                 } else if(u8==0x55) {

-                    // dumplicate 16bits slot 1 to all spot

-                    if(v0!=v1) {

-                        VMOVeH(v0, 1, v1, 1);

-                    }

-                    VMOVeH(v0, 0, v1, 1);

-                    VMOVeS(v0, 1, v1, 0);

+                    // duplicate 16bits slot 1 to all spot

+                    VDUP_16(v0, v1, 1);

                 } else if(u8==0xAA) {

-                    // dumplicate 16bits slot 2 to all spot

-                    if(v0!=v1) {

-                        VMOVeH(v0, 2, v1, 2);

-                    }

-                    VMOVeH(v0, 3, v1, 2);

-                    VMOVeS(v0, 0, v1, 1);

+                    // duplicate 16bits slot 2 to all spot

+                    VDUP_16(v0, v1, 2);

                 } else if(u8==0xFF) {

-                    // dumplicate 16bits slot 3 to all spot

-                    if(v0!=v1) {

-                        VMOVeH(v0, 3, v1, 3);

-                    }

-                    VMOVeH(v0, 2, v1, 3);

-                    VMOVeS(v0, 0, v1, 1);

+                    // duplicate 16bits slot 3 to all spot

+                    VDUP_16(v0, v1, 3);

                 } else if(v0!=v1) {

                     VMOVeH(v0, 0, v1, (u8>>(0*2))&3);

                     VMOVeH(v0, 1, v1, (u8>>(1*2))&3);

diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 85699ba6..2d80e68d 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -1570,32 +1570,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     }

                 } else if(u8==0x00) {

                     // duplicate lower 32bits to all spot

-                    if(v0!=v1) {

-                        VMOVeS(v0, 0, v1, 0);

-                    }

-                    VMOVeS(v0, 1, v1, 0);

-                    VMOVeD(v0, 1, v0, 0);

+                    VDUPQ_32(v0, v1, 0);

                 } else if(u8==0x55) {

                     // duplicate slot 1 to all spot

-                    if(v0!=v1) {

-                        VMOVeS(v0, 1, v1, 1);

-                    }

-                    VMOVeS(v0, 0, v1, 1);

-                    VMOVeD(v0, 1, v0, 0);

+                    VDUPQ_32(v0, v1, 1);

                 } else if(u8==0xAA) {

                     // duplicate slot 2 to all spot

-                    if(v0!=v1) {

-                        VMOVeS(v0, 2, v1, 2);

-                    }

-                    VMOVeS(v0, 3, v1, 2);

-                    VMOVeD(v0, 0, v0, 1);

+                    VDUPQ_32(v0, v1, 2);

                 } else if(u8==0xFF) {

                     // duplicate slot 3 to all spot

-                    if(v0!=v1) {

-                        VMOVeS(v0, 3, v1, 3);

-                    }

-                    VMOVeS(v0, 2, v1, 3);

-                    VMOVeD(v0, 0, v0, 1);

+                    VDUPQ_32(v0, v1, 3);

                 } else if(v0!=v1) {

                     VMOVeS(v0, 0, v1, (u8>>(0*2))&3);

                     VMOVeS(v0, 1, v1, (u8>>(1*2))&3);

@@ -1836,7 +1820,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 VORRQ(q1, q1, v1);      // NAN -> -NAN

             }

             break;

-

+        case 0x7D:

+            INST_NAME("HSUBPD Gx, Ex");  // SSE4 opcode!

+            nextop = F8;

+            GETEX(q1, 0, 0);

+            GETGX(q0, 1);

+            v0 = fpu_get_scratch(dyn);

+            VUZP1Q_64(v0, q0, q1);

+            VUZP2Q_64(q0, q0, q1);

+            VFSUBQD(q0, v0, q0);

+            break;

         case 0x7E:

             INST_NAME("MOVD Ed,Gx");

             nextop = F8;

@@ -2306,6 +2299,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             VDUPQ_16(v0, v0, 0);    // only the low 8bits will be used anyway

             USHLQ_16(q0, q0, v0);   // SHR x8

             break;

+        case 0xD0:

+            INST_NAME("ADDSUBPD Gx,Ex");

+            nextop = F8;

+            GETGX(q0, 1);

+            GETEX(q1, 0, 0);

+            v0 = fpu_get_scratch(dyn);

+            VFSUBQD(v0, q0, q1);

+            VFADDQD(q0, q0, q1);

+            VMOVeD(q0, 0, v0, 0);

+            break;

         case 0xD2:

             INST_NAME("PSRLD Gx,Ex");

             nextop = F8;

diff --git a/src/dynarec/arm64/dynarec_arm64_f20f.c b/src/dynarec/arm64/dynarec_arm64_f20f.c
index c2d8a46e..99edd187 100644
--- a/src/dynarec/arm64/dynarec_arm64_f20f.c
+++ b/src/dynarec/arm64/dynarec_arm64_f20f.c
@@ -376,7 +376,22 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             }

             VFADDPQS(v0, v0, v1);

             break;

-            

+        case 0x7D:

+            INST_NAME("HSUBPS Gx, Ex");

+            nextop = F8;

+            GETGX(v0, 1);

+            if(MODREG) {

+                v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);

+            } else {

+                addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);

+                v1 = fpu_get_scratch(dyn);

+                VLD128(v1, ed, fixedaddress);

+            }

+            d0 = fpu_get_scratch(dyn);

+            VUZP1Q_32(d0, v0, v1);

+            VUZP2Q_32(v0, v0, v1);

+            VFSUBQS(v0, d0, v0);

+            break;

         case 0xC2:

             INST_NAME("CMPSD Gx, Ex, Ib");

             nextop = F8;