839c839,854
< cmpAndSwap(blk, pkt);
---
> if (pkt->isAtomicOp()) {
> // extract data from cache and save it into the data field in
> // the packet as a return value from this atomic op
>
> int offset = tags->extractBlkOffset(pkt->getAddr());
> uint8_t *blk_data = blk->data + offset;
> std::memcpy(pkt->getPtr<uint8_t>(), blk_data, pkt->getSize());
>
> // execute AMO operation
> (*(pkt->getAtomicOp()))(blk_data);
>
> // set block status to dirty
> blk->status |= BlkDirty;
> } else {
> cmpAndSwap(blk, pkt);
> }