about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_0.c9
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c44
2 files changed, 31 insertions, 22 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_0.c b/src/dynarec/rv64/dynarec_rv64_00_0.c
index 1127bf79..bdb1561f 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_0.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_0.c
@@ -231,6 +231,15 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             ANDI(xRAX, xRAX, ~0xff);
             OR(xRAX, xRAX, x1);
             break;
+        case 0x1D:
+            INST_NAME("SBB EAX, Id");
+            READFLAGS(X_CF);
+            SETFLAGS(X_ALL, SF_SET_PENDING);
+            i64 = F32S;
+            MOV64xw(x2, i64);
+            emit_sbb32(dyn, ninst, rex, xRAX, x2, x3, x4, x5);
+            break;
+
         case 0x20:
             INST_NAME("AND Eb, Gb");
             SETFLAGS(X_ALL, SF_SET_PENDING);
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c
index 9004eda3..2fb610a8 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f.c
@@ -557,8 +557,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<16; ++i) {
                         LB(x3, gback, i);
                         LB(x4, wback, fixedaddress+i);
-                        if(rv64_zbb) MIN(x3, x3, x4); else BLT(x3, x4, 4+4);
-                        SB(x3, gback, i);
+                        if(rv64_zbb) MIN(x4, x3, x4); else BLT(x3, x4, 4+4);
+                        SB(x4, gback, i);
                     }
                     break;
                 case 0x39:
@@ -569,8 +569,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<4; ++i) {
                         LW(x3, gback, i*4);
                         LW(x4, wback, fixedaddress+i*4);
-                        if(rv64_zbb) MIN(x3, x3, x4); else BLT(x3, x4, 4+4);
-                        SW(x3, gback, i*4);
+                        if(rv64_zbb) MIN(x4, x3, x4); else BLT(x3, x4, 4+4);
+                        SW(x4, gback, i*4);
                     }
                     break;
                 case 0x3A:
@@ -581,8 +581,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<8; ++i) {
                         LHU(x3, gback, i*2);
                         LHU(x4, wback, fixedaddress+i*2);
-                        if(rv64_zbb) MINU(x3, x3, x4); else BLTU(x3, x4, 4+4);
-                        SH(x3, gback, i*2);
+                        if(rv64_zbb) MINU(x4, x3, x4); else BLTU(x3, x4, 4+4);
+                        SH(x4, gback, i*2);
                     }
                     break;
                 case 0x3B:
@@ -593,8 +593,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<4; ++i) {
                         LWU(x3, gback, i*4);
                         LWU(x4, wback, fixedaddress+i*4);
-                        if(rv64_zbb) MINU(x3, x3, x4); else BLTU(x3, x4, 4+4);
-                        SW(x3, gback, i*4);
+                        if(rv64_zbb) MINU(x4, x3, x4); else BLTU(x3, x4, 4+4);
+                        SW(x4, gback, i*4);
                     }
                     break;
                 case 0x3C:
@@ -605,8 +605,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<16; ++i) {
                         LB(x3, gback, i);
                         LB(x4, wback, fixedaddress+i);
-                        if(rv64_zbb) MAX(x3, x3, x4); else BLT(x4, x3, 4+4);
-                        SB(x3, gback, i);
+                        if(rv64_zbb) MAX(x4, x3, x4); else BLT(x4, x3, 4+4);
+                        SB(x4, gback, i);
                     }
                     break;
                 case 0x3D:
@@ -617,8 +617,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<4; ++i) {
                         LW(x3, gback, i*4);
                         LW(x4, wback, fixedaddress+i*4);
-                        if(rv64_zbb) MAX(x3, x3, x4); else BLT(x4, x3, 4+4);
-                        SW(x3, gback, i*4);
+                        if(rv64_zbb) MAX(x4, x3, x4); else BLT(x4, x3, 4+4);
+                        SW(x4, gback, i*4);
                     }
                     break;
                 case 0x3E:
@@ -629,8 +629,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<8; ++i) {
                         LHU(x3, gback, i*2);
                         LHU(x4, wback, fixedaddress+i*2);
-                        if(rv64_zbb) MAXU(x3, x3, x4); else BLTU(x4, x3, 4+4);
-                        SH(x3, gback, i*2);
+                        if(rv64_zbb) MAXU(x4, x3, x4); else BLTU(x4, x3, 4+4);
+                        SH(x4, gback, i*2);
                     }
                     break;
                 case 0x3F:
@@ -641,8 +641,8 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     for(int i=0; i<4; ++i) {
                         LWU(x3, gback, i*4);
                         LWU(x4, wback, fixedaddress+i*4);
-                        if(rv64_zbb) MAXU(x3, x3, x4); else BLTU(x4, x3, 4+4);
-                        SW(x3, gback, i*4);
+                        if(rv64_zbb) MAXU(x4, x3, x4); else BLTU(x4, x3, 4+4);
+                        SW(x4, gback, i*4);
                     }
                     break;
                 case 0x40:
@@ -1258,10 +1258,10 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     MIN(x3, x3, x5);
                     MAX(x3, x3, x6);
                 } else {
-                    BLT(x3, x6, 4+4);
-                    MV(x3, x6);
-                    BGE(x3, x5, 4+4);
+                    BLT(x3, x5, 4+4);
                     MV(x3, x5);
+                    BGE(x3, x6, 4+4);
+                    MV(x3, x6);
                 }
                 SB(x3, gback, i);
             }
@@ -1274,10 +1274,10 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     MIN(x3, x3, x5);
                     MAX(x3, x3, x6);
                 } else {
-                    BLT(x3, x6, 4+4);
-                    MV(x3, x6);
-                    BGE(x3, x5, 4+4);
+                    BLT(x3, x5, 4+4);
                     MV(x3, x5);
+                    BGE(x3, x6, 4+4);
+                    MV(x3, x6);
                 }
                 SB(x3, gback, 8+i);
             }