ia32intrin.h revision 1.1.1.1.8.2 1 1.1.1.1.8.2 tls /* Copyright (C) 2009 Free Software Foundation, Inc.
2 1.1.1.1.8.2 tls
3 1.1.1.1.8.2 tls This file is part of GCC.
4 1.1.1.1.8.2 tls
5 1.1.1.1.8.2 tls GCC is free software; you can redistribute it and/or modify
6 1.1.1.1.8.2 tls it under the terms of the GNU General Public License as published by
7 1.1.1.1.8.2 tls the Free Software Foundation; either version 3, or (at your option)
8 1.1.1.1.8.2 tls any later version.
9 1.1.1.1.8.2 tls
10 1.1.1.1.8.2 tls GCC is distributed in the hope that it will be useful,
11 1.1.1.1.8.2 tls but WITHOUT ANY WARRANTY; without even the implied warranty of
12 1.1.1.1.8.2 tls MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 1.1.1.1.8.2 tls GNU General Public License for more details.
14 1.1.1.1.8.2 tls
15 1.1.1.1.8.2 tls Under Section 7 of GPL version 3, you are granted additional
16 1.1.1.1.8.2 tls permissions described in the GCC Runtime Library Exception, version
17 1.1.1.1.8.2 tls 3.1, as published by the Free Software Foundation.
18 1.1.1.1.8.2 tls
19 1.1.1.1.8.2 tls You should have received a copy of the GNU General Public License and
20 1.1.1.1.8.2 tls a copy of the GCC Runtime Library Exception along with this program;
21 1.1.1.1.8.2 tls see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 1.1.1.1.8.2 tls <http://www.gnu.org/licenses/>. */
23 1.1.1.1.8.2 tls
24 1.1.1.1.8.2 tls #ifndef _X86INTRIN_H_INCLUDED
25 1.1.1.1.8.2 tls # error "Never use <ia32intrin.h> directly; include <x86intrin.h> instead."
26 1.1.1.1.8.2 tls #endif
27 1.1.1.1.8.2 tls
28 1.1.1.1.8.2 tls /* 32bit bsf */
29 1.1.1.1.8.2 tls extern __inline int
30 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
31 1.1.1.1.8.2 tls __bsfd (int __X)
32 1.1.1.1.8.2 tls {
33 1.1.1.1.8.2 tls return __builtin_ctz (__X);
34 1.1.1.1.8.2 tls }
35 1.1.1.1.8.2 tls
36 1.1.1.1.8.2 tls /* 32bit bsr */
37 1.1.1.1.8.2 tls extern __inline int
38 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
39 1.1.1.1.8.2 tls __bsrd (int __X)
40 1.1.1.1.8.2 tls {
41 1.1.1.1.8.2 tls return __builtin_ia32_bsrsi (__X);
42 1.1.1.1.8.2 tls }
43 1.1.1.1.8.2 tls
44 1.1.1.1.8.2 tls /* 32bit bswap */
45 1.1.1.1.8.2 tls extern __inline int
46 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
47 1.1.1.1.8.2 tls __bswapd (int __X)
48 1.1.1.1.8.2 tls {
49 1.1.1.1.8.2 tls return __builtin_bswap32 (__X);
50 1.1.1.1.8.2 tls }
51 1.1.1.1.8.2 tls
52 1.1.1.1.8.2 tls #ifdef __SSE4_2__
53 1.1.1.1.8.2 tls /* 32bit accumulate CRC32 (polynomial 0x11EDC6F41) value. */
54 1.1.1.1.8.2 tls extern __inline unsigned int
55 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
56 1.1.1.1.8.2 tls __crc32b (unsigned int __C, unsigned char __V)
57 1.1.1.1.8.2 tls {
58 1.1.1.1.8.2 tls return __builtin_ia32_crc32qi (__C, __V);
59 1.1.1.1.8.2 tls }
60 1.1.1.1.8.2 tls
61 1.1.1.1.8.2 tls extern __inline unsigned int
62 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
63 1.1.1.1.8.2 tls __crc32w (unsigned int __C, unsigned short __V)
64 1.1.1.1.8.2 tls {
65 1.1.1.1.8.2 tls return __builtin_ia32_crc32hi (__C, __V);
66 1.1.1.1.8.2 tls }
67 1.1.1.1.8.2 tls
68 1.1.1.1.8.2 tls extern __inline unsigned int
69 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
70 1.1.1.1.8.2 tls __crc32d (unsigned int __C, unsigned int __V)
71 1.1.1.1.8.2 tls {
72 1.1.1.1.8.2 tls return __builtin_ia32_crc32si (__C, __V);
73 1.1.1.1.8.2 tls }
74 1.1.1.1.8.2 tls #endif /* SSE4.2 */
75 1.1.1.1.8.2 tls
76 1.1.1.1.8.2 tls /* 32bit popcnt */
77 1.1.1.1.8.2 tls extern __inline int
78 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
79 1.1.1.1.8.2 tls __popcntd (unsigned int __X)
80 1.1.1.1.8.2 tls {
81 1.1.1.1.8.2 tls return __builtin_popcount (__X);
82 1.1.1.1.8.2 tls }
83 1.1.1.1.8.2 tls
84 1.1.1.1.8.2 tls /* rdpmc */
85 1.1.1.1.8.2 tls extern __inline unsigned long long
86 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
87 1.1.1.1.8.2 tls __rdpmc (int __S)
88 1.1.1.1.8.2 tls {
89 1.1.1.1.8.2 tls return __builtin_ia32_rdpmc (__S);
90 1.1.1.1.8.2 tls }
91 1.1.1.1.8.2 tls
92 1.1.1.1.8.2 tls /* rdtsc */
93 1.1.1.1.8.2 tls extern __inline unsigned long long
94 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
95 1.1.1.1.8.2 tls __rdtsc (void)
96 1.1.1.1.8.2 tls {
97 1.1.1.1.8.2 tls return __builtin_ia32_rdtsc ();
98 1.1.1.1.8.2 tls }
99 1.1.1.1.8.2 tls
100 1.1.1.1.8.2 tls /* rdtscp */
101 1.1.1.1.8.2 tls extern __inline unsigned long long
102 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
103 1.1.1.1.8.2 tls __rdtscp (unsigned int *__A)
104 1.1.1.1.8.2 tls {
105 1.1.1.1.8.2 tls return __builtin_ia32_rdtscp (__A);
106 1.1.1.1.8.2 tls }
107 1.1.1.1.8.2 tls
108 1.1.1.1.8.2 tls /* 8bit rol */
109 1.1.1.1.8.2 tls extern __inline unsigned char
110 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
111 1.1.1.1.8.2 tls __rolb (unsigned char __X, int __C)
112 1.1.1.1.8.2 tls {
113 1.1.1.1.8.2 tls return __builtin_ia32_rolqi (__X, __C);
114 1.1.1.1.8.2 tls }
115 1.1.1.1.8.2 tls
116 1.1.1.1.8.2 tls /* 16bit rol */
117 1.1.1.1.8.2 tls extern __inline unsigned short
118 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
119 1.1.1.1.8.2 tls __rolw (unsigned short __X, int __C)
120 1.1.1.1.8.2 tls {
121 1.1.1.1.8.2 tls return __builtin_ia32_rolhi (__X, __C);
122 1.1.1.1.8.2 tls }
123 1.1.1.1.8.2 tls
124 1.1.1.1.8.2 tls /* 32bit rol */
125 1.1.1.1.8.2 tls extern __inline unsigned int
126 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
127 1.1.1.1.8.2 tls __rold (unsigned int __X, int __C)
128 1.1.1.1.8.2 tls {
129 1.1.1.1.8.2 tls return (__X << __C) | (__X >> (32 - __C));
130 1.1.1.1.8.2 tls }
131 1.1.1.1.8.2 tls
132 1.1.1.1.8.2 tls /* 8bit ror */
133 1.1.1.1.8.2 tls extern __inline unsigned char
134 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
135 1.1.1.1.8.2 tls __rorb (unsigned char __X, int __C)
136 1.1.1.1.8.2 tls {
137 1.1.1.1.8.2 tls return __builtin_ia32_rorqi (__X, __C);
138 1.1.1.1.8.2 tls }
139 1.1.1.1.8.2 tls
140 1.1.1.1.8.2 tls /* 16bit ror */
141 1.1.1.1.8.2 tls extern __inline unsigned short
142 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
143 1.1.1.1.8.2 tls __rorw (unsigned short __X, int __C)
144 1.1.1.1.8.2 tls {
145 1.1.1.1.8.2 tls return __builtin_ia32_rorhi (__X, __C);
146 1.1.1.1.8.2 tls }
147 1.1.1.1.8.2 tls
148 1.1.1.1.8.2 tls /* 32bit ror */
149 1.1.1.1.8.2 tls extern __inline unsigned int
150 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
151 1.1.1.1.8.2 tls __rord (unsigned int __X, int __C)
152 1.1.1.1.8.2 tls {
153 1.1.1.1.8.2 tls return (__X >> __C) | (__X << (32 - __C));
154 1.1.1.1.8.2 tls }
155 1.1.1.1.8.2 tls
156 1.1.1.1.8.2 tls #ifdef __x86_64__
157 1.1.1.1.8.2 tls /* 64bit bsf */
158 1.1.1.1.8.2 tls extern __inline int
159 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
160 1.1.1.1.8.2 tls __bsfq (long long __X)
161 1.1.1.1.8.2 tls {
162 1.1.1.1.8.2 tls return __builtin_ctzll (__X);
163 1.1.1.1.8.2 tls }
164 1.1.1.1.8.2 tls
165 1.1.1.1.8.2 tls /* 64bit bsr */
166 1.1.1.1.8.2 tls extern __inline int
167 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
168 1.1.1.1.8.2 tls __bsrq (long long __X)
169 1.1.1.1.8.2 tls {
170 1.1.1.1.8.2 tls return __builtin_ia32_bsrdi (__X);
171 1.1.1.1.8.2 tls }
172 1.1.1.1.8.2 tls
173 1.1.1.1.8.2 tls /* 64bit bswap */
174 1.1.1.1.8.2 tls extern __inline long long
175 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
176 1.1.1.1.8.2 tls __bswapq (long long __X)
177 1.1.1.1.8.2 tls {
178 1.1.1.1.8.2 tls return __builtin_bswap64 (__X);
179 1.1.1.1.8.2 tls }
180 1.1.1.1.8.2 tls
181 1.1.1.1.8.2 tls #ifdef __SSE4_2__
182 1.1.1.1.8.2 tls /* 64bit accumulate CRC32 (polynomial 0x11EDC6F41) value. */
183 1.1.1.1.8.2 tls extern __inline unsigned long long
184 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
185 1.1.1.1.8.2 tls __crc32q (unsigned long long __C, unsigned long long __V)
186 1.1.1.1.8.2 tls {
187 1.1.1.1.8.2 tls return __builtin_ia32_crc32di (__C, __V);
188 1.1.1.1.8.2 tls }
189 1.1.1.1.8.2 tls #endif
190 1.1.1.1.8.2 tls
191 1.1.1.1.8.2 tls /* 64bit popcnt */
192 1.1.1.1.8.2 tls extern __inline long long
193 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
194 1.1.1.1.8.2 tls __popcntq (unsigned long long __X)
195 1.1.1.1.8.2 tls {
196 1.1.1.1.8.2 tls return __builtin_popcountll (__X);
197 1.1.1.1.8.2 tls }
198 1.1.1.1.8.2 tls
199 1.1.1.1.8.2 tls /* 64bit rol */
200 1.1.1.1.8.2 tls extern __inline unsigned long long
201 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
202 1.1.1.1.8.2 tls __rolq (unsigned long long __X, int __C)
203 1.1.1.1.8.2 tls {
204 1.1.1.1.8.2 tls return (__X << __C) | (__X >> (64 - __C));
205 1.1.1.1.8.2 tls }
206 1.1.1.1.8.2 tls
207 1.1.1.1.8.2 tls /* 64bit ror */
208 1.1.1.1.8.2 tls extern __inline unsigned long long
209 1.1.1.1.8.2 tls __attribute__((__gnu_inline__, __always_inline__, __artificial__))
210 1.1.1.1.8.2 tls __rorq (unsigned long long __X, int __C)
211 1.1.1.1.8.2 tls {
212 1.1.1.1.8.2 tls return (__X >> __C) | (__X << (64 - __C));
213 1.1.1.1.8.2 tls }
214 1.1.1.1.8.2 tls
215 1.1.1.1.8.2 tls #define _bswap64(a) __bswapq(a)
216 1.1.1.1.8.2 tls #define _popcnt64(a) __popcntq(a)
217 1.1.1.1.8.2 tls #define _lrotl(a,b) __rolq((a), (b))
218 1.1.1.1.8.2 tls #define _lrotr(a,b) __rorq((a), (b))
219 1.1.1.1.8.2 tls #else
220 1.1.1.1.8.2 tls #define _lrotl(a,b) __rold((a), (b))
221 1.1.1.1.8.2 tls #define _lrotr(a,b) __rord((a), (b))
222 1.1.1.1.8.2 tls #endif
223 1.1.1.1.8.2 tls
224 1.1.1.1.8.2 tls #define _bit_scan_forward(a) __bsfd(a)
225 1.1.1.1.8.2 tls #define _bit_scan_reverse(a) __bsrd(a)
226 1.1.1.1.8.2 tls #define _bswap(a) __bswapd(a)
227 1.1.1.1.8.2 tls #define _popcnt32(a) __popcntd(a)
228 1.1.1.1.8.2 tls #define _rdpmc(a) __rdpmc(a)
229 1.1.1.1.8.2 tls #define _rdtsc() __rdtsc()
230 1.1.1.1.8.2 tls #define _rdtscp(a) __rdtscp(a)
231 1.1.1.1.8.2 tls #define _rotwl(a,b) __rolw((a), (b))
232 1.1.1.1.8.2 tls #define _rotwr(a,b) __rorw((a), (b))
233 1.1.1.1.8.2 tls #define _rotl(a,b) __rold((a), (b))
234 1.1.1.1.8.2 tls #define _rotr(a,b) __rord((a), (b))
235