O3: Fix offset calculation into storeQueue buffer for store->load forwarding
authorGeoffrey Blake <geoffrey.blake@arm.com>
Mon, 23 May 2011 15:40:21 +0000 (10:40 -0500)
committerGeoffrey Blake <geoffrey.blake@arm.com>
Mon, 23 May 2011 15:40:21 +0000 (10:40 -0500)
Calculation of offset to copy from storeQueue[idx].data structure for load to
store forwarding fixed to be difference in bytes between store and load virtual
addresses.  Previous method would induce bug where a load would index into
buffer at the wrong location.

src/cpu/o3/lsq_unit.hh

index 8e311d2759ffa6afbb7a438dcff583f9ff5acfe2..d83dc868fcd880d782184ffe097032733e2365be 100644 (file)
@@ -616,7 +616,7 @@ LSQUnit<Impl>::read(Request *req, Request *sreqLow, Request *sreqHigh,
         // If the store's data has all of the data needed, we can forward.
         if ((store_has_lower_limit && store_has_upper_limit)) {
             // Get shift amount for offset into the store's data.
-            int shift_amt = req->getVaddr() & (store_size - 1);
+            int shift_amt = req->getVaddr() - storeQueue[store_idx].inst->effAddr;
 
             memcpy(data, storeQueue[store_idx].data + shift_amt,
                    req->getSize());