mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 17:25:21 +00:00
[block-freq] Add a right shift to BlockFrequency that saturates at 1.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197302 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -55,6 +55,9 @@ public:
|
|||||||
BlockFrequency &operator+=(const BlockFrequency &Freq);
|
BlockFrequency &operator+=(const BlockFrequency &Freq);
|
||||||
const BlockFrequency operator+(const BlockFrequency &Freq) const;
|
const BlockFrequency operator+(const BlockFrequency &Freq) const;
|
||||||
|
|
||||||
|
/// \brief Shift block frequency to the right by count digits saturating to 1.
|
||||||
|
BlockFrequency &operator>>=(const unsigned count);
|
||||||
|
|
||||||
/// \brief Scale the given BlockFrequency by N/D. Return the remainder from
|
/// \brief Scale the given BlockFrequency by N/D. Return the remainder from
|
||||||
/// the division by D. Upon overflow, the routine will saturate.
|
/// the division by D. Upon overflow, the routine will saturate.
|
||||||
uint32_t scale(const BranchProbability &Prob);
|
uint32_t scale(const BranchProbability &Prob);
|
||||||
|
@@ -145,6 +145,18 @@ BlockFrequency::operator+(const BlockFrequency &Prob) const {
|
|||||||
return Freq;
|
return Freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
|
||||||
|
// Frequency can never be 0 by design.
|
||||||
|
assert(Frequency != 0);
|
||||||
|
|
||||||
|
// Shift right by count.
|
||||||
|
Frequency >>= count;
|
||||||
|
|
||||||
|
// Saturate to 1 if we are 0.
|
||||||
|
Frequency |= Frequency == 0;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t BlockFrequency::scale(const BranchProbability &Prob) {
|
uint32_t BlockFrequency::scale(const BranchProbability &Prob) {
|
||||||
return scale(Prob.getNumerator(), Prob.getDenominator());
|
return scale(Prob.getNumerator(), Prob.getDenominator());
|
||||||
}
|
}
|
||||||
|
@@ -237,4 +237,12 @@ TEST(BlockFrequencyTest, ProbabilityCompare) {
|
|||||||
EXPECT_FALSE(BigZero >= BigOne);
|
EXPECT_FALSE(BigZero >= BigOne);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(BlockFrequencyTest, SaturatingRightShift) {
|
||||||
|
BlockFrequency Freq(0x10080ULL);
|
||||||
|
Freq >>= 2;
|
||||||
|
EXPECT_EQ(Freq.getFrequency(), 0x4020ULL);
|
||||||
|
Freq >>= 20;
|
||||||
|
EXPECT_EQ(Freq.getFrequency(), 0x1ULL);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user