base/intmath.hh:
Don't return -1 in FloorLog2. That's wierd. Assert instead.
If you care about this, you should check for zero yourself.
Create seprate versions for uint32_t, uint64_t, int32_t, and
int64_t. signed vs unsigned so that error checking can be done
correctly. 32 vs 64 for speed.
Finally, fix a little bug in CeilLog2 that will make it return
the correct result for 1.
kern/tru64/tru64_events.cc:
fix #includes
--HG--
extra : convert_revision :
c47915fc417fdc194a5561949a5366ffb266e693
#ifndef __INTMATH_HH__
#define __INTMATH_HH__
+#include <assert.h>
+
+#include "sim/host.hh"
+
// Returns the prime number one less than n.
int PrevPrime(int n);
return n != 0 && LeastSigBit(n) == n;
}
-template <class T>
inline int
-FloorLog2(T x)
+FloorLog2(uint32_t x)
{
- if (x == 0)
- return -1;
+ assert(x > 0);
int y = 0;
return y;
}
+inline int
+FloorLog2(uint64_t x)
+{
+ assert(x > 0);
+
+ int y = 0;
+
+ if (x & ULL(0xffffffff00000000)) { y += 32; x >>= 32; }
+ if (x & ULL(0x00000000ffff0000)) { y += 16; x >>= 16; }
+ if (x & ULL(0x000000000000ff00)) { y += 8; x >>= 8; }
+ if (x & ULL(0x00000000000000f0)) { y += 4; x >>= 4; }
+ if (x & ULL(0x000000000000000c)) { y += 2; x >>= 2; }
+ if (x & ULL(0x0000000000000002)) { y += 1; }
+
+ return y;
+}
+
+inline int
+FloorLog2(int32_t x)
+{
+ assert(x > 0);
+ return FloorLog2(x);
+}
+
+inline int
+FloorLog2(int64_t x)
+{
+ assert(x > 0);
+ return FloorLog2(x);
+}
+
template <class T>
inline int
CeilLog2(T n)
{
- return FloorLog2(n - 1) + 1;
+ if (n == 1)
+ return 0;
+
+ return FloorLog2(n - (T)1) + 1;
}
template <class T>
*/
#include "cpu/exec_context.hh"
+#include "cpu/base_cpu.hh"
#include "cpu/full_cpu/bpred.hh"
-#include "cpu/full_cpu/cpu.hh"
+#include "cpu/full_cpu/full_cpu.hh"
#include "kern/tru64/dump_mbuf.hh"
#include "kern/tru64/printf.hh"
#include "kern/tru64/tru64_events.hh"