From cf24eaf9d2bcb739aaec5b4c75d6bb09b4b902ae Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Thu, 26 Dec 2024 21:40:04 +0800 Subject: [LA64_DYNAREC] Added hardware wall-clock support (#2216) * [LA64_DYNAREC] Added hardware wall-clock support * Refined multi-language support --- src/dynarec/la64/dynarec_la64_0f.c | 7 +++++-- src/dynarec/la64/la64_emitter.h | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'src/dynarec') 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 -- cgit 1.4.1