about summary refs log tree commit diff stats
path: root/src/dynarec/dynarec_arm64_emit_math.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-17 11:17:49 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-17 11:17:49 +0100
commite8d2b6d25d3718355bc2cd5c30fcab74e81eeb8b (patch)
treebae54424b4ff21e9f935dcd1ce668495fe571a3b /src/dynarec/dynarec_arm64_emit_math.c
parentd1a037b38b647ac54c11a1b1e00a800205193ada (diff)
downloadbox64-e8d2b6d25d3718355bc2cd5c30fcab74e81eeb8b.tar.gz
box64-e8d2b6d25d3718355bc2cd5c30fcab74e81eeb8b.zip
Excplicit handling of bit size for defered flags
Diffstat (limited to 'src/dynarec/dynarec_arm64_emit_math.c')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_emit_math.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/src/dynarec/dynarec_arm64_emit_math.c b/src/dynarec/dynarec_arm64_emit_math.c
index d83187f2..0c20e331 100755
--- a/src/dynarec/dynarec_arm64_emit_math.c
+++ b/src/dynarec/dynarec_arm64_emit_math.c
@@ -219,26 +219,21 @@ void emit_sub32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in
         if(c>=0 && c<0x1000) {
             SUBxw_U12(s1, s1, c);
         } else {
-            MOV64x(s5, c);
+            MOV64xw(s5, c);
             SUBxw_REG(s1, s1, s5);
         }
         return;
     }
     IFX(X_PEND) {
-        if(rex.w) {
-            STRx_U12(s1, xEmu, offsetof(x64emu_t, op1));
-        } else {
-            MOVw(s3, s1);
-            STRx_U12(s3, xEmu, offsetof(x64emu_t, op1));
-        }
-        MOV64x(s3, c);
-        STRx_U12(s3, xEmu, offsetof(x64emu_t, op2));
+        STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
+        MOV64xw(s3, c);
+        STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
         SET_DF(s4, rex.w?d_sub64:d_sub32);
     } else IFX(X_ALL) {
         SET_DFNONE(s4);
     }
     IFX(X_AF) {
-        MOV64x(s5, c);
+        MOV64xw(s5, c);
         MVNxw(s4, s1);
         ORRxw_REG(s3, s4, s5);      // s3 = ~op1 | op2
         BICxw_REG(s4, s5, s1);      // s4 = ~op1 & op2
@@ -258,7 +253,7 @@ void emit_sub32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in
         }
     }
     IFX(X_PEND) {
-        STRx_U12(s1, xEmu, offsetof(x64emu_t, res));
+        STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
     }
     IFX(X_AF) {
         ANDxw_REG(s3, s3, s1);   // s3 = (~op1 | op2) & res