about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-27 19:39:01 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-27 19:39:01 +0200
commitbb7dfd395ff091ce81918cc8250874817c3ac1bc (patch)
tree4d3331048bc930af1271e918aedd0c4780e5e9ba
parentb552de33f98a573a1548372e970bf5c7a3bf1849 (diff)
downloadbox64-bb7dfd395ff091ce81918cc8250874817c3ac1bc.tar.gz
box64-bb7dfd395ff091ce81918cc8250874817c3ac1bc.zip
[ARM64_DYNAREC] Small optim for PSIGN[B/W/D] opcodes
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c30
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c30
2 files changed, 27 insertions, 33 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 5df3ba2d..2ea3cb71 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -640,11 +640,11 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     GETEM(q1, 0);

                     v0 = fpu_get_scratch(dyn, ninst);

                     v1 = fpu_get_scratch(dyn, ninst);

-                    CMGT_0_8(v0, q1);

-                    VAND(v0, v0, q0);

-                    CMLT_0_8(v1, q1);

-                    VMUL_8(q0, q0, v1);

-                    VORR(q0, q0, v0);

+                    NEG_8(v0, q0);     // get NEG

+                    CMLT_0_8(v1, q1);  // calculate mask

+                    VBIF(v0, q0, v1);  // put back positive values

+                    CMEQ_0_8(v1, q1);  // handle case where Ex is 0

+                    VBIC(q0, v0, v1);

                     break;

                 case 0x09:

                     INST_NAME("PSIGNW Gm,Em");

@@ -653,11 +653,11 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     GETEM(q1, 0);

                     v0 = fpu_get_scratch(dyn, ninst);

                     v1 = fpu_get_scratch(dyn, ninst);

-                    CMGT_0_16(v0, q1);

-                    VAND(v0, v0, q0);

-                    CMLT_0_16(v1, q1);

-                    VMUL_16(q0, q0, v1);

-                    VORR(q0, q0, v0);

+                    NEG_16(v0, q0);     // get NEG

+                    CMLT_0_16(v1, q1);  // calculate mask

+                    VBIF(v0, q0, v1);   // put back positive values

+                    CMEQ_0_16(v1, q1);  // handle case where Ex is 0

+                    VBIC(q0, v0, v1);

                     break;

                 case 0x0A:

                     INST_NAME("PSIGND Gm,Em");

@@ -666,11 +666,11 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     GETEM(q1, 0);

                     v0 = fpu_get_scratch(dyn, ninst);

                     v1 = fpu_get_scratch(dyn, ninst);

-                    CMGT_0_32(v0, q1);

-                    VAND(v0, v0, q0);

-                    CMLT_0_32(v1, q1);

-                    VMUL_32(q0, q0, v1);

-                    VORR(q0, q0, v0);

+                    NEG_32(v0, q0);     // get NEG

+                    CMLT_0_32(v1, q1);  // calculate mask

+                    VBIF(v0, q0, v1);   // put back positive values

+                    CMEQ_0_32(v1, q1);  // handle case where Ex is 0

+                    VBIC(q0, v0, v1);

                     break;

                 case 0x0B:

                     INST_NAME("PMULHRSW Gm,Em");

diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 40d9f7f3..ff7e2bd5 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -413,11 +413,9 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     v0 = fpu_get_scratch(dyn, ninst);

                     NEGQ_8(v0, q0);     // get NEG

                     CMLTQ_0_8(v1, q1);  // calculate mask

-                    VBICQ(q0, q0, v1);  // apply not mask on dest

-                    VANDQ(v0, v0, v1);  // apply mask on src

-                    VORRQ(q0, q0, v0);  // merge

+                    VBIFQ(v0, q0, v1);  // put back positive values

                     CMEQQ_0_8(v1, q1);  // handle case where Ex is 0

-                    VBICQ(q0, q0, v1);

+                    VBICQ(q0, v0, v1);

                     break;

                 case 0x09:

                     INST_NAME("PSIGNW Gx, Ex");

@@ -426,13 +424,11 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     GETEX(q1, 0, 0);

                     v1 = fpu_get_scratch(dyn, ninst);

                     v0 = fpu_get_scratch(dyn, ninst);

-                    NEGQ_16(v0, q0);    // get NEG

-                    CMLTQ_0_16(v1, q1); // calculate mask

-                    VBICQ(q0, q0, v1);  // apply not mask on dest

-                    VANDQ(v0, v0, v1);  // apply mask on src

-                    VORRQ(q0, q0, v0);  // merge

-                    CMEQQ_0_16(v1, q1); // handle case where Ex is 0

-                    VBICQ(q0, q0, v1);

+                    NEGQ_16(v0, q0);     // get NEG

+                    CMLTQ_0_16(v1, q1);  // calculate mask

+                    VBIFQ(v0, q0, v1);   // put back positive values

+                    CMEQQ_0_16(v1, q1);  // handle case where Ex is 0

+                    VBICQ(q0, v0, v1);

                     break;

                 case 0x0A:

                     INST_NAME("PSIGND Gx, Ex");

@@ -441,13 +437,11 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     GETEX(q1, 0, 0);

                     v1 = fpu_get_scratch(dyn, ninst);

                     v0 = fpu_get_scratch(dyn, ninst);

-                    NEGQ_32(v0, q0);    // get NEG

-                    CMLTQ_0_32(v1, q1); // calculate mask

-                    VBICQ(q0, q0, v1);  // apply not mask on dest

-                    VANDQ(v0, v0, v1);  // apply mask on src

-                    VORRQ(q0, q0, v0);  // merge

-                    CMEQQ_0_32(v1, q1); // handle case where Ex is 0

-                    VBICQ(q0, q0, v1);

+                    NEGQ_32(v0, q0);     // get NEG

+                    CMLTQ_0_32(v1, q1);  // calculate mask

+                    VBIFQ(v0, q0, v1);   // put back positive values

+                    CMEQQ_0_32(v1, q1);  // handle case where Ex is 0

+                    VBICQ(q0, v0, v1);

                     break;

                 case 0x0B:

                     INST_NAME("PMULHRSW Gx, Ex");