Mercurial > hg > CbC > CbC_gcc
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 */ |