1*38fd1498Szrj /* Copyright (C) 2010-2018 Free Software Foundation, Inc.
2*38fd1498Szrj
3*38fd1498Szrj This file is part of GCC.
4*38fd1498Szrj
5*38fd1498Szrj GCC is free software; you can redistribute it and/or modify
6*38fd1498Szrj it under the terms of the GNU General Public License as published by
7*38fd1498Szrj the Free Software Foundation; either version 3, or (at your option)
8*38fd1498Szrj any later version.
9*38fd1498Szrj
10*38fd1498Szrj GCC is distributed in the hope that it will be useful,
11*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
12*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*38fd1498Szrj GNU General Public License for more details.
14*38fd1498Szrj
15*38fd1498Szrj Under Section 7 of GPL version 3, you are granted additional
16*38fd1498Szrj permissions described in the GCC Runtime Library Exception, version
17*38fd1498Szrj 3.1, as published by the Free Software Foundation.
18*38fd1498Szrj
19*38fd1498Szrj You should have received a copy of the GNU General Public License and
20*38fd1498Szrj a copy of the GCC Runtime Library Exception along with this program;
21*38fd1498Szrj see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22*38fd1498Szrj <http://www.gnu.org/licenses/>. */
23*38fd1498Szrj
24*38fd1498Szrj #if !defined _X86INTRIN_H_INCLUDED && !defined _IMMINTRIN_H_INCLUDED
25*38fd1498Szrj # error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
26*38fd1498Szrj #endif
27*38fd1498Szrj
28*38fd1498Szrj #ifndef _BMIINTRIN_H_INCLUDED
29*38fd1498Szrj #define _BMIINTRIN_H_INCLUDED
30*38fd1498Szrj
31*38fd1498Szrj #ifndef __BMI__
32*38fd1498Szrj #pragma GCC push_options
33*38fd1498Szrj #pragma GCC target("bmi")
34*38fd1498Szrj #define __DISABLE_BMI__
35*38fd1498Szrj #endif /* __BMI__ */
36*38fd1498Szrj
37*38fd1498Szrj extern __inline unsigned short __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__tzcnt_u16(unsigned short __X)38*38fd1498Szrj __tzcnt_u16 (unsigned short __X)
39*38fd1498Szrj {
40*38fd1498Szrj return __builtin_ia32_tzcnt_u16 (__X);
41*38fd1498Szrj }
42*38fd1498Szrj
43*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__andn_u32(unsigned int __X,unsigned int __Y)44*38fd1498Szrj __andn_u32 (unsigned int __X, unsigned int __Y)
45*38fd1498Szrj {
46*38fd1498Szrj return ~__X & __Y;
47*38fd1498Szrj }
48*38fd1498Szrj
49*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__bextr_u32(unsigned int __X,unsigned int __Y)50*38fd1498Szrj __bextr_u32 (unsigned int __X, unsigned int __Y)
51*38fd1498Szrj {
52*38fd1498Szrj return __builtin_ia32_bextr_u32 (__X, __Y);
53*38fd1498Szrj }
54*38fd1498Szrj
55*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_bextr_u32(unsigned int __X,unsigned int __Y,unsigned __Z)56*38fd1498Szrj _bextr_u32 (unsigned int __X, unsigned int __Y, unsigned __Z)
57*38fd1498Szrj {
58*38fd1498Szrj return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
59*38fd1498Szrj }
60*38fd1498Szrj
61*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__blsi_u32(unsigned int __X)62*38fd1498Szrj __blsi_u32 (unsigned int __X)
63*38fd1498Szrj {
64*38fd1498Szrj return __X & -__X;
65*38fd1498Szrj }
66*38fd1498Szrj
67*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_blsi_u32(unsigned int __X)68*38fd1498Szrj _blsi_u32 (unsigned int __X)
69*38fd1498Szrj {
70*38fd1498Szrj return __blsi_u32 (__X);
71*38fd1498Szrj }
72*38fd1498Szrj
73*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__blsmsk_u32(unsigned int __X)74*38fd1498Szrj __blsmsk_u32 (unsigned int __X)
75*38fd1498Szrj {
76*38fd1498Szrj return __X ^ (__X - 1);
77*38fd1498Szrj }
78*38fd1498Szrj
79*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_blsmsk_u32(unsigned int __X)80*38fd1498Szrj _blsmsk_u32 (unsigned int __X)
81*38fd1498Szrj {
82*38fd1498Szrj return __blsmsk_u32 (__X);
83*38fd1498Szrj }
84*38fd1498Szrj
85*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__blsr_u32(unsigned int __X)86*38fd1498Szrj __blsr_u32 (unsigned int __X)
87*38fd1498Szrj {
88*38fd1498Szrj return __X & (__X - 1);
89*38fd1498Szrj }
90*38fd1498Szrj
91*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_blsr_u32(unsigned int __X)92*38fd1498Szrj _blsr_u32 (unsigned int __X)
93*38fd1498Szrj {
94*38fd1498Szrj return __blsr_u32 (__X);
95*38fd1498Szrj }
96*38fd1498Szrj
97*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__tzcnt_u32(unsigned int __X)98*38fd1498Szrj __tzcnt_u32 (unsigned int __X)
99*38fd1498Szrj {
100*38fd1498Szrj return __builtin_ia32_tzcnt_u32 (__X);
101*38fd1498Szrj }
102*38fd1498Szrj
103*38fd1498Szrj extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_tzcnt_u32(unsigned int __X)104*38fd1498Szrj _tzcnt_u32 (unsigned int __X)
105*38fd1498Szrj {
106*38fd1498Szrj return __builtin_ia32_tzcnt_u32 (__X);
107*38fd1498Szrj }
108*38fd1498Szrj
109*38fd1498Szrj
110*38fd1498Szrj #ifdef __x86_64__
111*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__andn_u64(unsigned long long __X,unsigned long long __Y)112*38fd1498Szrj __andn_u64 (unsigned long long __X, unsigned long long __Y)
113*38fd1498Szrj {
114*38fd1498Szrj return ~__X & __Y;
115*38fd1498Szrj }
116*38fd1498Szrj
117*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__bextr_u64(unsigned long long __X,unsigned long long __Y)118*38fd1498Szrj __bextr_u64 (unsigned long long __X, unsigned long long __Y)
119*38fd1498Szrj {
120*38fd1498Szrj return __builtin_ia32_bextr_u64 (__X, __Y);
121*38fd1498Szrj }
122*38fd1498Szrj
123*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_bextr_u64(unsigned long long __X,unsigned int __Y,unsigned int __Z)124*38fd1498Szrj _bextr_u64 (unsigned long long __X, unsigned int __Y, unsigned int __Z)
125*38fd1498Szrj {
126*38fd1498Szrj return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
127*38fd1498Szrj }
128*38fd1498Szrj
129*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__blsi_u64(unsigned long long __X)130*38fd1498Szrj __blsi_u64 (unsigned long long __X)
131*38fd1498Szrj {
132*38fd1498Szrj return __X & -__X;
133*38fd1498Szrj }
134*38fd1498Szrj
135*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_blsi_u64(unsigned long long __X)136*38fd1498Szrj _blsi_u64 (unsigned long long __X)
137*38fd1498Szrj {
138*38fd1498Szrj return __blsi_u64 (__X);
139*38fd1498Szrj }
140*38fd1498Szrj
141*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__blsmsk_u64(unsigned long long __X)142*38fd1498Szrj __blsmsk_u64 (unsigned long long __X)
143*38fd1498Szrj {
144*38fd1498Szrj return __X ^ (__X - 1);
145*38fd1498Szrj }
146*38fd1498Szrj
147*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_blsmsk_u64(unsigned long long __X)148*38fd1498Szrj _blsmsk_u64 (unsigned long long __X)
149*38fd1498Szrj {
150*38fd1498Szrj return __blsmsk_u64 (__X);
151*38fd1498Szrj }
152*38fd1498Szrj
153*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__blsr_u64(unsigned long long __X)154*38fd1498Szrj __blsr_u64 (unsigned long long __X)
155*38fd1498Szrj {
156*38fd1498Szrj return __X & (__X - 1);
157*38fd1498Szrj }
158*38fd1498Szrj
159*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_blsr_u64(unsigned long long __X)160*38fd1498Szrj _blsr_u64 (unsigned long long __X)
161*38fd1498Szrj {
162*38fd1498Szrj return __blsr_u64 (__X);
163*38fd1498Szrj }
164*38fd1498Szrj
165*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__tzcnt_u64(unsigned long long __X)166*38fd1498Szrj __tzcnt_u64 (unsigned long long __X)
167*38fd1498Szrj {
168*38fd1498Szrj return __builtin_ia32_tzcnt_u64 (__X);
169*38fd1498Szrj }
170*38fd1498Szrj
171*38fd1498Szrj extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_tzcnt_u64(unsigned long long __X)172*38fd1498Szrj _tzcnt_u64 (unsigned long long __X)
173*38fd1498Szrj {
174*38fd1498Szrj return __builtin_ia32_tzcnt_u64 (__X);
175*38fd1498Szrj }
176*38fd1498Szrj
177*38fd1498Szrj #endif /* __x86_64__ */
178*38fd1498Szrj
179*38fd1498Szrj #ifdef __DISABLE_BMI__
180*38fd1498Szrj #undef __DISABLE_BMI__
181*38fd1498Szrj #pragma GCC pop_options
182*38fd1498Szrj #endif /* __DISABLE_BMI__ */
183*38fd1498Szrj
184*38fd1498Szrj #endif /* _BMIINTRIN_H_INCLUDED */
185