23 uint64_t u0 = freq & UINT32_MAX;
24 uint64_t u1 = freq >> 32;
37 static uint64_t
divrem96bit(uint32_t W[3], uint32_t D, uint32_t *Rout) {
40 assert(W[2] &&
"This routine assumes that W[2] is non-zero since if W[2] is "
41 "zero, the caller should just use 64/32 hardware.");
42 uint32_t Q[3] = { 0, 0, 0 };
51 for (
int i = 2; i >= 0; --i) {
52 uint64_t PartialD = uint64_t(R) << 32 | W[i];
56 }
else if (PartialD < D) {
58 R = uint32_t(PartialD);
59 }
else if (PartialD == D) {
63 Q[i] = uint32_t(PartialD / D);
64 R = uint32_t(PartialD - (Q[i] * D));
75 Result = uint64_t(Q[0]) | (uint64_t(Q[1]) << 32);
84 uint32_t BlockFrequency::scale(uint32_t
N, uint32_t D) {
85 assert(D != 0 &&
"Division by zero");
88 uint64_t MulLo = (Frequency & UINT32_MAX) * N;
89 uint64_t MulHi = (Frequency >> 32) * N;
90 uint64_t MulRes = (MulHi << 32) + MulLo;
93 if (MulHi <= UINT32_MAX && MulRes >= MulLo) {
94 Frequency = MulRes / D;
131 uint64_t Before = Freq.Frequency;
132 Frequency += Freq.Frequency;
135 if (Frequency < Before)
136 Frequency = UINT64_MAX;
162 }
while (Rem >= Eps/2);
BlockFrequency & operator+=(const BlockFrequency &Freq)
Adds another block frequency using saturating arithmetic.
uint32_t getNumerator() const
static uint64_t getEntryFrequency()
Returns the frequency of the entry block of the function.
BlockFrequency & operator/=(const BranchProbability &Prob)
Divide by a non-zero branch probability using saturating arithmetic.
const BlockFrequency operator+(const BlockFrequency &Freq) const
void print(raw_ostream &OS) const
const BlockFrequency operator*(const BranchProbability &Prob) const
BlockFrequency & operator*=(const BranchProbability &Prob)
Multiplies with a branch probability. The computation will never overflow.
BlockFrequency operator/(const BranchProbability &Prob) const
uint32_t getDenominator() const
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
static uint64_t divrem96bit(uint32_t W[3], uint32_t D, uint32_t *Rout)
static void mult96bit(uint64_t freq, uint32_t N, uint32_t W[3])
Multiply FREQ by N and store result in W array.