changeset 711eb0e64249 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=711eb0e64249
description:
        mem: Refactor assignment of Packet types

        Put the packet type swizzling (that is currently done in a lot of 
places)
        into a refineCommand() member function.

diffstat:

 src/cpu/checker/cpu.cc                  |   5 +---
 src/cpu/inorder/resources/cache_unit.cc |  14 +---------
 src/cpu/o3/lsq_unit.hh                  |   7 ++---
 src/cpu/o3/lsq_unit_impl.hh             |   9 ++----
 src/cpu/ozone/lw_lsq.hh                 |   5 +---
 src/cpu/ozone/lw_lsq_impl.hh            |   5 +---
 src/cpu/simple/atomic.cc                |   5 +--
 src/cpu/simple/timing.cc                |  15 +-----------
 src/mem/packet.hh                       |  41 ++++++++++++++++++++++++++++++++-
 9 files changed, 54 insertions(+), 52 deletions(-)

diffs (223 lines):

diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/checker/cpu.cc
--- a/src/cpu/checker/cpu.cc    Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/checker/cpu.cc    Tue May 13 12:20:48 2014 -0500
@@ -170,10 +170,7 @@
         // Now do the access
         if (fault == NoFault &&
             !memReq->getFlags().isSet(Request::NO_ACCESS)) {
-            PacketPtr pkt = new Packet(memReq,
-                                       memReq->isLLSC() ?
-                                       MemCmd::LoadLockedReq :
-                                       MemCmd::ReadReq);
+            PacketPtr pkt = Packet::createRead(memReq);
 
             pkt->dataStatic(data);
 
diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/inorder/resources/cache_unit.cc
--- a/src/cpu/inorder/resources/cache_unit.cc   Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/inorder/resources/cache_unit.cc   Tue May 13 12:20:48 2014 -0500
@@ -812,21 +812,11 @@
 void
 CacheUnit::buildDataPacket(CacheRequest *cache_req)
 {
-    // Check for LL/SC and if so change command
-    if (cache_req->memReq->isLLSC() && cache_req->pktCmd == MemCmd::ReadReq) {
-        cache_req->pktCmd = MemCmd::LoadLockedReq;
-    }
-
-    if (cache_req->pktCmd == MemCmd::WriteReq) {
-        cache_req->pktCmd =
-            cache_req->memReq->isSwap() ? MemCmd::SwapReq :
-            (cache_req->memReq->isLLSC() ? MemCmd::StoreCondReq 
-             : MemCmd::WriteReq);
-    }
-
     cache_req->dataPkt = new CacheReqPacket(cache_req,
                                             cache_req->pktCmd,
                                             cache_req->instIdx);
+    cache_req->dataPkt->refineCommand(); // handle LL/SC, etc.
+
     DPRINTF(InOrderCachePort, "[slot:%i]: Slot marked for %x\n",
             cache_req->getSlot(),
             cache_req->dataPkt->getAddr());
diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/o3/lsq_unit.hh
--- a/src/cpu/o3/lsq_unit.hh    Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/o3/lsq_unit.hh    Tue May 13 12:20:48 2014 -0500
@@ -776,8 +776,7 @@
 
     // if we the cache is not blocked, do cache access
     bool completedFirst = false;
-    MemCmd command = req->isLLSC() ? MemCmd::LoadLockedReq : MemCmd::ReadReq;
-    PacketPtr data_pkt = new Packet(req, command);
+    PacketPtr data_pkt = Packet::createRead(req);
     PacketPtr fst_data_pkt = NULL;
     PacketPtr snd_data_pkt = NULL;
 
@@ -794,8 +793,8 @@
         fst_data_pkt = data_pkt;
     } else {
         // Create the split packets.
-        fst_data_pkt = new Packet(sreqLow, command);
-        snd_data_pkt = new Packet(sreqHigh, command);
+        fst_data_pkt = Packet::createRead(sreqLow);
+        snd_data_pkt = Packet::createRead(sreqHigh);
 
         fst_data_pkt->dataStatic(load_inst->memData);
         snd_data_pkt->dataStatic(load_inst->memData + sreqLow->getSize());
diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/o3/lsq_unit_impl.hh
--- a/src/cpu/o3/lsq_unit_impl.hh       Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/o3/lsq_unit_impl.hh       Tue May 13 12:20:48 2014 -0500
@@ -839,9 +839,6 @@
         else
             memcpy(inst->memData, storeQueue[storeWBIdx].data, req->getSize());
 
-        MemCmd command =
-            req->isSwap() ? MemCmd::SwapReq :
-            (req->isLLSC() ? MemCmd::StoreCondReq : MemCmd::WriteReq);
         PacketPtr data_pkt;
         PacketPtr snd_data_pkt = NULL;
 
@@ -853,13 +850,13 @@
         if (!TheISA::HasUnalignedMemAcc || !storeQueue[storeWBIdx].isSplit) {
 
             // Build a single data packet if the store isn't split.
-            data_pkt = new Packet(req, command);
+            data_pkt = Packet::createWrite(req);
             data_pkt->dataStatic(inst->memData);
             data_pkt->senderState = state;
         } else {
             // Create two packets if the store is split in two.
-            data_pkt = new Packet(sreqLow, command);
-            snd_data_pkt = new Packet(sreqHigh, command);
+            data_pkt = Packet::createWrite(sreqLow);
+            snd_data_pkt = Packet::createWrite(sreqHigh);
 
             data_pkt->dataStatic(inst->memData);
             snd_data_pkt->dataStatic(inst->memData + sreqLow->getSize());
diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/ozone/lw_lsq.hh
--- a/src/cpu/ozone/lw_lsq.hh   Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/ozone/lw_lsq.hh   Tue May 13 12:20:48 2014 -0500
@@ -631,10 +631,7 @@
     DPRINTF(OzoneLSQ, "Doing timing access for inst PC %#x\n",
             inst->readPC());
 
-    PacketPtr data_pkt =
-        new Packet(req,
-                   (req->isLLSC() ?
-                    MemCmd::LoadLockedReq : Packet::ReadReq));
+    PacketPtr data_pkt = Packet::createRead(req);
     data_pkt->dataStatic(inst->memData);
 
     LSQSenderState *state = new LSQSenderState;
diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/ozone/lw_lsq_impl.hh
--- a/src/cpu/ozone/lw_lsq_impl.hh      Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/ozone/lw_lsq_impl.hh      Tue May 13 12:20:48 2014 -0500
@@ -577,10 +577,7 @@
         memcpy(inst->memData, (uint8_t *)&(*sq_it).data,
                req->getSize());
 
-        MemCmd command =
-            req->isSwap() ? MemCmd::SwapReq :
-            (req->isLLSC() ? MemCmd::WriteReq : MemCmd::StoreCondReq);
-        PacketPtr data_pkt = new Packet(req, command);
+        PacketPtr data_pkt = Packet::createWrite(req);
         data_pkt->dataStatic(inst->memData);
 
         LSQSenderState *state = new LSQSenderState;
diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/simple/atomic.cc
--- a/src/cpu/simple/atomic.cc  Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/simple/atomic.cc  Tue May 13 12:20:48 2014 -0500
@@ -340,9 +340,8 @@
 
         // Now do the access.
         if (fault == NoFault && !req->getFlags().isSet(Request::NO_ACCESS)) {
-            Packet pkt = Packet(req,
-                                req->isLLSC() ? MemCmd::LoadLockedReq :
-                                MemCmd::ReadReq);
+            Packet pkt(req, MemCmd::ReadReq);
+            pkt.refineCommand();
             pkt.dataStatic(data);
 
             if (req->isMmappedIpr())
diff -r 0b4d10f53c2d -r 711eb0e64249 src/cpu/simple/timing.cc
--- a/src/cpu/simple/timing.cc  Wed Sep 03 07:42:46 2014 -0400
+++ b/src/cpu/simple/timing.cc  Tue May 13 12:20:48 2014 -0500
@@ -349,20 +349,7 @@
 void
 TimingSimpleCPU::buildPacket(PacketPtr &pkt, RequestPtr req, bool read)
 {
-    MemCmd cmd;
-    if (read) {
-        cmd = MemCmd::ReadReq;
-        if (req->isLLSC())
-            cmd = MemCmd::LoadLockedReq;
-    } else {
-        cmd = MemCmd::WriteReq;
-        if (req->isLLSC()) {
-            cmd = MemCmd::StoreCondReq;
-        } else if (req->isSwap()) {
-            cmd = MemCmd::SwapReq;
-        }
-    }
-    pkt = new Packet(req, cmd);
+    pkt = read ? Packet::createRead(req) : Packet::createWrite(req);
 }
 
 void
diff -r 0b4d10f53c2d -r 711eb0e64249 src/mem/packet.hh
--- a/src/mem/packet.hh Wed Sep 03 07:42:46 2014 -0400
+++ b/src/mem/packet.hh Tue May 13 12:20:48 2014 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013 ARM Limited
+ * Copyright (c) 2012-2014 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -666,7 +666,46 @@
 
         flags.set(pkt->flags & (VALID_ADDR|VALID_SIZE));
         flags.set(pkt->flags & STATIC_DATA);
+    }
 
+    /**
+     * Change the packet type based on request type.
+     */
+    void
+    refineCommand()
+    {
+        if (cmd == MemCmd::ReadReq) {
+            if (req->isLLSC()) {
+                cmd = MemCmd::LoadLockedReq;
+            }
+        } else if (cmd == MemCmd::WriteReq) {
+            if (req->isLLSC()) {
+                cmd = MemCmd::StoreCondReq;
+            } else if (req->isSwap()) {
+                cmd = MemCmd::SwapReq;
+            }
+        }
+    }
+
+    /**
+     * Constructor-like methods that return Packets based on Request objects.
+     * Will call refineCommand() to fine-tune the Packet type if it's not a
+     * vanilla read or write.
+     */
+    static PacketPtr
+    createRead(Request *req)
+    {
+        PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
+        pkt->refineCommand();
+        return pkt;
+    }
+
+    static PacketPtr
+    createWrite(Request *req)
+    {
+        PacketPtr pkt = new Packet(req, MemCmd::WriteReq);
+        pkt->refineCommand();
+        return pkt;
     }
 
     /**
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to