diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-03-20 20:26:09 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-20 13:26:09 +0100 |
| commit | dbede8d6dfd8f8c5bba47f4d27972408863da53f (patch) | |
| tree | e36af59c996c77f95574c6ed66a20986a5cfc038 /src | |
| parent | 5c48c72b56628515f3d5bbbd7461d0316d22e87b (diff) | |
| download | box64-dbede8d6dfd8f8c5bba47f4d27972408863da53f.tar.gz box64-dbede8d6dfd8f8c5bba47f4d27972408863da53f.zip | |
[RV64_DYNAREC] Added more opcode (#600)
* [RV64_DYNAREC] Added F6 /{0,1} TEST opcode
* [RV64_DYNAREC] Added 25 AND opcode
* [RV64_DYNAREC] Added 3D CMP opcode
* [RV64_DYNAREC] Added A9 TEST opcodeDiffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00.c b/src/dynarec/rv64/dynarec_rv64_00.c index 44aaa4bb..0e7d1ee3 100644 --- a/src/dynarec/rv64/dynarec_rv64_00.c +++ b/src/dynarec/rv64/dynarec_rv64_00.c @@ -94,7 +94,12 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni DEFAULT; } break; - + case 0x25: + INST_NAME("AND EAX, Id"); + SETFLAGS(X_ALL, SF_SET_PENDING); + i64 = F32S; + emit_and32c(dyn, ninst, rex, xRAX, i64, x3, x4); + break; case 0x29: INST_NAME("SUB Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); @@ -162,6 +167,16 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni emit_cmp8_0(dyn, ninst, x1, x3, x4); } break; + case 0x3D: + INST_NAME("CMP EAX, Id"); + SETFLAGS(X_ALL, SF_SET_PENDING); + i64 = F32S; + if(i64) { + MOV64xw(x2, i64); + emit_cmp32(dyn, ninst, rex, xRAX, x2, x3, x4, x5, x6); + } else + emit_cmp32_0(dyn, ninst, rex, xRAX, x3, x4); + break; case 0x50: case 0x51: case 0x52: @@ -537,6 +552,13 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV32w(x2, u8); emit_test8(dyn, ninst, x1, x2, x3, x4, x5); break; + case 0xA9: + INST_NAME("TEST EAX, Id"); + SETFLAGS(X_ALL, SF_SET_PENDING); + i64 = F32S; + MOV64xw(x2, i64); + emit_test32(dyn, ninst, rex, xRAX, x2, x3, x4, x5); + break; case 0xB4: case 0xB5: case 0xB6: @@ -968,7 +990,22 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni *need_epilog = 0; *ok = 0; break; - + case 0xF6: + nextop = F8; + switch((nextop>>3)&7) { + case 0: + case 1: + INST_NAME("TEST Eb, Ib"); + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEB(x1, 1); + u8 = F8; + MOV32w(x2, u8); + emit_test8(dyn, ninst, x1, x2, x3, x4, x5); + break; + default: + DEFAULT; + } + break; case 0xF7: nextop = F8; switch((nextop>>3)&7) { |