Quellcode durchsuchen

Merge pull request #848 from lioncash/ldm

arm_dyncom_thumb: Fix handling of writeback for thumb LDMIA
bunnei vor 11 Jahren
Ursprung
Commit
b1cb0a3f2c
1 geänderte Dateien mit 19 neuen und 5 gelöschten Zeilen
  1. 19 5
      src/core/arm/dyncom/arm_dyncom_thumb.cpp

+ 19 - 5
src/core/arm/dyncom/arm_dyncom_thumb.cpp

@@ -327,11 +327,25 @@ tdstate thumb_translate(u32 addr, u32 instr, u32* ainstr, u32* inst_size) {
 
     case 24: //  STMIA
     case 25: //  LDMIA
-        *ainstr = ((tinstr & (1 << 11))         // base
-               ? 0xE8B00000                     // LDMIA
-               : 0xE8A00000)                    // STMIA
-            |((tinstr & 0x0700) << (16 - 8))    // Rb
-            |(tinstr & 0x00FF);                 // mask8
+        if (tinstr & (1 << 11))
+        {
+            unsigned int base = 0xE8900000;
+            unsigned int rn = BITS(tinstr, 8, 10);
+
+            // Writeback
+            if ((tinstr & (1 << rn)) == 0)
+                base |= (1 << 21);
+
+            *ainstr = base           // base (LDMIA)
+                | (rn << 16)         // Rn
+                | (tinstr & 0x00FF); // Register list
+        }
+        else
+        {
+            *ainstr = 0xE8A00000              // base (STMIA)
+                | (BITS(tinstr, 8, 10) << 16) // Rn
+                | (tinstr & 0x00FF);          // Register list
+        }
         break;
 
     case 26: // Bcc