e3407bab9b94a7a3ea348e39e6893b0067679b64
[ust.git] / include / ust / processor.h
1 /* Copyright (C) 2009 Pierre-Marc Fournier
2 *
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17
18 #ifndef UST_PROCESSOR_H
19 #define UST_PROCESSOR_H
20
21 #define ____cacheline_aligned __attribute__((aligned(CAA_CACHE_LINE_SIZE)))
22
23 #ifdef __i386
24
25 static inline int fls(int x)
26 {
27 int r;
28 asm("bsrl %1,%0\n\t"
29 "cmovzl %2,%0"
30 : "=&r" (r) : "rm" (x), "rm" (-1));
31 return r + 1;
32 }
33
34 #elif defined(__x86_64)
35
36 static inline int fls(int x)
37 {
38 int r;
39 asm("bsrl %1,%0\n\t"
40 "cmovzl %2,%0"
41 : "=&r" (r) : "rm" (x), "rm" (-1));
42 return r + 1;
43 }
44
45 #elif defined(__PPC__)
46
47 static __inline__ int fls(unsigned int x)
48 {
49 int lz;
50
51 asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
52 return 32 - lz;
53 }
54
55 #else /* arch-agnostic */
56
57 static __inline__ int fls(unsigned int x)
58 {
59 int r = 32;
60
61 if (!x)
62 return 0;
63 if (!(x & 0xFFFF0000U)) {
64 x <<= 16;
65 r -= 16;
66 }
67 if (!(x & 0xFF000000U)) {
68 x <<= 8;
69 r -= 8;
70 }
71 if (!(x & 0xF0000000U)) {
72 x <<= 4;
73 r -= 4;
74 }
75 if (!(x & 0xC0000000U)) {
76 x <<= 2;
77 r -= 2;
78 }
79 if (!(x & 0x80000000U)) {
80 x <<= 1;
81 r -= 1;
82 }
83 return r;
84 }
85
86 #endif
87
88 #endif /* UST_PROCESSOR_H */
This page took 0.032971 seconds and 5 git commands to generate.