diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-12-22 12:38:01 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-12-22 12:38:01 +0100 |
| commit | a34b63b80d05baa8bc9faee7e1a1b97dcb46a8a2 (patch) | |
| tree | 0bf028c86c7f935312b4c2f3e4c3e35d78186861 | |
| parent | 5b335f0f2658ae0afda037de2120bc5dc6aa4d48 (diff) | |
| download | box64-a34b63b80d05baa8bc9faee7e1a1b97dcb46a8a2.tar.gz box64-a34b63b80d05baa8bc9faee7e1a1b97dcb46a8a2.zip | |
[ARM64_DYNAREC] Partial rollback of previous commit, it was not good
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_math.c | 27 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_tests.c | 18 |
2 files changed, 23 insertions, 22 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_emit_math.c b/src/dynarec/arm64/dynarec_arm64_emit_math.c index f71f5537..6449de5c 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_math.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_math.c @@ -362,7 +362,7 @@ void emit_sub8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } else IFX(X_ALL) { SET_DFNONE(s3); } - IFX(X_AF|X_OF) { + IFX(X_AF|X_OF|X_CF) { MVNw_REG(s3, s1); ORRw_REG(s3, s3, s2); // s3 = ~op1 | op2 BICw_REG(s4, s2, s1); // s4 = ~op1 & op2 @@ -372,12 +372,13 @@ void emit_sub8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) IFX(X_PEND) { STRB_U12(s1, xEmu, offsetof(x64emu_t, res)); } - IFX(X_CF) { - BFXILw(xFlags, s1, 8, 1); - } - IFX(X_AF|X_OF) { + IFX(X_AF|X_OF|X_CF) { ANDw_REG(s3, s3, s1); // s3 = (~op1 | op2) & res ORRw_REG(s3, s3, s4); // s3 = (~op1 & op2) | ((~op1 | op2) & res) + IFX(X_CF) { + LSRw(s4, s3, 7); + BFIw(xFlags, s4, F_CF, 1); // CF : bc & 0x80 + } IFX(X_AF) { LSRw(s4, s3, 3); BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 @@ -408,7 +409,7 @@ void emit_sub8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4, in } else IFX(X_ALL) { SET_DFNONE(s3); } - IFX(X_AF|X_OF) { + IFX(X_AF|X_OF|X_CF) { MVNw_REG(s3, s1); ORRw_REG(s3, s3, s5); // s3 = ~op1 | op2 BICw_REG(s4, s5, s1); // s4 = ~op1 & op2 @@ -421,10 +422,7 @@ void emit_sub8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4, in IFX(X_PEND) { STRB_U12(s1, xEmu, offsetof(x64emu_t, res)); } - IFX(X_CF) { - BFXILw(xFlags, s1, 8, 1); - } - IFX(X_AF|X_OF) { + IFX(X_AF|X_OF|X_CF) { ANDw_REG(s3, s3, s1); // s3 = (~op1 | op2) & res ORRw_REG(s3, s3, s4); // s3 = (~op1 & op2) | ((~op1 | op2) & res) IFX(X_CF) { @@ -576,12 +574,13 @@ void emit_sub16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) IFX(X_PEND) { STRH_U12(s1, xEmu, offsetof(x64emu_t, res)); } - IFX(X_CF) { - BFXILw(xFlags, s1, 16, 1); - } - IFX(X_AF|X_OF) { + IFX(X_AF|X_OF|X_CF) { ANDw_REG(s3, s3, s1); // s3 = (~op1 | op2) & res ORRw_REG(s3, s3, s4); // s3 = (~op1 & op2) | ((~op1 | op2) & res) + IFX(X_CF) { + LSRw(s4, s3, 15); + BFIw(xFlags, s4, F_CF, 1); // CF : bc & 0x8000 + } IFX(X_AF) { LSRw(s4, s3, 3); BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 diff --git a/src/dynarec/arm64/dynarec_arm64_emit_tests.c b/src/dynarec/arm64/dynarec_arm64_emit_tests.c index fcd23e2f..5c6c602f 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_tests.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_tests.c @@ -116,16 +116,17 @@ void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i STRH_U12(s5, xEmu, offsetof(x64emu_t, res)); } COMP_ZFSF(s5, 16) - IFX(X_CF) { - BFXILw(xFlags, s5, 16, 1); - } // bc = (res & (~d | s)) | (~d & s) - IFX(X_AF|X_OF) { + IFX(X_CF|X_AF|X_OF) { MVNw_REG(s4, s1); // s4 = ~d ORRw_REG(s4, s4, s2); // s4 = ~d | s ANDw_REG(s4, s4, s5); // s4 = res & (~d | s) BICw_REG(s3, s2, s1); // s3 = s & ~d ORRw_REG(s3, s4, s3); // s3 = (res & (~d | s)) | (s & ~d) + IFX(X_CF) { + LSRw(s4, s3, 15); + BFIw(xFlags, s4, F_CF, 1); // CF : bc & 0x8000 + } IFX(X_AF) { LSRw(s4, s3, 3); BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 @@ -179,15 +180,16 @@ void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, in STRB_U12(s5, xEmu, offsetof(x64emu_t, res)); } COMP_ZFSF(s5, 8) - IFX(X_CF) { - BFXILw(xFlags, s5, 8, 1); - } // bc = (res & (~d | s)) | (~d & s) - IFX(X_AF|X_OF) { + IFX(X_CF|X_AF|X_OF) { ORNw_REG(s4, s2, s1); // s4 = ~d | s ANDw_REG(s4, s4, s5); // s4 = res & (~d | s) BICw_REG(s3, s2, s1); // s3 = s & ~d ORRw_REG(s3, s4, s3); // s3 = (res & (~d | s)) | (s & ~d) + IFX(X_CF) { + LSRw(s4, s3, 7); + BFIw(xFlags, s4, F_CF, 1); // CF : bc & 0x80 + } IFX(X_AF) { LSRw(s4, s3, 3); BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 |