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