about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-04-17 10:13:22 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-04-17 10:13:22 +0200
commit5b03a1e2186b7e74ca0d45dbdcb8a5032d8530fb (patch)
tree5c67f20f9aa246070cc7ed198755b7fb34d60607
parent77db70f9b520817bd1714d2fe9be417b79e24c98 (diff)
downloadbox64-5b03a1e2186b7e74ca0d45dbdcb8a5032d8530fb.tar.gz
box64-5b03a1e2186b7e74ca0d45dbdcb8a5032d8530fb.zip
[DYNAREC] Added 66 F0 FF and F0 08 opcodes
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index aea67cae..201fa33e 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -100,6 +100,34 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             DMB_ISH();
             break;
 
+        case 0x08:
+            INST_NAME("LOCK OR Eb, Gb");
+            SETFLAGS(X_ALL, SF_SET_PENDING);
+            nextop = F8;
+            DMB_ISH();
+            GETGB(x2);
+            if((nextop&0xC0)==0xC0) {
+                if(rex.rex) {
+                    wback = xRAX + (nextop&7) + (rex.b<<3);
+                    wb2 = 0;
+                } else {
+                    wback = (nextop&7);    
+                    wb2 = (wback>>2);      
+                    wback = xRAX+(wback&3);
+                }
+                UBFXw(x1, wback, wb2*8, 8);   
+                emit_or8(dyn, ninst, x1, x2, x4, x3);
+                BFIx(wback, x1, wb2*8, 8);
+            } else {                   
+                addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, 0);
+                MARKLOCK;
+                LDAXRB(x1, wback);
+                emit_or8(dyn, ninst, x1, x2, x4, x3);
+                STLXRB(x4, x1, wback);
+                CBNZx_MARKLOCK(x4);
+            }
+            DMB_ISH();
+            break;
         case 0x09:
             INST_NAME("LOCK OR Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING);
@@ -531,6 +559,54 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }
                     DMB_ISH();
                     break;
+
+                    case 0xFF:
+                        nextop = F8;
+                        switch((nextop>>3)&7)
+                        {
+                            case 0: // INC Ew
+                                INST_NAME("LOCK INC Ew");
+                                SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING);
+                                DMB_ISH();
+                                if(MODREG) {
+                                    ed = xRAX+(nextop&7)+(rex.b<<3);
+                                    UXTHw(x6, ed);
+                                    emit_inc16(dyn, ninst, x6, x5, x3);
+                                    BFIx(ed, x6, 0, 16);
+                                } else {
+                                    addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, 0);
+                                    MARKLOCK;
+                                    LDAXRH(x1, wback);
+                                    emit_inc16(dyn, ninst, x1, x3, x4);
+                                    STLXRH(x3, x1, wback);
+                                    CBNZx_MARKLOCK(x3);
+                                }
+                                DMB_ISH();
+                                break;
+                            case 1: //DEC Ew
+                                INST_NAME("LOCK DEC Ew");
+                                SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING);
+                                DMB_ISH();
+                                if(MODREG) {
+                                    ed = xRAX+(nextop&7)+(rex.b<<3);
+                                    UXTHw(x6, ed);
+                                    emit_dec16(dyn, ninst, x6, x5, x3);
+                                    BFIx(ed, x6, 0, 16);
+                                } else {
+                                    addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, 0);
+                                    MARKLOCK;
+                                    LDAXRH(x1, wback);
+                                    emit_dec16(dyn, ninst, x1, x3, x4);
+                                    STLXRH(x3, x1, wback);
+                                    CBNZx_MARKLOCK(x3);
+                                }
+                                DMB_ISH();
+                                break;
+                            default:
+                                DEFAULT;
+                        }
+                        break;
+
                 default:
                     DEFAULT;
             }