ARM: Fix double precision load/store multiple decrement.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:15 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:15 +0000 (12:58 -0500)
When decrementing, the higher addressed half of a double word is at a 4 byte
smaller displacement.

src/arch/arm/insts/macromem.cc

index 01ec3e1d87cf29760d54ffe508e4bf5669f9a512..e47f4c21cf021c27b92bb33adbe3f77b12a2eca1 100644 (file)
@@ -161,7 +161,7 @@ MacroVFPMemOp::MacroVFPMemOp(const char *mnem, ExtMachInst machInst,
     numMicroops = count * (single ? 1 : 2) + (writeback ? 1 : 0);
     microOps = new StaticInstPtr[numMicroops];
 
-    uint32_t addr = 0;
+    int64_t addr = 0;
 
     if (!up)
         addr = 4 * offset;
@@ -172,21 +172,22 @@ MacroVFPMemOp::MacroVFPMemOp(const char *mnem, ExtMachInst machInst,
             microOps[i++] = new MicroLdrFpUop(machInst, vd++, rn,
                                               tempUp, addr);
             if (!single)
-                microOps[i++] = new MicroLdrFpUop(machInst, vd++, rn,
-                                                  tempUp, addr + 4);
+                microOps[i++] = new MicroLdrFpUop(machInst, vd++, rn, tempUp,
+                                                  addr + (up ? 4 : -4));
         } else {
             microOps[i++] = new MicroStrFpUop(machInst, vd++, rn,
                                               tempUp, addr);
             if (!single)
-                microOps[i++] = new MicroStrFpUop(machInst, vd++, rn,
-                                                  tempUp, addr + 4);
+                microOps[i++] = new MicroStrFpUop(machInst, vd++, rn, tempUp,
+                                                  addr + (up ? 4 : -4));
         }
         if (!tempUp) {
             addr -= (single ? 4 : 8);
             // The microops don't handle negative displacement, so turn if we
             // hit zero, flip polarity and start adding.
-            if (addr == 0) {
+            if (addr <= 0) {
                 tempUp = true;
+                addr = -addr;
             }
         } else {
             addr += (single ? 4 : 8);