ARM: Differentiate between LDM exception return and LDM user regs.
authorAli Saidi <Ali.Saidi@ARM.com>
Wed, 18 Nov 2009 00:02:08 +0000 (18:02 -0600)
committerAli Saidi <Ali.Saidi@ARM.com>
Wed, 18 Nov 2009 00:02:08 +0000 (18:02 -0600)
src/arch/arm/isa/formats/macromem.isa

index 068b48199dbf48f738c211721bab416ac162f381..c834c22cb417a370d29b81781420c3961155f382 100644 (file)
@@ -210,7 +210,9 @@ inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
     microOps[0] = new MicroAddiUop(machInst, INTREG_UREG0, RN, 0);
 
     unsigned reg = 0;
-    bool forceUser = machInst.puswl.psruser;
+    bool force_user = machInst.puswl.psruser & !OPCODE_15;
+    bool exception_ret = machInst.puswl.psruser & OPCODE_15;
+
     for (int i = 1; i < ones + 1; i++) {
         // Find the next register.
         while (!bits(regs, reg))
@@ -218,12 +220,12 @@ inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
         replaceBits(regs, reg, 0);
 
         unsigned regIdx = reg;
-        if (forceUser) {
+        if (force_user) {
             regIdx = intRegForceUser(regIdx);
         }
 
         if (machInst.puswl.loadOp) {
-            if (reg == INTREG_PC && forceUser) {
+            if (reg == INTREG_PC && exception_ret) {
                 // This must be the exception return form of ldm.
                 microOps[i] =
                     new MicroLdrRetUop(machInst, regIdx, INTREG_UREG0, addr);