diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-09-08 11:54:42 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-09-08 11:54:42 +0200 |
| commit | 6f144aa429e67721582bd8f02170ee90fe3fafa9 (patch) | |
| tree | 5aff488e4421fc38df0432a0f8d5d9c6fa4d3b8d | |
| parent | e5c1e3a2a26036c73e076bb4c7151f7c7d9d150b (diff) | |
| download | box64-6f144aa429e67721582bd8f02170ee90fe3fafa9.tar.gz box64-6f144aa429e67721582bd8f02170ee90fe3fafa9.zip | |
[ARM64_DYNAREC] A few minor fixes to some opcodes
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 5 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_660f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 40 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67_32.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c | 6 |
5 files changed, 26 insertions, 31 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index e362899b..a513c8ee 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -2722,6 +2722,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if ((BOX64ENV(log)<2 && !BOX64ENV(rolling_log) && !BOX64ENV(dynarec_test)) && tmp) { //GETIP(ip+3+8+8); // read the 0xCC call_n(dyn, ninst, (void*)(addr+8), tmp); + SMWRITE2(); addr+=8+8; } else { GETIP(ip+1); // read the 0xCC @@ -3442,6 +3443,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xE0: INST_NAME("LOOPNZ"); READFLAGS(X_ZF); + SMEND(); i8 = F8S; SUBz_U12(xRCX, xRCX, 1); TBNZ_NEXT(xFlags, F_ZF); @@ -3450,6 +3452,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xE1: INST_NAME("LOOPZ"); READFLAGS(X_ZF); + SMEND(); i8 = F8S; SUBz_U12(xRCX, xRCX, 1); TBZ_NEXT(xFlags, F_ZF); @@ -3462,7 +3465,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GO(0); break; case 0xE3: - INST_NAME("JECXZ"); + INST_NAME("JRCXZ"); i8 = F8S; GO(1); break; diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 5200e5b7..800a2091 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -905,10 +905,10 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n REV16x(x1, gd); BFIx(ed, x1, 0, 16); } else { - SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<1, (1<<1)-1, rex, NULL, 0, 0); REV16x(x1, gd); STH(x1, ed, fixedaddress); + SMWRITE(); } break; diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index 05b18944..793fa503 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -1432,65 +1432,57 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; - #define GO(NO, YES) \ + #define GO(Z) \ JUMP(addr+i8, 1); \ if(dyn->insts[ninst].x64.jmp_insts==-1 || \ CHECK_CACHE()) { \ /* out of the block */ \ i32 = dyn->insts[ninst].epilog-(dyn->native_size); \ - Bcond(NO, i32); \ + if(Z) {CBNZw(xRCX, i32);} else {CBZw(xRCX, i32);}; \ if(dyn->insts[ninst].x64.jmp_insts==-1) { \ if(!(dyn->insts[ninst].x64.barrier&BARRIER_FLOAT)) \ fpu_purgecache(dyn, ninst, 1, x1, x2, x3); \ jump_to_next(dyn, addr+i8, 0, ninst, rex.is32bits); \ } else { \ CacheTransform(dyn, ninst, cacheupd); \ - i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);\ + i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size); \ SKIP_SEVL(i32); \ - B(i32); \ + Bcond(c__, i32); \ } \ } else { \ /* inside the block */ \ i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size); \ SKIP_SEVL(i32); \ - Bcond(YES, i32); \ + if(Z) {CBZw(xRCX, i32);} else {CBNZw(xRCX, i32);}; \ } case 0xE0: INST_NAME("LOOPNZ (32bits)"); READFLAGS(X_ZF); + SMEND(); i8 = F8S; - MOVw_REG(x1, xRCX); - SUBw_U12(x1, x1, 1); - BFIx(xRCX, x1, 0, 32); - CBZw_NEXT(x1); // ECX is 0, no LOOP - TSTw_mask(xFlags, 0b011010, 0); //mask=0x40 - GO(cNE, cEQ); + SUBw_U12(xRCX, xRCX, 1); + TBNZ_NEXT(xFlags, F_ZF); + GO(0); break; case 0xE1: INST_NAME("LOOPZ (32bits)"); READFLAGS(X_ZF); + SMEND(); i8 = F8S; - MOVw_REG(x1, xRCX); - SUBw_U12(x1, x1, 1); - BFIx(xRCX, x1, 0, 32); - CBZw_NEXT(x1); // ECX is 0, no LOOP - TSTw_mask(xFlags, 0b011010, 0); //mask=0x40 - GO(cEQ, cNE); + SUBw_U12(xRCX, xRCX, 1); + TBZ_NEXT(xFlags, F_ZF); + GO(0); break; case 0xE2: INST_NAME("LOOP (32bits)"); i8 = F8S; - MOVw_REG(x1, xRCX); - SUBSw_U12(x1, x1, 1); - BFIx(xRCX, x1, 0, 32); - GO(cEQ, cNE); + SUBw_U12(xRCX, xRCX, 1); + GO(0); break; case 0xE3: INST_NAME("JECXZ"); i8 = F8S; - MOVw_REG(x1, xRCX); - TSTw_REG(x1, x1); - GO(cNE, cEQ); + GO(1); break; #undef GO diff --git a/src/dynarec/arm64/dynarec_arm64_67_32.c b/src/dynarec/arm64/dynarec_arm64_67_32.c index bb394e71..58ec2ee8 100644 --- a/src/dynarec/arm64/dynarec_arm64_67_32.c +++ b/src/dynarec/arm64/dynarec_arm64_67_32.c @@ -115,6 +115,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("LOOPNZ (16bits)"); READFLAGS(X_ZF); i8 = F8S; + SMEND(); UXTHw(x1, xRCX); SUBw_U12(x1, x1, 1); BFIx(xRCX, x1, 0, 16); @@ -125,6 +126,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int case 0xE1: INST_NAME("LOOPZ (16bits)"); READFLAGS(X_ZF); + SMEND(); i8 = F8S; UXTHw(x1, xRCX); SUBw_U12(x1, x1, 1); @@ -136,6 +138,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int case 0xE2: INST_NAME("LOOP (16bits)"); i8 = F8S; + SMEND(); UXTHw(x1, xRCX); SUBSw_U12(x1, x1, 1); BFIx(xRCX, x1, 0, 16); @@ -144,6 +147,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int case 0xE3: INST_NAME("JCXZ"); i8 = F8S; + SMEND(); TSTw_mask(xRCX, 0, 15); //mask=0xffff GO(cNE, cEQ); break; diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c index dae8dbac..e4435717 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c @@ -378,7 +378,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip if(MODREG) { ed = TO_NAT((nextop & 7) + (rex.b << 3)); } else { - SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff, 0, rex, NULL, 0, 1); ed = x1; } @@ -396,7 +395,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip if(MODREG) { ed = TO_NAT((nextop & 7) + (rex.b << 3)); } else { - SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 1); ed = x1; } @@ -414,7 +412,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip if(MODREG) { ed = TO_NAT((nextop & 7) + (rex.b << 3)); } else { - SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 1); ed = x1; } @@ -436,7 +433,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip if(MODREG) { ed = TO_NAT((nextop & 7) + (rex.b << 3)); } else { - SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1); ed = x1; } @@ -497,7 +493,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip break; case 0x1D: - INST_NAME("VCVTPS2PH Ex, Gx"); + INST_NAME("VCVTPS2PH Ex, Gx, Ib"); nextop = F8; GETGX(v0, 0); if(MODREG) { |