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