From 5f69e58f3743c12e68691373421c893b367076ef Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Fri, 21 Apr 2023 00:23:25 +0800 Subject: [RV64_DYNAREC] Added more opcodes (#718) * Added F0 01 LOCK ADD opcode * Added F2 0F 51 SQRTSD opcode * Added FE /0,/1 INC/DEC opcodes --- src/dynarec/rv64/dynarec_rv64_00_3.c | 21 ++++++ src/dynarec/rv64/dynarec_rv64_emit_math.c | 109 ++++++++++++++++++++++++++++++ src/dynarec/rv64/dynarec_rv64_f0.c | 22 ++++++ src/dynarec/rv64/dynarec_rv64_f20f.c | 7 ++ src/dynarec/rv64/dynarec_rv64_helper.h | 4 +- 5 files changed, 161 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index f6c2a4ed..a1e7421e 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -914,6 +914,27 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("CLD"); ANDI(xFlags, xFlags, ~(1<>3)&7) { + case 0: + INST_NAME("INC Eb"); + SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING); + GETEB(x1, 0); + emit_inc8(dyn, ninst, ed, x2, x4, x5); + EBBACK(x5, 0); + break; + case 1: + INST_NAME("DEC Eb"); + SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING); + GETEB(x1, 0); + emit_dec8(dyn, ninst, ed, x2, x4, x5); + EBBACK(x5, 0); + break; + default: + DEFAULT; + } + break; case 0xFF: nextop = F8; switch((nextop>>3)&7) { diff --git a/src/dynarec/rv64/dynarec_rv64_emit_math.c b/src/dynarec/rv64/dynarec_rv64_emit_math.c index 2f4138d6..df70eac4 100644 --- a/src/dynarec/rv64/dynarec_rv64_emit_math.c +++ b/src/dynarec/rv64/dynarec_rv64_emit_math.c @@ -557,6 +557,115 @@ void emit_sub32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, i } } +// emit INC8 instruction, from s1, store result in s1 using s2, s3 and s4 as scratch +void emit_inc8(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4) +{ + IFX(X_ALL) { + ANDI(xFlags, xFlags, ~((1UL<