Update version to 0.16
[ust.git] / include / ust / processor.h
... / ...
CommitLineData
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
25static 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
36static 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
47static __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
57static __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.026993 seconds and 5 git commands to generate.