gvsig-raster / libjni-potrace / trunk / libjni-potrace / resources / potrace-1.8 / src / bitops.h @ 1780
History | View | Annotate | Download (1.75 KB)
1 |
/* Copyright (C) 2001-2007 Peter Selinger.
|
---|---|
2 |
This file is part of Potrace. It is free software and it is covered
|
3 |
by the GNU General Public License. See the file COPYING for details. */
|
4 |
|
5 |
/* $Id: bitops.h 147 2007-04-09 00:44:09Z selinger $ */
|
6 |
|
7 |
/* bits.h: this file defines some macros for bit manipulations. We
|
8 |
provide a generic implementation, as well as machine- and
|
9 |
compiler-specific fast implementations */
|
10 |
|
11 |
/* lobit: return the position of the rightmost "1" bit of an int, or
|
12 |
32 if none. hibit: return 1 + the position of the leftmost "1" bit
|
13 |
of an int, or 0 if none. Note: these functions work on 32-bit
|
14 |
integers. */
|
15 |
|
16 |
#ifndef BITOPS_H
|
17 |
#define BITOPS_H
|
18 |
|
19 |
#ifdef HAVE_CONFIG_H
|
20 |
#include "config.h" |
21 |
#endif
|
22 |
|
23 |
/* ---------------------------------------------------------------------- */
|
24 |
/* machine specific macros */
|
25 |
|
26 |
#if defined(HAVE_I386)
|
27 |
|
28 |
static inline unsigned int lobit(unsigned int x) { |
29 |
unsigned int res; |
30 |
asm ("bsf %1,%0\n\t" |
31 |
"jnz 0f\n\t"
|
32 |
"movl $32,%0\n"
|
33 |
"0:"
|
34 |
: "=r" (res)
|
35 |
: "r" (x));
|
36 |
return res;
|
37 |
} |
38 |
|
39 |
static inline unsigned int hibit(unsigned int x) { |
40 |
unsigned int res; |
41 |
|
42 |
asm ("bsr %1,%0\n\t" |
43 |
"jnz 0f\n\t"
|
44 |
"movl $-1,%0\n"
|
45 |
"0:"
|
46 |
: "=r" (res)
|
47 |
: "r" (x));
|
48 |
return res+1; |
49 |
} |
50 |
|
51 |
/* ---------------------------------------------------------------------- */
|
52 |
#else /* generic macros */ |
53 |
|
54 |
static inline unsigned int lobit(unsigned int x) { |
55 |
unsigned int res = 32; |
56 |
while (x & 0xffffff) { |
57 |
x <<= 8;
|
58 |
res -= 8;
|
59 |
} |
60 |
while (x) {
|
61 |
x <<= 1;
|
62 |
res -= 1;
|
63 |
} |
64 |
return res;
|
65 |
} |
66 |
|
67 |
static inline unsigned int hibit(unsigned int x) { |
68 |
unsigned int res = 0; |
69 |
while (x > 0xff) { |
70 |
x >>= 8;
|
71 |
res += 8;
|
72 |
} |
73 |
while (x) {
|
74 |
x >>= 1;
|
75 |
res += 1;
|
76 |
} |
77 |
return res;
|
78 |
} |
79 |
|
80 |
#endif
|
81 |
|
82 |
#endif /* BITOPS_H */ |