about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-24 12:07:37 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-24 12:07:37 +0100
commitf8202096f1c4d8608809bc42f15fbd765e8c148b (patch)
tree6e8f6fc38f7f5306f80aa7a81661c81e6a221797 /src
parentf470d552cfaed6a5c7ff97b8c26ed45503b423d2 (diff)
downloadbox64-f8202096f1c4d8608809bc42f15fbd765e8c148b.tar.gz
box64-f8202096f1c4d8608809bc42f15fbd765e8c148b.zip
Added 0F 01 F9 opcode ([ARM64_DYNAREC] too
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c12
-rw-r--r--src/emu/x64run0f.c10
2 files changed, 20 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 309f9622..2b7892e5 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -90,6 +90,18 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     ed = xRAX+(nextop&7)+(rex.b<<3);

                     MOV32w(ed, (1<<0) | (1<<4)); // only PE and ET set...

                     break;

+                case 0xF9:

+                    INST_NAME("RDTSCP");

+                    NOTEST(x1);

+                    if(box64_rdtsc) {

+                        CALL_(ReadTSC, x1, x3);

+                    } else {

+                        MRS_cntvct_el0(x1);

+                    }

+                    LSRx(xRDX, x1, 32);

+                    MOVw_REG(xRAX, x1);   // wipe upper part

+                    MOVw_REG(xRCX, xZR);    // IA32_TSC, 0 for now

+                    break;

                 default:

                     DEFAULT;

             } else

diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index e36376d5..f14b9dd5 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -105,6 +105,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                 case 0xE7:  /* SMSW Ew */

                     ED->word[0] = (1<<0) | (1<<4); // only PE and ET set...

                     break;

+                case 0xF9:  /* RDTSCP */

+                    tmp64u = ReadTSC(emu);

+                    R_RAX = tmp64u & 0xffffffff;

+                    R_RDX = tmp64u >> 32;

+                    R_RCX = 0;  // should be low of IA32_TSC

+                    break;

                 default:

                     return 0;

             } else

@@ -944,8 +950,8 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         GOCOND(0x80

             , tmp32s = F32S; CHECK_FLAGS(emu);

             , addr += tmp32s;

-            ,,STEP3

-        )                               /* 0x80 -> 0x8F Jxx */

+            ,,

+        )                               /* 0x80 -> 0x8F Jxx */ //STEP3

         GOCOND(0x90

             , nextop = F8; CHECK_FLAGS(emu);

             GETEB(0);