diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-09-25 03:58:47 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-24 21:58:47 +0200 |
| commit | dc391439ba4b9c95eadaa9ee8c6daa2aadeff83f (patch) | |
| tree | 5fd342dd8cf3711cfa3d7ac49e03d8b65d26d837 /src | |
| parent | e44c43deeb91899d6cdf37ba750fcd228d4721bd (diff) | |
| download | box64-dc391439ba4b9c95eadaa9ee8c6daa2aadeff83f.tar.gz box64-dc391439ba4b9c95eadaa9ee8c6daa2aadeff83f.zip | |
[RV64_DYNAREC][BOX32] Added more opcodes (#1866)
* [RV64_DYNAREC][BOX32] Added more opcodes * more
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 64 |
2 files changed, 74 insertions, 8 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 3288a73a..146645ae 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -1010,6 +1010,24 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int *need_epilog = 0; *ok = 0; break; + case 0xEC ... 0xEF: + if (opcode == 0xEC) + INST_NAME("IN AL, DX"); + else if (opcode == 0xED) + INST_NAME("IN EAX, DX"); + else if (opcode == 0xEE) + INST_NAME("OUT DX, AL"); + else + INST_NAME("OUT DX, EAX"); + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL(native_priv, -1); + LOAD_XEMU_CALL(); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + break; case 0xF0: addr = dynarec64_F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); break; diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index 6c6aa8cd..47d17d04 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -379,10 +379,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni gd = xRAX + (opcode&7); ZEXTH(x1, gd); emit_inc16(dyn, ninst, x1, x2, x3, x4); - LUI(x3, 0xffff0); - AND(gd, gd, x3); - OR(gd, gd, x1); - ZEROUP(gd); + INSHz(gd, x1, x3, x4, 1, 0); break; case 0x48: case 0x49: @@ -397,10 +394,32 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni gd = xRAX + (opcode&7); ZEXTH(x1, gd); emit_dec16(dyn, ninst, x1, x2, x3, x4, x5); - LUI(x3, 0xffff0); - AND(gd, gd, x3); - OR(gd, gd, x1); - ZEROUP(gd); + INSHz(gd, x1, x3, x4, 1, 0); + break; + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + INST_NAME("PUSH reg"); + gd = xRAX + (opcode & 0x07) + (rex.b << 3); + PUSH1_16(gd); + break; + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + INST_NAME("POP reg"); + gd = xRAX + (opcode & 0x07) + (rex.b << 3); + POP1_16(x1); + INSHz(gd, x1, x2, x3, 1, 0); break; case 0x64: addr = dynarec64_6664(dyn, addr, ip, ninst, rex, _FS, ok, need_epilog); @@ -1180,6 +1199,35 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni emit_neg16(dyn, ninst, ed, x2, x4); EWBACK; break; + case 4: + INST_NAME("MUL AX, Ew"); + SETFLAGS(X_ALL, SF_PENDING); + GETEW(x1, 0); + ZEXTH(x2, xRAX); + MULW(x1, x2, x1); + UFLAG_RES(x1); + INSHz(xRAX, x1, x4, x5, 1, 1); + SRLI(xRDX, xRDX, 16); + SLLI(xRDX, xRDX, 16); + SRLI(x1, x1, 48); + OR(xRDX, xRDX, x1); + UFLAG_DF(x1, d_mul16); + break; + case 5: + INST_NAME("IMUL AX, Ew"); + SETFLAGS(X_ALL, SF_PENDING); + GETSEW(x1, 0); + SLLI(x2, xRAX, 16); + SRAIW(x2, x2, 16); + MULW(x1, x2, x1); + UFLAG_RES(x1); + INSHz(xRAX, x1, x4, x5, 1, 1); + SRLI(xRDX, xRDX, 16); + SLLI(xRDX, xRDX, 16); + SRLI(x1, x1, 48); + OR(xRDX, xRDX, x1); + UFLAG_DF(x1, d_imul16); + break; case 6: INST_NAME("DIV Ew"); SETFLAGS(X_ALL, SF_SET); |