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