ARM: NEON instruction templates modified to set the predicate flag to false when...
authorGiacomo Gabrielli <Giacomo.Gabrielli@arm.com>
Wed, 23 Feb 2011 21:10:50 +0000 (15:10 -0600)
committerGiacomo Gabrielli <Giacomo.Gabrielli@arm.com>
Wed, 23 Feb 2011 21:10:50 +0000 (15:10 -0600)
src/arch/arm/isa/templates/macromem.isa
src/arch/arm/isa/templates/mem.isa
src/arch/arm/isa/templates/neon.isa

index 7620fb871e54614619f180334adc37082ad4d511..b7ca7fa488bf2dbf8080e9fb3952d4c23b62e9aa 100644 (file)
@@ -202,6 +202,8 @@ def template MicroNeonMixExecute {{
             {
                 %(op_wb)s;
             }
+        } else {
+            xc->setPredicate(false);
         }
 
         if (fault == NoFault && machInst.itstateMask != 0) {
index 66384331bc9f113db10bc0b76a144889cb9169f3..3d073b3225fb00a963cb625c7afa0ce9e44b95b4 100644 (file)
@@ -234,6 +234,8 @@ def template NeonLoadExecute {{
             if (fault == NoFault) {
                 %(op_wb)s;
             }
+        } else {
+            xc->setPredicate(false);
         }
 
         if (fault == NoFault && machInst.itstateMask != 0 &&
@@ -313,6 +315,8 @@ def template NeonStoreExecute {{
             if (fault == NoFault) {
                 %(op_wb)s;
             }
+        } else {
+            xc->setPredicate(false);
         }
 
         if (fault == NoFault && machInst.itstateMask != 0 &&
@@ -459,6 +463,8 @@ def template NeonStoreInitiateAcc {{
                 fault = xc->writeBytes(memUnion.bytes, %(size)d, EA,
                                        memAccessFlags, NULL);
             }
+        } else {
+            xc->setPredicate(false);
         }
 
         if (fault == NoFault && machInst.itstateMask != 0 &&
@@ -515,9 +521,12 @@ def template NeonLoadInitiateAcc {{
             if (fault == NoFault) {
                 fault = xc->readBytes(EA, NULL, %(size)d, memAccessFlags);
             }
-        } else if (fault == NoFault && machInst.itstateMask != 0 &&
-                (!isMicroop() || isLastMicroop())) {
-            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
+        } else {
+            xc->setPredicate(false);
+            if (fault == NoFault && machInst.itstateMask != 0 &&
+                   (!isMicroop() || isLastMicroop())) {
+                xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
+            }
         }
 
         return fault;
index 02c2bb30d3077eaa0cc41357931f6dd972ef1346..2e88c9333e09e3b380d2944c0113bd87769f71a4 100644 (file)
@@ -225,6 +225,8 @@ def template NeonEqualRegExecute {{
             {
                 %(op_wb)s;
             }
+        } else {
+            xc->setPredicate(false);
         }
 
         if (fault == NoFault && machInst.itstateMask != 0) {
@@ -275,6 +277,8 @@ def template NeonUnequalRegExecute {{
             {
                 %(op_wb)s;
             }
+        } else {
+            xc->setPredicate(false);
         }
 
         if (fault == NoFault && machInst.itstateMask != 0) {