/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
#ifndef FIRM_ADT_BITFIDDLE_H
#define FIRM_ADT_BITFIDDLE_H
+#include "compiler.h"
+
#include <limits.h>
#include <assert.h>
-#include "util.h"
/* some functions here assume ints are 32 bit wide */
#define HACKDEL_WORDSIZE 32
*
* @note See hacker's delight, page 27.
*/
-static INLINE __attribute__((const))
-int add_saturated(int x, int y)
+static inline int add_saturated(int x, int y)
{
int sum = x + y;
/*
* @param x A 32-bit word.
* @return The number of bits set in x.
*/
-static INLINE __attribute__((const))
-unsigned popcnt(unsigned x) {
+static inline unsigned popcnt(unsigned x)
+{
x -= ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0f0f0f0f;
* @param x The word.
* @return The number of leading (from the most significant bit) zeros.
*/
-static INLINE __attribute__((const))
-unsigned nlz(unsigned x) {
+static inline unsigned nlz(unsigned x)
+{
#ifdef USE_X86_ASSEMBLY
unsigned res;
if(x == 0)
: "r" (x));
return 31 - res;
#else
- x |= x >> 1;
- x |= x >> 2;
- x |= x >> 4;
- x |= x >> 8;
- x |= x >> 16;
- return popcnt(~x);
+ unsigned y;
+ int n = 32;
+
+ y = x >>16; if (y != 0) { n -= 16; x = y; }
+ y = x >> 8; if (y != 0) { n -= 8; x = y; }
+ y = x >> 4; if (y != 0) { n -= 4; x = y; }
+ y = x >> 2; if (y != 0) { n -= 2; x = y; }
+ y = x >> 1; if (y != 0) return n - 2;
+ return n - x;
#endif
}
* @param x The word.
* @return The number of trailing zeros.
*/
-static INLINE __attribute__((const))
-unsigned ntz(unsigned x) {
+static inline unsigned ntz(unsigned x)
+{
#ifdef USE_X86_ASSEMBLY
unsigned res;
if(x == 0)
* Returns the biggest power of 2 that is equal or smaller than @p x
* (see hackers delight power-of-2 boundaries, page 48)
*/
-static INLINE __attribute__((const))
-unsigned floor_po2(unsigned x)
+static inline unsigned floor_po2(unsigned x)
{
#ifdef USE_X86_ASSEMBLY // in this case nlz is fast
if(x == 0)
* @remark x has to be <= 0x8000000 of course
* @note see hackers delight power-of-2 boundaries, page 48
*/
-static INLINE __attribute__((const))
-unsigned ceil_po2(unsigned x)
+static inline unsigned ceil_po2(unsigned x)
{
if(x == 0)
return 0;
/**
* Tests whether @p x is a power of 2
*/
-static INLINE __attribute__((const))
-int is_po2(unsigned x)
+static inline int is_po2(unsigned x)
{
return (x & (x-1)) == 0;
}