From 5254834d43d4fe38046c8f26e996476d6e590296 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 6 Jun 2023 18:38:51 +0800 Subject: [DYNAREC_RV64] Fixed 9x SETcc opcodes (#824) --- src/dynarec/rv64/dynarec_rv64_00_3.c | 12 ++++++------ src/dynarec/rv64/dynarec_rv64_0f.c | 3 ++- src/dynarec/rv64/dynarec_rv64_64.c | 4 ++-- 3 files changed, 10 insertions(+), 9 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 9d6fa74e..9019042e 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -229,7 +229,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int if (eb2) { // load a mask to x3 (ffffffffffff00ff) - LUI(x3, 0xffffffffffff0); + LUI(x3, 0xffff0); ORI(x3, x3, 0xff); // apply mask AND(eb1, eb1, x3); @@ -899,9 +899,9 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int AND(xRAX, x2, xMASK); ZEROUP(xRDX); } else { - if(ninst - && dyn->insts[ninst-1].x64.addr - && *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x31 + if(ninst + && dyn->insts[ninst-1].x64.addr + && *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x31 && *(uint8_t*)(dyn->insts[ninst-1].x64.addr+1)==0xD2) { SET_DFNONE(); GETED(0); @@ -938,7 +938,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ZEROUP(xRDX); } else { if(ninst && dyn->insts - && dyn->insts[ninst-1].x64.addr + && dyn->insts[ninst-1].x64.addr && *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x48 && *(uint8_t*)(dyn->insts[ninst-1].x64.addr+1)==0x99) { SET_DFNONE() @@ -1029,7 +1029,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 2: // CALL Ed INST_NAME("CALL Ed"); - PASS2IF((box64_dynarec_safeflags>1) || + PASS2IF((box64_dynarec_safeflags>1) || ((ninst && dyn->insts[ninst-1].x64.set_flags) || ((ninst>1) && dyn->insts[ninst-2].x64.set_flags)), 1) { diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index a2f714b0..62066767 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -874,9 +874,10 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni eb1 = xRAX+(ed&3); \ } \ if (eb2) { \ - LUI(x1, 0xffffffffffff0); \ + LUI(x1, 0xffff0); \ ORI(x1, x1, 0xff); \ AND(eb1, eb1, x1); \ + SLLI(x3, x3, 8); \ } else { \ ANDI(eb1, eb1, 0xf00); \ } \ diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index 96fe8288..af49865b 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -345,12 +345,12 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni eb2 = (ed&4)>>2; // L or H } else { eb1 = xRAX+(nextop&7)+(rex.b<<3); - eb2 = 0; + eb2 = 0; } if (eb2) { // load a mask to x3 (ffffffffffff00ff) - LUI(x3, 0xffffffffffff0); + LUI(x3, 0xffff0); ORI(x3, x3, 0xff); // apply mask AND(eb1, eb1, x3); -- cgit 1.4.1