about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-01 09:46:19 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-01 09:46:19 +0100
commit495c98a488bb2b39d19dbcf97996db29345316f5 (patch)
treed602155e0993eb10a932f9077fc49517fdd06466
parent80a4b61e5cc697b4775b7c94a50c5eda06efff08 (diff)
downloadbox64-495c98a488bb2b39d19dbcf97996db29345316f5.tar.gz
box64-495c98a488bb2b39d19dbcf97996db29345316f5.zip
[ARM64_DYNAREC] Small improvements to POPCNT and ADOX opcodes
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f30f.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f30f.c b/src/dynarec/arm64/dynarec_arm64_f30f.c
index c13079f0..bb42167f 100644
--- a/src/dynarec/arm64/dynarec_arm64_f30f.c
+++ b/src/dynarec/arm64/dynarec_arm64_f30f.c
@@ -185,8 +185,12 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     GETED(0);

                     GETGD;

                     MRS_nzcv(x3);

-                    LSRw(x4, xFlags, F_OF);

-                    BFIx(x3, x4, 29, 1); // set C

+                    IFNATIVE_BEFORE(NF_VF) {

+                        LSRw(x4, x3, NZCV_V);

+                    } else {

+                        LSRw(x4, xFlags, F_OF);

+                    }

+                    BFIx(x3, x4, NZCV_C, 1); // set C

                     MSR_nzcv(x3);      // load CC into ARM CF

                     IFX(X_OF) {

                         ADCSxw_REG(gd, gd, ed);

@@ -478,7 +482,7 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             }

             CNT_8(v1, v1);

             UADDLV_8(v1, v1);

-            VMOVQDto(gd, v1, 0);

+            VMOVHto(gd, v1, 0);

             IFX(X_ALL) {

                 IFX(X_AF|X_PF|X_SF|X_OF|X_CF) {

                     MOV32w(x1, (1<<F_OF) | (1<<F_SF) | (1<<F_ZF) | (1<<F_AF) | (1<<F_CF) | (1<<F_PF));