comparison gcc/config/i386/bmiintrin.h @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents 561a7518be6b
children 84e7813d76e9
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 /* Copyright (C) 2010 Free Software Foundation, Inc. 1 /* Copyright (C) 2010-2017 Free Software Foundation, Inc.
2 2
3 This file is part of GCC. 3 This file is part of GCC.
4 4
5 GCC is free software; you can redistribute it and/or modify 5 GCC is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
19 You should have received a copy of the GNU General Public License and 19 You should have received a copy of the GNU General Public License and
20 a copy of the GCC Runtime Library Exception along with this program; 20 a copy of the GCC Runtime Library Exception along with this program;
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 <http://www.gnu.org/licenses/>. */ 22 <http://www.gnu.org/licenses/>. */
23 23
24 #ifndef _X86INTRIN_H_INCLUDED 24 #if !defined _X86INTRIN_H_INCLUDED && !defined _IMMINTRIN_H_INCLUDED
25 # error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead." 25 # error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
26 #endif 26 #endif
27
28 #ifndef __BMI__
29 # error "BMI instruction set not enabled"
30 #endif /* __BMI__ */
31 27
32 #ifndef _BMIINTRIN_H_INCLUDED 28 #ifndef _BMIINTRIN_H_INCLUDED
33 #define _BMIINTRIN_H_INCLUDED 29 #define _BMIINTRIN_H_INCLUDED
34 30
35 extern __inline unsigned short __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 31 #ifndef __BMI__
36 __lzcnt_u16 (unsigned short __X) 32 #pragma GCC push_options
37 { 33 #pragma GCC target("bmi")
38 return __builtin_clzs (__X); 34 #define __DISABLE_BMI__
39 } 35 #endif /* __BMI__ */
40 36
41 extern __inline unsigned short __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 37 extern __inline unsigned short __attribute__((__gnu_inline__, __always_inline__, __artificial__))
42 __tzcnt_u16 (unsigned short __X) 38 __tzcnt_u16 (unsigned short __X)
43 { 39 {
44 return __builtin_ctzs (__X); 40 return __builtin_ia32_tzcnt_u16 (__X);
45 } 41 }
46
47 42
48 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 43 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
49 __andn_u32 (unsigned int __X, unsigned int __Y) 44 __andn_u32 (unsigned int __X, unsigned int __Y)
50 { 45 {
51 unsigned int tmp = ~(__X) & (__Y); 46 return ~__X & __Y;
52 return tmp;
53 } 47 }
54 48
55 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 49 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
56 __bextr_u32 (unsigned int __X, unsigned int __Y) 50 __bextr_u32 (unsigned int __X, unsigned int __Y)
57 { 51 {
58 return __builtin_ia32_bextr_u32 (__X, __Y); 52 return __builtin_ia32_bextr_u32 (__X, __Y);
59 } 53 }
60 54
61 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 55 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
56 _bextr_u32 (unsigned int __X, unsigned int __Y, unsigned __Z)
57 {
58 return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
59 }
60
61 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
62 __blsi_u32 (unsigned int __X) 62 __blsi_u32 (unsigned int __X)
63 { 63 {
64 unsigned int tmp = (__X) & (-(__X)); 64 return __X & -__X;
65 return tmp; 65 }
66
67 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
68 _blsi_u32 (unsigned int __X)
69 {
70 return __blsi_u32 (__X);
66 } 71 }
67 72
68 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 73 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
69 __blsmsk_u32 (unsigned int __X) 74 __blsmsk_u32 (unsigned int __X)
70 { 75 {
71 unsigned int tmp = (__X) ^ (__X - 1); 76 return __X ^ (__X - 1);
72 return tmp; 77 }
78
79 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
80 _blsmsk_u32 (unsigned int __X)
81 {
82 return __blsmsk_u32 (__X);
73 } 83 }
74 84
75 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 85 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
76 __blsr_u32 (unsigned int __X) 86 __blsr_u32 (unsigned int __X)
77 { 87 {
78 unsigned int tmp = (__X) & (__X - 1); 88 return __X & (__X - 1);
79 return tmp;
80 } 89 }
81 90
82 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 91 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
83 __lzcnt_u32 (unsigned int __X) 92 _blsr_u32 (unsigned int __X)
84 { 93 {
85 return __builtin_clz (__X); 94 return __blsr_u32 (__X);
86 } 95 }
87
88 96
89 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 97 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
90 __tzcnt_u32 (unsigned int __X) 98 __tzcnt_u32 (unsigned int __X)
91 { 99 {
92 return __builtin_ctz (__X); 100 return __builtin_ia32_tzcnt_u32 (__X);
101 }
102
103 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
104 _tzcnt_u32 (unsigned int __X)
105 {
106 return __builtin_ia32_tzcnt_u32 (__X);
93 } 107 }
94 108
95 109
96 #ifdef __x86_64__ 110 #ifdef __x86_64__
97 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 111 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
98 __andn_u64 (unsigned long long __X, unsigned long long __Y) 112 __andn_u64 (unsigned long long __X, unsigned long long __Y)
99 { 113 {
100 unsigned long long tmp = ~(__X) & (__Y); 114 return ~__X & __Y;
101 return tmp;
102 } 115 }
103 116
104 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 117 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
105 __bextr_u64 (unsigned long long __X, unsigned long long __Y) 118 __bextr_u64 (unsigned long long __X, unsigned long long __Y)
106 { 119 {
107 return __builtin_ia32_bextr_u64 (__X, __Y); 120 return __builtin_ia32_bextr_u64 (__X, __Y);
108 } 121 }
109 122
110 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 123 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
124 _bextr_u64 (unsigned long long __X, unsigned int __Y, unsigned int __Z)
125 {
126 return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
127 }
128
129 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
111 __blsi_u64 (unsigned long long __X) 130 __blsi_u64 (unsigned long long __X)
112 { 131 {
113 unsigned long long tmp = (__X) & (-(__X)); 132 return __X & -__X;
114 return tmp; 133 }
134
135 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
136 _blsi_u64 (unsigned long long __X)
137 {
138 return __blsi_u64 (__X);
115 } 139 }
116 140
117 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 141 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
118 __blsmsk_u64 (unsigned long long __X) 142 __blsmsk_u64 (unsigned long long __X)
119 { 143 {
120 unsigned long long tmp = (__X) ^ (__X - 1); 144 return __X ^ (__X - 1);
121 return tmp; 145 }
146
147 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
148 _blsmsk_u64 (unsigned long long __X)
149 {
150 return __blsmsk_u64 (__X);
122 } 151 }
123 152
124 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 153 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
125 __blsr_u64 (unsigned long long __X) 154 __blsr_u64 (unsigned long long __X)
126 { 155 {
127 unsigned long long tmp = (__X) & (__X - 1); 156 return __X & (__X - 1);
128 return tmp;
129 } 157 }
130 158
131 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 159 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
132 __lzcnt_u64 (unsigned long long __X) 160 _blsr_u64 (unsigned long long __X)
133 { 161 {
134 return __builtin_clzll (__X); 162 return __blsr_u64 (__X);
135 } 163 }
136 164
137 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 165 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
138 __tzcnt_u64 (unsigned long long __X) 166 __tzcnt_u64 (unsigned long long __X)
139 { 167 {
140 return __builtin_ctzll (__X); 168 return __builtin_ia32_tzcnt_u64 (__X);
169 }
170
171 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
172 _tzcnt_u64 (unsigned long long __X)
173 {
174 return __builtin_ia32_tzcnt_u64 (__X);
141 } 175 }
142 176
143 #endif /* __x86_64__ */ 177 #endif /* __x86_64__ */
144 178
179 #ifdef __DISABLE_BMI__
180 #undef __DISABLE_BMI__
181 #pragma GCC pop_options
182 #endif /* __DISABLE_BMI__ */
183
145 #endif /* _BMIINTRIN_H_INCLUDED */ 184 #endif /* _BMIINTRIN_H_INCLUDED */