From 0265d950e618571ad09838ad1794447ee936e4cc Mon Sep 17 00:00:00 2001
From: Lioncash <mathew1800@gmail.com>
Date: Tue, 26 May 2015 20:18:47 -0400
Subject: [PATCH] arm_dyncom_thumb: Merge STR/LDR table subsets.

---
 src/core/arm/dyncom/arm_dyncom_thumb.cpp | 33 ++++++++----------------
 1 file changed, 11 insertions(+), 22 deletions(-)

diff --git a/src/core/arm/dyncom/arm_dyncom_thumb.cpp b/src/core/arm/dyncom/arm_dyncom_thumb.cpp
index 08b5c0b774..cdaf214504 100644
--- a/src/core/arm/dyncom/arm_dyncom_thumb.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_thumb.cpp
@@ -189,33 +189,22 @@ tdstate thumb_translate(u32 addr, u32 instr, u32* ainstr, u32* inst_size) {
 
     case 10:
     case 11:
-        // TODO: Format 7 and Format 8 perform the same ARM encoding, so the following could be
-        // merged into a single subset, saving on the following boolean:
-
-        if ((tinstr & (1 << 9)) == 0) {
-            static const ARMword subset[4] = {
-                0xE7800000, // STR  Rd,[Rb,Ro]
-                0xE7C00000, // STRB Rd,[Rb,Ro]
-                0xE7900000, // LDR  Rd,[Rb,Ro]
-                0xE7D00000  // LDRB Rd,[Rb,Ro]
-            };
-
-            *ainstr = subset[(tinstr & 0x0C00) >> 10]   // base
-                |((tinstr & 0x0007) << (12 - 0))        // Rd
-                |((tinstr & 0x0038) << (16 - 3))        // Rb
-                |((tinstr & 0x01C0) >> 6);              // Ro
-
-        } else {
-            static const ARMword subset[4] = {
+        {
+            static const ARMword subset[8] = {
+                0xE7800000, // STR   Rd,[Rb,Ro]
                 0xE18000B0, // STRH  Rd,[Rb,Ro]
+                0xE7C00000, // STRB  Rd,[Rb,Ro]
                 0xE19000D0, // LDRSB Rd,[Rb,Ro]
+                0xE7900000, // LDR   Rd,[Rb,Ro]
                 0xE19000B0, // LDRH  Rd,[Rb,Ro]
+                0xE7D00000, // LDRB  Rd,[Rb,Ro]
                 0xE19000F0  // LDRSH Rd,[Rb,Ro]
             };
-            *ainstr = subset[(tinstr & 0x0C00) >> 10]   // base
-                |((tinstr & 0x0007) << (12 - 0))        // Rd
-                |((tinstr & 0x0038) << (16 - 3))        // Rb
-                |((tinstr & 0x01C0) >> 6);              // Ro
+
+            *ainstr = subset[(tinstr & 0xE00) >> 9] // base
+                |((tinstr & 0x0007) << (12 - 0))    // Rd
+                |((tinstr & 0x0038) << (16 - 3))    // Rb
+                |((tinstr & 0x01C0) >> 6);          // Ro
         }
         break;