about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-05 14:57:24 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-05 14:57:24 +0100
commit5a35184ba7d01636323eee763717db9f2781ff5a (patch)
tree2e1cc009bd433913485a2419db17f8bf6c2d8735 /src/dynarec
parentdb801da6580e8a187350e37c39ba69507e5b470c (diff)
downloadbox64-5a35184ba7d01636323eee763717db9f2781ff5a.tar.gz
box64-5a35184ba7d01636323eee763717db9f2781ff5a.zip
[INTERPRETER] Added a few more cpu extension and associated opcodes ([ARM64_DYNAREC] added some of the new opcodes too)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c5
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c32
2 files changed, 36 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 058478c6..6d5907f7 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -2468,6 +2468,11 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 IFX(X_CF) { BFIw(xFlags, x3, F_CF, 1); }

                 MOVxw_REG(ed, x1);

                 break;

+            case 7:

+                INST_NAME("RDPID Ed");

+                GETED(0);

+                CALL_(helper_getcpu, ed, x2);

+                break;

             default:

                 DEFAULT;

             } else switch((nextop>>3)&7) {

diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 0f336876..f2184f58 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -2455,7 +2455,37 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             emit_shrd16(dyn, ninst, ed, gd, x4, x5, x6);

             EWBACK;

             break;

-

+        case 0xAE:

+            nextop = F8;

+            if(MODREG)

+                switch (nextop) {

+                    default:

+                        DEFAULT;

+                }

+            else

+                switch((nextop>>3)&7) {

+                    case 6:

+                        INST_NAME("CLWB Ed");

+                        MESSAGE(LOG_DUMP, "Need Optimization?\n");

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=x1) {

+                            MOVx_REG(x1, ed);

+                        }

+                        CALL_(native_clflush, -1, 0);

+                        break;

+                    case 7:

+                        INST_NAME("CLFLUSHOPT Ed");

+                        MESSAGE(LOG_DUMP, "Need Optimization?\n");

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=x1) {

+                            MOVx_REG(x1, ed);

+                        }

+                        CALL_(native_clflush, -1, 0);

+                        break;

+                    default:

+                        DEFAULT;

+                }

+            break;

         case 0xAF:

             INST_NAME("IMUL Gw,Ew");

             SETFLAGS(X_ALL, SF_SET);