ARM: Fix signed multiply long and add some unimplemented loads.
authorJack Whitman <jack-m5ml2@cs.york.ac.uk>
Thu, 25 Jun 2009 04:22:52 +0000 (21:22 -0700)
committerJack Whitman <jack-m5ml2@cs.york.ac.uk>
Thu, 25 Jun 2009 04:22:52 +0000 (21:22 -0700)
src/arch/arm/isa/decoder.isa

index 20f5b99f09cea44f5b9aedfa20bb5778b463b237..26f4af60a3ffe18ea29899c02b051e4b2ca906ec 100644 (file)
@@ -388,7 +388,7 @@ decode COND_CODE default Unknown::unknown() {
                             }});
                             0xc: smull_lu({{
                                 int64_t resTemp;
-                                resTemp = ((int64_t)Rm)*((int64_t)Rs);
+                                resTemp = ((int64_t)Rm.sw)*((int64_t)Rs.sw);
                                 Rd = (int32_t)(resTemp & 0xffffffff);
                                 Rn = (int32_t)(resTemp >> 32);
                             }});
@@ -396,6 +396,9 @@ decode COND_CODE default Unknown::unknown() {
                         }
                     }
                     0x1: decode PUIWL {
+                        0x01,0x09: ArmLoadMemory::ldrh_l({{ Rd.uh = Mem.uh;
+                                                          Rn = Rn + Rm; }},
+                                                        {{ EA = Rn; }});
                         0x04,0x0c: ArmStoreMemory::strh_i({{ Mem.uh = Rd.uh;
                                                           Rn = Rn + hilo; }},
                                                        {{ EA = Rn; }});
@@ -425,6 +428,9 @@ decode COND_CODE default Unknown::unknown() {
                     }
                     0x2: decode PUIWL {
                         format ArmLoadMemory {
+                            0x05,0x0d: ldrsb_il({{ Rd.sb = Mem.sb; 
+                                                    Rn = Rn + hilo; }},
+                                                {{ EA = Rn; }});
                             0x11,0x19: ldrsb_pl({{ Rd.sb = Mem.sb; }},
                                                 {{ EA = Rn + Rm; }});
                             0x13,0x1b: ldrsb_pwl({{ Rd.sb = Mem.sb;
@@ -439,6 +445,9 @@ decode COND_CODE default Unknown::unknown() {
                     }
                     0x3: decode PUIWL {
                         format ArmLoadMemory {
+                            0x05,0x0d: ldrsh_il({{ Rd.sh = Mem.sh; 
+                                                    Rn = Rn + hilo; }},
+                                                {{ EA = Rn; }});
                             0x11,0x19: ldrsh_pl({{ Rd.sh = Mem.sh; }},
                                                 {{ EA = Rn + Rm; }});
                             0x13,0x1b: ldrsh_pwl({{ Rd.sh = Mem.sh;
@@ -583,28 +592,28 @@ decode COND_CODE default Unknown::unknown() {
             0x00,0x08: ArmStoreMemory::str_({{ Mem = Rd;
                                                Rn = Rn + disp; }},
                                             {{ EA = Rn; }});
-            0x01,0x09: ArmLoadMemory::ldr_l({{ Rd = Mem;
-                                               Rn = Rn + disp; }},
+            0x01,0x09: ArmLoadMemory::ldr_l({{ Rn = Rn + disp; 
+                                               Rd = Mem; }},
                                             {{ EA = Rn; }});
             0x04,0x0c: ArmStoreMemory::strb_b({{ Mem.ub = Rd.ub;
                                                  Rn = Rn + disp; }},
                                               {{ EA = Rn; }});
-            0x05,0x0d: ArmLoadMemory::ldrb_bl({{ Rd.ub = Mem.ub;
-                                                 Rn = Rn + disp; }},
+            0x05,0x0d: ArmLoadMemory::ldrb_bl({{ Rn = Rn + disp; 
+                                                 Rd.ub = Mem.ub; }},
                                               {{ EA = Rn; }});
             // Pre-indexed variants
             0x10,0x18: ArmStoreMemory::str_p({{ Mem = Rd; }});
             0x11,0x19: ArmLoadMemory::ldr_pl({{ Rd = Mem; }});
             0x12,0x1a: ArmStoreMemory::str_pw({{ Mem = Rd;
                                                  Rn = Rn + disp; }});
-            0x13,0x1b: ArmLoadMemory::ldr_pwl({{ Rd = Mem;
-                                                 Rn = Rn + disp; }});
+            0x13,0x1b: ArmLoadMemory::ldr_pwl({{ Rn = Rn + disp; 
+                                                 Rd = Mem; }});
             0x14,0x1c: ArmStoreMemory::strb_pb({{ Mem.ub = Rd.ub; }});
             0x15,0x1d: ArmLoadMemory::ldrb_pbl({{ Rd.ub = Mem.ub; }});
             0x16,0x1e: ArmStoreMemory::strb_pbw({{ Mem.ub = Rd.ub;
                                                    Rn = Rn + disp; }});
-            0x17,0x1f: ArmLoadMemory::ldrb_pbwl({{ Rd.ub = Mem.ub;
-                                                   Rn = Rn + disp; }});
+            0x17,0x1f: ArmLoadMemory::ldrb_pbwl({{ Rn = Rn + disp; 
+                                                   Rd.ub = Mem.ub; }});
         }
         0x3: decode OPCODE_4 {
             0: decode PUBWL {