about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_arm64_db.c9
-rw-r--r--src/dynarec/dynarec_arm64_df.c11
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.c7
3 files changed, 16 insertions, 11 deletions
diff --git a/src/dynarec/dynarec_arm64_db.c b/src/dynarec/dynarec_arm64_db.c
index 11d5e45b..0b11c0f4 100644
--- a/src/dynarec/dynarec_arm64_db.c
+++ b/src/dynarec/dynarec_arm64_db.c
@@ -194,9 +194,10 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SQXTN_S_D(s0, s0);
                     VSTR32_U12(s0, wback, fixedaddress);
                     MRS_fpsr(x5);   // get back FPSR to check the IOC bit
-                    TBZ_NEXT(x5, FPSR_IOC);
+                    TBZ_MARK3(x5, FPSR_IOC);
                     MOV32w(x5, 0x80000000);
                     STRw_U12(x5, wback, fixedaddress);
+                    MARK3;
                     #endif
                     x87_do_pop(dyn, ninst);
                     break;
@@ -225,9 +226,10 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SQXTN_S_D(s0, s0);
                     VSTR32_U12(s0, wback, fixedaddress);
                     MRS_fpsr(x5);   // get back FPSR to check the IOC bit
-                    TBZ_NEXT(x5, FPSR_IOC);
+                    TBZ_MARK3(x5, FPSR_IOC);
                     MOV32w(x5, 0x80000000);
                     STRw_U12(x5, wback, fixedaddress);
+                    MARK3;
                     #endif
                     x87_restoreround(dyn, ninst, u8);
                     break;
@@ -256,9 +258,10 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SQXTN_S_D(s0, s0);
                     VSTR32_U12(s0, wback, fixedaddress);
                     MRS_fpsr(x5);   // get back FPSR to check the IOC bit
-                    TBZ_NEXT(x5, FPSR_IOC);
+                    TBZ_MARK3(x5, FPSR_IOC);
                     MOV32w(x5, 0x80000000);
                     STRw_U12(x5, wback, fixedaddress);
+                    MARK3;
                     #endif
                     x87_restoreround(dyn, ninst, u8);
                     x87_do_pop(dyn, ninst);
diff --git a/src/dynarec/dynarec_arm64_df.c b/src/dynarec/dynarec_arm64_df.c
index 15d67f86..8c782fab 100644
--- a/src/dynarec/dynarec_arm64_df.c
+++ b/src/dynarec/dynarec_arm64_df.c
@@ -168,9 +168,10 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SQXTN_H_S(s0, s0);
                     VSTR16_U12(s0, wback, fixedaddress);
                     MRS_fpsr(x5);   // get back FPSR to check the IOC bit
-                    TBZ_NEXT(x5, FPSR_IOC);
+                    TBZ_MARK3(x5, FPSR_IOC);
                     MOV32w(x5, 0x8000);
                     STRH_U12(x5, wback, fixedaddress);
+                    MARK3;
                     #endif
                     x87_do_pop(dyn, ninst);
                     break;
@@ -198,9 +199,10 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SQXTN_H_S(s0, s0);
                     VSTR16_U12(s0, wback, fixedaddress);
                     MRS_fpsr(x5);   // get back FPSR to check the IOC bit
-                    TBZ_NEXT(x5, FPSR_IOC);
+                    TBZ_MARK3(x5, FPSR_IOC);
                     MOV32w(x5, 0x8000);
                     STRH_U12(x5, wback, fixedaddress);
+                    MARK3;
                     #endif
                     x87_restoreround(dyn, ninst, u8);
                     break;
@@ -228,9 +230,10 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     SQXTN_H_S(s0, s0);
                     VSTR16_U12(s0, wback, fixedaddress);
                     MRS_fpsr(x5);   // get back FPSR to check the IOC bit
-                    TBZ_NEXT(x5, FPSR_IOC);
+                    TBZ_MARK3(x5, FPSR_IOC);
                     MOV32w(x5, 0x8000);
                     STRH_U12(x5, wback, fixedaddress);
+                    MARK3;
                     #endif
                     x87_do_pop(dyn, ninst);
                     x87_restoreround(dyn, ninst, u8);
@@ -279,8 +282,8 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     TBZ_MARK3(x5, FPSR_IOC);
                     MOV64x(x5, 0x8000000000000000LL);
                     STRx_U12(x5, wback, fixedaddress);
-                    #endif
                     MARK3;
+                    #endif
                     x87_restoreround(dyn, ninst, u8);
                     break;
                 default:
diff --git a/src/dynarec/dynarec_arm64_helper.c b/src/dynarec/dynarec_arm64_helper.c
index df87ca2e..b0aedef6 100755
--- a/src/dynarec/dynarec_arm64_helper.c
+++ b/src/dynarec/dynarec_arm64_helper.c
@@ -909,12 +909,11 @@ int x87_setround(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3)
     MAYUSE(dyn); MAYUSE(ninst);
     MAYUSE(s1); MAYUSE(s2);
     LDRH_U12(s1, xEmu, offsetof(x64emu_t, cw));
-    UBFXx(s2, s1, 10, 2);    // extract round...
-    MOV64x(s1, (uintptr_t)round_map);
-    LDRw_REG_LSL2(s2, s1, s2);
+    RBITw(s2, s1);              // round is on bits 10-11 on x86,
+    LSRw(s2, s2, 20);           // but we want the reverse of that
     MRS_fpcr(s1);               // get fpscr
     MOVx_REG(s3, s1);
-    BFIx(s1, s2, 22, 2);     // inject new round
+    BFIx(s1, s2, 22, 2);        // inject new round
     MSR_fpcr(s1);               // put new fpscr
     return s3;
 }