diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc index 871125a17e..b7e9357029 100644 --- a/src/mem/cache/mshr.cc +++ b/src/mem/cache/mshr.cc @@ -140,6 +140,7 @@ MSHR::TargetList::updateWriteFlags(PacketPtr pkt) Request::MEM_SWAP_COND | Request::SECURE | Request::LOCKED_RMW; const auto &req_flags = pkt->req->getFlags(); bool compat_write = !req_flags.isSet(no_merge_flags); + bool masked_write = pkt->isMaskedWrite(); // if this is the first write, it might be a whole // line write and even if we can't merge any @@ -147,7 +148,7 @@ MSHR::TargetList::updateWriteFlags(PacketPtr pkt) // it as a whole line write (e.g., SECURE whole line // write) bool first_write = empty(); - if (first_write || compat_write) { + if (!masked_write && (first_write || compat_write)) { auto offset = pkt->getOffset(blkSize); auto begin = writesBitmap.begin() + offset; std::fill(begin, begin + pkt->getSize(), true); diff --git a/src/mem/packet.hh b/src/mem/packet.hh index a80b918798..9d720fb9a0 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -625,7 +625,8 @@ class Packet : public Printable bool isWholeLineWrite(unsigned blk_size) { return (cmd == MemCmd::WriteReq || cmd == MemCmd::WriteLineReq) && - getOffset(blk_size) == 0 && getSize() == blk_size; + getOffset(blk_size) == 0 && getSize() == blk_size && + !isMaskedWrite(); } //@{