diff --git a/src/mem/ruby/common/WriteMask.hh b/src/mem/ruby/common/WriteMask.hh index f1e5f371de..895584a5d2 100644 --- a/src/mem/ruby/common/WriteMask.hh +++ b/src/mem/ruby/common/WriteMask.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 ARM Limited + * Copyright (c) 2020,2021 ARM Limited * All rights reserved. * * The license below extends only to copyright in the software and shall @@ -159,6 +159,20 @@ class WriteMask return true; } + void + andMask(const WriteMask & writeMask) + { + assert(mSize == writeMask.mSize); + for (int i = 0; i < mSize; i++) { + mMask[i] = (mMask.at(i)) & (writeMask.mMask.at(i)); + } + + if (writeMask.mAtomic) { + mAtomic = true; + mAtomicOp = writeMask.mAtomicOp; + } + } + void orMask(const WriteMask & writeMask) { diff --git a/src/mem/ruby/protocol/RubySlicc_Exports.sm b/src/mem/ruby/protocol/RubySlicc_Exports.sm index 1b67dc6033..e48cca524e 100644 --- a/src/mem/ruby/protocol/RubySlicc_Exports.sm +++ b/src/mem/ruby/protocol/RubySlicc_Exports.sm @@ -57,6 +57,7 @@ structure(WriteMask, external="yes", desc="...") { bool isEmpty(); bool isFull(); bool isOverlap(WriteMask); + void andMask(WriteMask); void orMask(WriteMask); void setInvertedMask(WriteMask); void fillMask();