about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-20 21:46:15 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-20 21:46:15 +0100
commit848390d9eb960175f4063cfe45a5fc2061116771 (patch)
tree6b20199cd0f73faa2eaf16853d268bf6b0952eb3 /src
parent2f89043b35a58afac2d731982cbb499cd4d06f5d (diff)
downloadbox64-848390d9eb960175f4063cfe45a5fc2061116771.tar.gz
box64-848390d9eb960175f4063cfe45a5fc2061116771.zip
[DYNAREC] Fixed and32 emitter and improved test32 emitter
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_emit_logic.c2
-rwxr-xr-xsrc/dynarec/dynarec_arm64_emit_tests.c8
2 files changed, 6 insertions, 4 deletions
diff --git a/src/dynarec/dynarec_arm64_emit_logic.c b/src/dynarec/dynarec_arm64_emit_logic.c
index 141322db..d797a704 100755
--- a/src/dynarec/dynarec_arm64_emit_logic.c
+++ b/src/dynarec/dynarec_arm64_emit_logic.c
@@ -178,6 +178,8 @@ void emit_and32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3
         BICw(xFlags, xFlags, s3);
     }
     IFX(X_ZF) {
+        CSETw(s3, cEQ);
+        BFIw(xFlags, s3, F_ZF, 1);
     }
     IFX(X_SF) {
         LSRxw(s3, s1, (rex.w)?63:31);
diff --git a/src/dynarec/dynarec_arm64_emit_tests.c b/src/dynarec/dynarec_arm64_emit_tests.c
index 4a6e62f8..7b981325 100755
--- a/src/dynarec/dynarec_arm64_emit_tests.c
+++ b/src/dynarec/dynarec_arm64_emit_tests.c
@@ -278,8 +278,8 @@ void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s
     } else {
         SET_DFNONE(s4);
     }
-    IFX(X_ZF|X_CF|X_OF) {
-        MOV32w(s3, (1<<F_ZF)|(1<<F_CF)|(1<<F_OF));
+    IFX(X_CF | X_AF | X_OF) {
+        MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
         BICw(xFlags, xFlags, s3);
     }
     ANDSxw_REG(s3, s1, s2);   // res = s1 & s2
@@ -287,8 +287,8 @@ void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s
         STRxw_U12(s3, xEmu, offsetof(x64emu_t, res));
     }
     IFX(X_ZF) {
-        Bcond(cNE, +8);
-        ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40
+        CSETw(s3, cEQ);
+        BFIw(xFlags, s3, F_ZF, 1);
     }
     IFX(X_SF) {
         LSRxw(s4, s3, rex.w?63:31);