about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-12-26 21:40:04 +0800
committerGitHub <noreply@github.com>2024-12-26 14:40:04 +0100
commitcf24eaf9d2bcb739aaec5b4c75d6bb09b4b902ae (patch)
treea9ac91cf3005c7e867ef87ec7cc0a2bdd172e6e8 /src/dynarec
parentcd1ac51b7932dbd2eb158e67f7dc6bee71163b96 (diff)
downloadbox64-cf24eaf9d2bcb739aaec5b4c75d6bb09b4b902ae.tar.gz
box64-cf24eaf9d2bcb739aaec5b4c75d6bb09b4b902ae.zip
[LA64_DYNAREC] Added hardware wall-clock support (#2216)
* [LA64_DYNAREC] Added hardware wall-clock support

* Refined multi-language support
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/la64/dynarec_la64_0f.c7
-rw-r--r--src/dynarec/la64/la64_emitter.h2
2 files changed, 7 insertions, 2 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c
index 4e80972f..d1a6c396 100644
--- a/src/dynarec/la64/dynarec_la64_0f.c
+++ b/src/dynarec/la64/dynarec_la64_0f.c
@@ -338,8 +338,11 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x31:
             INST_NAME("RDTSC");
             NOTEST(x1);
-            // TODO: how to read the wall-clock real time on LoongArch?
-            CALL(ReadTSC, x3); // will return the u64 in x3
+            if (box64_rdtsc) {
+                CALL(ReadTSC, x3); // will return the u64 in x3
+            } else {
+                RDTIME_D(x3, xZR);
+            }
             if (box64_rdtsc_shift) {
                 SRLI_D(x3, x3, box64_rdtsc_shift);
             }
diff --git a/src/dynarec/la64/la64_emitter.h b/src/dynarec/la64/la64_emitter.h
index 9290869b..6d8e507f 100644
--- a/src/dynarec/la64/la64_emitter.h
+++ b/src/dynarec/la64/la64_emitter.h
@@ -950,6 +950,8 @@ f24-f31  fs0-fs7   Static registers                Callee
 #define FCMP_D(cd, fj, fk, cond) EMIT(type_4R(0b000011000010, cond, fk, fj, cd & 0b111))
 #define FSEL(fd, fj, fk, ca)     EMIT(type_4R(0b000011010000, ca & 0b111, fk, fj, fd))
 
+#define RDTIME_D(rd, rj) EMIT(type_2R(0b11010, rj, rd))
+
 ////////////////////////////////////////////////////////////////////////////////
 // (undocumented) LSX/LASX extension instructions