O3: Support SWAP and predicated loads/store in ARM.
authorMin Kyu Jeong <minkyu.jeong@arm.com>
Wed, 8 Dec 2010 00:19:57 +0000 (16:19 -0800)
committerMin Kyu Jeong <minkyu.jeong@arm.com>
Wed, 8 Dec 2010 00:19:57 +0000 (16:19 -0800)
src/arch/arm/isa/insts/swap.isa
src/cpu/o3/iew.hh
src/cpu/o3/iew_impl.hh
src/cpu/o3/lsq_unit_impl.hh

index c5c92c93530d4d4713906ae7393aa215311e7897..d924f3029a14454cebfaa3cdc78e59051d5f85ba 100644 (file)
@@ -65,7 +65,9 @@ let {{
             (newHeader,
              newDecoder,
              newExec) = self.fillTemplates(self.name, self.Name, codeBlobs,
-                                           self.memFlags, [], base = 'Swap')
+                                           self.memFlags,
+                                           ['IsStoreConditional'],
+                                           base = 'Swap')
             header_output += newHeader
             decoder_output += newDecoder
             exec_output += newExec
index 3c37a47cad6f36451643bb7e1171267a6ef83b6a..df9180ea6e58ee2c64390d612d3b31a6429c5bbc 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2010 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2004-2006 The Regents of The University of Michigan
  * All rights reserved.
  *
@@ -225,7 +237,7 @@ class DefaultIEW
     {
         if (wbOutstanding-- == wbMax)
             ableToIssue = true;
-        DPRINTF(IEW, "wbOutstanding: %i\n", wbOutstanding);
+        DPRINTF(IEW, "wbOutstanding: %i [sn:%lli]\n", wbOutstanding, sn);
         assert(wbOutstanding >= 0);
 #ifdef DEBUG
         assert(wbList.find(sn) != wbList.end());
index 608e70cde9894f9f7a3a1189cb27b8491d32bfe1..521f070891eafbc4edd89fd1d77fb7963a190c0a 100644 (file)
@@ -1236,20 +1236,13 @@ DefaultIEW<Impl>::executeInsts()
                 fault = ldstQueue.executeStore(inst);
 
                 // If the store had a fault then it may not have a mem req
-                if (!inst->isStoreConditional() && fault == NoFault) {
-                    inst->setExecuted();
-
-                    instToCommit(inst);
-                } else if (fault != NoFault) {
-                    // If the instruction faulted, then we need to send it along to commit
-                    // without the instruction completing.
-                    DPRINTF(IEW, "Store has fault %s! [sn:%lli]\n",
-                            fault->name(), inst->seqNum);
-
+                if (fault != NoFault || inst->readPredicate() == false ||
+                        !inst->isStoreConditional()) {
+                    // If the instruction faulted, then we need to send it along
+                    // to commit without the instruction completing.
                     // Send this instruction to commit, also make sure iew stage
                     // realizes there is activity.
                     inst->setExecuted();
-
                     instToCommit(inst);
                     activityThisCycle();
                 }
index 345d3ea696793bd1e23c498a517fef87257dabb4..807c0b527fa3576a98df5e3a91bf9f1bf1b38f99 100644 (file)
@@ -531,10 +531,14 @@ LSQUnit<Impl>::executeStore(DynInstPtr &store_inst)
     Fault store_fault = store_inst->initiateAcc();
 
     if (storeQueue[store_idx].size == 0) {
-        DPRINTF(LSQUnit,"Fault on Store PC %s, [sn:%lli],Size = 0\n",
+        DPRINTF(LSQUnit,"Fault on Store PC %s, [sn:%lli], Size = 0\n",
                 store_inst->pcState(), store_inst->seqNum);
 
         return store_fault;
+    } else if (store_inst->readPredicate() == false) {
+        DPRINTF(LSQUnit, "Store [sn:%lli] not executed from predication\n",
+                store_inst->seqNum);
+        return store_fault;
     }
 
     assert(store_fault == NoFault);