diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-03-19 03:56:17 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-18 20:56:17 +0100 |
| commit | 26a083e700f66849035aba73cadcd13437ec9859 (patch) | |
| tree | 0af60ac41d0e70708db6997adda848c0e85e1a97 | |
| parent | 8c4c87112cf1813ede0d3b00b19acb6bff7a9e28 (diff) | |
| download | box64-26a083e700f66849035aba73cadcd13437ec9859.tar.gz box64-26a083e700f66849035aba73cadcd13437ec9859.zip | |
[RV64_DYNAREC] A8 TEST opcode (#586)
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00.c | 9 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_emit_tests.c | 28 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 2 |
3 files changed, 37 insertions, 2 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00.c b/src/dynarec/rv64/dynarec_rv64_00.c index 882f3e52..df747374 100644 --- a/src/dynarec/rv64/dynarec_rv64_00.c +++ b/src/dynarec/rv64/dynarec_rv64_00.c @@ -483,7 +483,14 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEROUP(xRDX); } break; - + case 0xA8: + INST_NAME("TEST AL, Ib"); + SETFLAGS(X_ALL, SF_SET_PENDING); + ANDI(x1, xRAX, 0xff); + u8 = F8; + MOV32w(x2, u8); + emit_test8(dyn, ninst, x1, x2, x3, x4, x5); + break; case 0xB8: case 0xB9: case 0xBA: diff --git a/src/dynarec/rv64/dynarec_rv64_emit_tests.c b/src/dynarec/rv64/dynarec_rv64_emit_tests.c index 9ea95d20..4aa41f5b 100644 --- a/src/dynarec/rv64/dynarec_rv64_emit_tests.c +++ b/src/dynarec/rv64/dynarec_rv64_emit_tests.c @@ -157,6 +157,34 @@ void emit_cmp32_0(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s3, int } } +// emit TEST8 instruction, from test s1, s2, using s3, s4 and s5 as scratch +void emit_test8(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5) { + CLEAR_FLAGS(); + IFX_PENDOR0 { + SET_DF(s3, d_tst8); + } else { + SET_DFNONE(s4); + } + + AND(s3, s1, s2); // res = s1 & s2 + + IFX_PENDOR0 { + SD(s3, xEmu, offsetof(x64emu_t, res)); + } + IFX(X_SF) { + SRLI(s4, s3, 7); + BEQZ(s4, 8); + ORI(xFlags, xFlags, 1 << F_SF); + } + IFX(X_ZF) { + BNEZ(s3, 8); + ORI(xFlags, xFlags, 1 << F_ZF); + } + IFX(X_PF) { + emit_pf(dyn, ninst, s3, s4, s5); + } +} + // emit TEST32 instruction, from test s1, s2, using s3 and s4 as scratch void emit_test32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5) { diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 0f1a7c80..f7b15939 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -612,7 +612,7 @@ void emit_cmp32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s void emit_cmp8_0(dynarec_rv64_t* dyn, int ninst, int s1, int s3, int s4); //void emit_cmp16_0(dynarec_rv64_t* dyn, int ninst, int s1, int s3, int s4); void emit_cmp32_0(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4); -//void emit_test8(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_test8(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); //void emit_test16(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_test32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); void emit_test32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4, int s5); |