X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FBlockFrequency.cpp;h=5e45e46cf9743d73bb5f44f221dba936aa7f8571;hb=e2ff00e117ba9b758b298e671f65c0b002f8a52d;hp=08fa620eb8839ce93e258a40642f5dc18c0b5d44;hpb=d7648ff20f8bbc8217a26576ca96addc55e003de;p=oota-llvm.git diff --git a/lib/Support/BlockFrequency.cpp b/lib/Support/BlockFrequency.cpp index 08fa620eb88..5e45e46cf97 100644 --- a/lib/Support/BlockFrequency.cpp +++ b/lib/Support/BlockFrequency.cpp @@ -18,10 +18,8 @@ using namespace llvm; -namespace { - -/// mult96bit - Multiply FREQ by N and store result in W array. -void mult96bit(uint64_t freq, uint32_t N, uint64_t W[2]) { +/// Multiply FREQ by N and store result in W array. +static void mult96bit(uint64_t freq, uint32_t N, uint64_t W[2]) { uint64_t u0 = freq & UINT32_MAX; uint64_t u1 = freq >> 32; @@ -42,16 +40,18 @@ void mult96bit(uint64_t freq, uint32_t N, uint64_t W[2]) { } -/// div96bit - Divide 96-bit value stored in W array by D. +/// Divide 96-bit value stored in W array by D. /// Return 64-bit quotient, saturated to UINT64_MAX on overflow. -uint64_t div96bit(uint64_t W[2], uint32_t D) { +static uint64_t div96bit(uint64_t W[2], uint32_t D) { uint64_t y = W[0]; uint64_t x = W[1]; - int i; + unsigned i; + + assert(x != 0 && "This is really a 64-bit division"); // This long division algorithm automatically saturates on overflow. - for (i = 1; i <= 64 && x; ++i) { - uint32_t t = (int)x >> 31; + for (i = 0; i < 64 && x; ++i) { + uint32_t t = -((x >> 31) & 1); // Splat bit 31 to bits 0-31. x = (x << 1) | (y >> 63); y = y << 1; if ((x | t) >= D) { @@ -60,10 +60,9 @@ uint64_t div96bit(uint64_t W[2], uint32_t D) { } } - return y << (64 - i + 1); + return y << (64 - i); } -} void BlockFrequency::scale(uint32_t N, uint32_t D) { assert(D != 0 && "Division by zero"); @@ -74,7 +73,7 @@ void BlockFrequency::scale(uint32_t N, uint32_t D) { uint64_t MulRes = (MulHi << 32) + MulLo; // If the product fits in 64 bits, just use built-in division. - if (MulHi <= UINT32_MAX && MulRes <= MulLo) { + if (MulHi <= UINT32_MAX && MulRes >= MulLo) { Frequency = MulRes / D; return; }