diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-18 08:41:31 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-18 08:41:31 +0000 |
| commit | 2aeb77736f07bdc3bd259093c02aadfd20d69e7f (patch) | |
| tree | fb85a05da3a2924a9197258793847733f9a0a686 | |
| parent | 4a9d2d92d3f8eb8823d4811bafdbd5e2ad4f7687 (diff) | |
| download | box64-2aeb77736f07bdc3bd259093c02aadfd20d69e7f.tar.gz box64-2aeb77736f07bdc3bd259093c02aadfd20d69e7f.zip | |
[RV64_DYNAREC] Added D3/7 SAR opcode
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00.c | 25 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_emitter.h | 2 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00.c b/src/dynarec/rv64/dynarec_rv64_00.c index 0d6d412b..8f71c229 100644 --- a/src/dynarec/rv64/dynarec_rv64_00.c +++ b/src/dynarec/rv64/dynarec_rv64_00.c @@ -667,6 +667,31 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } break; + case 0xD3: + nextop = F8; + switch((nextop>>3)&7) { + case 7: + INST_NAME("SAR Ed, CL"); + SETFLAGS(X_ALL, SF_PENDING); + if(rex.w) { + ANDI(x3, xRCX, 0x3f); + } else { + ANDI(x3, xRCX, 0x1f); + } + GETED(0); + if(!rex.w && MODREG) {ZEROUP(ed);} + CBZ_NEXT(x3); + UFLAG_OP12(ed, x3); + SRAxw(ed, ed, x3); + WBACK; + UFLAG_RES(ed); + UFLAG_DF(x3, rex.w?d_sar64:d_sar32); + break; + default: + DEFAULT; + } + break; + case 0xE8: INST_NAME("CALL Id"); i32 = F32S; diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h index ea3f08c1..7f13eb10 100644 --- a/src/dynarec/rv64/rv64_emitter.h +++ b/src/dynarec/rv64/rv64_emitter.h @@ -277,6 +277,8 @@ f28–31 ft8–11 FP temporaries Caller // rd = rs1>>rs2 arithmetic #define SRAW(rd, rs1, rs2) EMIT(R_type(0b0100000, rs2, rs1, 0b101, rd, 0b0111011)) +#define SRAxw(rd, rs1, rs2) if(rex.w) {SRA(rd, rs1, rs2);} else {SRAW(rd, rs1, rs2); ZEROUP(rd);} + // Shift Left Immediate, 32-bit, sign-extended #define SLLIW(rd, rs1, imm5) EMIT(I_type(imm5, rs1, 0b001, rd, 0b0011011)) // Shift Left Immediate |