/*
- * Copyrigth (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))
+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))
+static inline
unsigned popcnt(unsigned x) {
x -= ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
* @param x The word.
* @return The number of leading (from the most significant bit) zeros.
*/
-static INLINE __attribute__((const))
+static inline
unsigned nlz(unsigned x) {
#ifdef USE_X86_ASSEMBLY
unsigned res;
: "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))
+static inline
unsigned ntz(unsigned x) {
#ifdef USE_X86_ASSEMBLY
unsigned res;
* 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))
+static inline
unsigned floor_po2(unsigned x)
{
#ifdef USE_X86_ASSEMBLY // in this case nlz is fast
* @remark x has to be <= 0x8000000 of course
* @note see hackers delight power-of-2 boundaries, page 48
*/
-static INLINE __attribute__((const))
+static inline
unsigned ceil_po2(unsigned x)
{
if(x == 0)
/**
* Tests whether @p x is a power of 2
*/
-static INLINE __attribute__((const))
+static inline
int is_po2(unsigned x)
{
return (x & (x-1)) == 0;