about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-03-21 11:30:50 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-03-21 11:30:50 +0100
commit10cbb3c8a90c06fc76cdcffbb0f64bc789d52fdd (patch)
treef875e63d15eb2ee845bd79ca14ef28a2e5508d92 /src
parent0a3fa1c918ef9cfc332c47214dba4f77f871a945 (diff)
downloadbox64-10cbb3c8a90c06fc76cdcffbb0f64bc789d52fdd.tar.gz
box64-10cbb3c8a90c06fc76cdcffbb0f64bc789d52fdd.zip
[ARM64_DYNAREC] Added 67 66 0F 76/EF opcodes (for #1046)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 36180f02..03639bf3 100644
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -30,7 +30,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 

     uint8_t opcode = F8;

     uint8_t nextop;

-    uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2;

+    uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2, q0, q1;

     int64_t fixedaddress;

     int unscaled;

     int8_t  i8;

@@ -748,6 +748,20 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             }

                             break;

 

+                        case 0x76:

+                            INST_NAME("PCMPEQD Gx,Ex");

+                            nextop = F8;

+                            GETGX(v0, 1);

+                            if(MODREG) {

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

+                            } else {

+                                q0 = fpu_get_scratch(dyn, ninst);

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

+                                VLD128(q0, ed, fixedaddress);

+                            }

+                            VCMEQQ_32(v0, v0, q0);

+                            break;

+

                         case 0x7E:

                             INST_NAME("MOVD Ed,Gx");

                             nextop = F8;

@@ -787,6 +801,27 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             }

                             break;

 

+                        case 0xEF:

+                            INST_NAME("PXOR Gx,Ex");

+                            nextop = F8;

+                            GETG;

+                            if(MODREG && ((nextop&7)+(rex.b<<3)==gd)) {

+                                // special case for PXOR Gx, Gx

+                                q0 = sse_get_reg_empty(dyn, ninst, x1, gd);

+                                VEORQ(q0, q0, q0);

+                            } else {

+                                q0 = sse_get_reg(dyn, ninst, x1, gd, 1);

+                                if(MODREG) {

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

+                                } else {

+                                    q1 = fpu_get_scratch(dyn, ninst);

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

+                                    VLD128(q1, ed, fixedaddress);

+                                }

+                                VEORQ(q0, q0, q1);

+                            }

+                            break;

+

                         case 0xFE:

                             INST_NAME("PADDD Gx,Ex");

                             nextop = F8;