X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Fbitfiddle.h;h=29ff4387e733c7d74db14aa3ceb38a846fd3febc;hb=48b0fa8564962b17e136a0f925eff458ca16abef;hp=885e0fea1736be566b7e776ef9ac8ef4ca5b48fc;hpb=863d31d7a5c8210432fef88b30fc3e8353131538;p=libfirm diff --git a/ir/adt/bitfiddle.h b/ir/adt/bitfiddle.h index 885e0fea1..29ff4387e 100644 --- a/ir/adt/bitfiddle.h +++ b/ir/adt/bitfiddle.h @@ -1,3 +1,22 @@ +/* + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + /** * @file * @date 28.9.2004 @@ -5,12 +24,13 @@ * @author Sebastian Hack, Matthias Braun * @version $Id$ */ -#ifndef _FIRM_BITFIDDLE_H_ -#define _FIRM_BITFIDDLE_H_ +#ifndef FIRM_ADT_BITFIDDLE_H +#define FIRM_ADT_BITFIDDLE_H + +#include "compiler.h" #include #include -#include "util.h" /* some functions here assume ints are 32 bit wide */ #define HACKDEL_WORDSIZE 32 @@ -25,7 +45,7 @@ COMPILETIME_ASSERT(UINT_MAX == 4294967295U, uintmax) * * @note See hacker's delight, page 27. */ -static inline __attribute__((const)) +static inline int add_saturated(int x, int y) { int sum = x + y; @@ -54,7 +74,7 @@ int add_saturated(int x, int 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); @@ -69,7 +89,7 @@ unsigned popcnt(unsigned x) { * @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; @@ -81,12 +101,15 @@ unsigned nlz(unsigned x) { : "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 } @@ -95,7 +118,7 @@ unsigned nlz(unsigned x) { * @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; @@ -139,7 +162,7 @@ unsigned ntz(unsigned x) { * 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 @@ -162,7 +185,7 @@ unsigned floor_po2(unsigned x) * @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) @@ -186,7 +209,7 @@ unsigned ceil_po2(unsigned x) /** * 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;