1 //===- IntrinsicsX86.td - Defines X86 intrinsics -----------*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by Chris Lattner and is distributed under the
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines all of the X86-specific intrinsics.
12 //===----------------------------------------------------------------------===//
15 //===----------------------------------------------------------------------===//
19 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
20 def int_x86_sse_add_ss : GCCBuiltin<"__builtin_ia32_addss">,
21 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
22 llvm_v4f32_ty], [InstrNoMem]>;
23 def int_x86_sse_sub_ss : GCCBuiltin<"__builtin_ia32_subss">,
24 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
25 llvm_v4f32_ty], [InstrNoMem]>;
26 def int_x86_sse_mul_ss : GCCBuiltin<"__builtin_ia32_mulss">,
27 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
28 llvm_v4f32_ty], [InstrNoMem]>;
29 def int_x86_sse_div_ss : GCCBuiltin<"__builtin_ia32_divss">,
30 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
31 llvm_v4f32_ty], [InstrNoMem]>;
32 def int_x86_sse_sqrt_ss : GCCBuiltin<"__builtin_ia32_sqrtss">,
33 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty],
35 def int_x86_sse_sqrt_ps : GCCBuiltin<"__builtin_ia32_sqrtps">,
36 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty],
38 def int_x86_sse_rcp_ss : GCCBuiltin<"__builtin_ia32_rcpss">,
39 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty],
41 def int_x86_sse_rcp_ps : GCCBuiltin<"__builtin_ia32_rcpps">,
42 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty],
44 def int_x86_sse_rsqrt_ss : GCCBuiltin<"__builtin_ia32_rsqrtss">,
45 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty],
47 def int_x86_sse_rsqrt_ps : GCCBuiltin<"__builtin_ia32_rsqrtps">,
48 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty],
50 def int_x86_sse_min_ss : GCCBuiltin<"__builtin_ia32_minss">,
51 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
52 llvm_v4f32_ty], [InstrNoMem]>;
53 def int_x86_sse_min_ps : GCCBuiltin<"__builtin_ia32_minps">,
54 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
55 llvm_v4f32_ty], [InstrNoMem]>;
56 def int_x86_sse_max_ss : GCCBuiltin<"__builtin_ia32_maxss">,
57 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
58 llvm_v4f32_ty], [InstrNoMem]>;
59 def int_x86_sse_max_ps : GCCBuiltin<"__builtin_ia32_maxps">,
60 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
61 llvm_v4f32_ty], [InstrNoMem]>;
65 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
66 def int_x86_sse_cmpeq_ss : GCCBuiltin<"__builtin_ia32_cmpeqss">,
67 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
68 llvm_v4f32_ty], [InstrNoMem]>;
69 def int_x86_sse_cmpeq_ps : GCCBuiltin<"__builtin_ia32_cmpeqps">,
70 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
71 llvm_v4f32_ty], [InstrNoMem]>;
72 def int_x86_sse_cmplt_ss : GCCBuiltin<"__builtin_ia32_cmpltss">,
73 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
74 llvm_v4f32_ty], [InstrNoMem]>;
75 def int_x86_sse_cmplt_ps : GCCBuiltin<"__builtin_ia32_cmpltps">,
76 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
77 llvm_v4f32_ty], [InstrNoMem]>;
78 def int_x86_sse_cmple_ss : GCCBuiltin<"__builtin_ia32_cmpless">,
79 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
80 llvm_v4f32_ty], [InstrNoMem]>;
81 def int_x86_sse_cmple_ps : GCCBuiltin<"__builtin_ia32_cmpleps">,
82 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
83 llvm_v4f32_ty], [InstrNoMem]>;
84 def int_x86_sse_cmpgt_ss : GCCBuiltin<"__builtin_ia32_cmpgtss">,
85 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
86 llvm_v4f32_ty], [InstrNoMem]>;
87 def int_x86_sse_cmpgt_ps : GCCBuiltin<"__builtin_ia32_cmpgtps">,
88 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
89 llvm_v4f32_ty], [InstrNoMem]>;
90 def int_x86_sse_cmpge_ss : GCCBuiltin<"__builtin_ia32_cmpgess">,
91 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
92 llvm_v4f32_ty], [InstrNoMem]>;
93 def int_x86_sse_cmpge_ps : GCCBuiltin<"__builtin_ia32_cmpgeps">,
94 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
95 llvm_v4f32_ty], [InstrNoMem]>;
96 def int_x86_sse_cmpneq_ss : GCCBuiltin<"__builtin_ia32_cmpneqss">,
97 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
98 llvm_v4f32_ty], [InstrNoMem]>;
99 def int_x86_sse_cmpneq_ps : GCCBuiltin<"__builtin_ia32_cmpneqps">,
100 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
101 llvm_v4f32_ty], [InstrNoMem]>;
102 def int_x86_sse_cmpnlt_ss : GCCBuiltin<"__builtin_ia32_cmpnltss">,
103 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
104 llvm_v4f32_ty], [InstrNoMem]>;
105 def int_x86_sse_cmpnlt_ps : GCCBuiltin<"__builtin_ia32_cmpnltps">,
106 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
107 llvm_v4f32_ty], [InstrNoMem]>;
108 def int_x86_sse_cmpnle_ss : GCCBuiltin<"__builtin_ia32_cmpnless">,
109 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
110 llvm_v4f32_ty], [InstrNoMem]>;
111 def int_x86_sse_cmpnle_ps : GCCBuiltin<"__builtin_ia32_cmpnleps">,
112 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
113 llvm_v4f32_ty], [InstrNoMem]>;
114 def int_x86_sse_cmpngt_ss : GCCBuiltin<"__builtin_ia32_cmpngtss">,
115 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
116 llvm_v4f32_ty], [InstrNoMem]>;
117 def int_x86_sse_cmpngt_ps : GCCBuiltin<"__builtin_ia32_cmpngtps">,
118 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
119 llvm_v4f32_ty], [InstrNoMem]>;
120 def int_x86_sse_cmpnge_ss : GCCBuiltin<"__builtin_ia32_cmpngess">,
121 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
122 llvm_v4f32_ty], [InstrNoMem]>;
123 def int_x86_sse_cmpnge_ps : GCCBuiltin<"__builtin_ia32_cmpngeps">,
124 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
125 llvm_v4f32_ty], [InstrNoMem]>;
126 def int_x86_sse_cmpord_ss : GCCBuiltin<"__builtin_ia32_cmpordss">,
127 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
128 llvm_v4f32_ty], [InstrNoMem]>;
129 def int_x86_sse_cmpord_ps : GCCBuiltin<"__builtin_ia32_cmpordps">,
130 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
131 llvm_v4f32_ty], [InstrNoMem]>;
132 def int_x86_sse_cmpunord_ss : GCCBuiltin<"__builtin_ia32_cmpunordss">,
133 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
134 llvm_v4f32_ty], [InstrNoMem]>;
135 def int_x86_sse_cmpunord_ps : GCCBuiltin<"__builtin_ia32_cmpunordps">,
136 Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
137 llvm_v4f32_ty], [InstrNoMem]>;
138 def int_x86_sse_comieq_ss : GCCBuiltin<"__builtin_ia32_comieq">,
139 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
140 llvm_v4f32_ty], [InstrNoMem]>;
141 def int_x86_sse_comilt_ss : GCCBuiltin<"__builtin_ia32_comilt">,
142 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
143 llvm_v4f32_ty], [InstrNoMem]>;
144 def int_x86_sse_comile_ss : GCCBuiltin<"__Builtin_ia32_comile">,
145 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
146 llvm_v4f32_ty], [InstrNoMem]>;
147 def int_x86_sse_comigt_ss : GCCBuiltin<"__builtin_ia32_comigt">,
148 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
149 llvm_v4f32_ty], [InstrNoMem]>;
150 def int_x86_sse_comige_ss : GCCBuiltin<"__builtin_ia32_comige">,
151 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
152 llvm_v4f32_ty], [InstrNoMem]>;
153 def int_x86_sse_comineq_ss : GCCBuiltin<"__builtin_ia32_comineq">,
154 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
155 llvm_v4f32_ty], [InstrNoMem]>;
156 def int_x86_sse_ucomieq_ss : GCCBuiltin<"__builtin_ia32_ucomieq">,
157 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
158 llvm_v4f32_ty], [InstrNoMem]>;
159 def int_x86_sse_ucomilt_ss : GCCBuiltin<"__builtin_ia32_ucomilt">,
160 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
161 llvm_v4f32_ty], [InstrNoMem]>;
162 def int_x86_sse_ucomile_ss : GCCBuiltin<"__Builtin_ia32_ucomile">,
163 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
164 llvm_v4f32_ty], [InstrNoMem]>;
165 def int_x86_sse_ucomigt_ss : GCCBuiltin<"__builtin_ia32_ucomigt">,
166 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
167 llvm_v4f32_ty], [InstrNoMem]>;
168 def int_x86_sse_ucomige_ss : GCCBuiltin<"__builtin_ia32_ucomige">,
169 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
170 llvm_v4f32_ty], [InstrNoMem]>;
171 def int_x86_sse_ucomineq_ss : GCCBuiltin<"__builtin_ia32_ucomineq">,
172 Intrinsic<[llvm_int_ty, llvm_v4f32_ty,
173 llvm_v4f32_ty], [InstrNoMem]>;
178 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
179 def int_x86_sse_cvtss2si : GCCBuiltin<"__builtin_ia32_cvtss2si">,
180 Intrinsic<[llvm_int_ty, llvm_v4f32_ty], [InstrNoMem]>;
181 def int_x86_sse_cvtps2pi : GCCBuiltin<"__builtin_ia32_cvtps2pi">,
182 Intrinsic<[llvm_v2i32_ty, llvm_v4i32_ty], [InstrNoMem]>;
183 def int_x86_sse_cvttss2si : GCCBuiltin<"__builtin_ia32_cvttss2si">,
184 Intrinsic<[llvm_int_ty, llvm_v4f32_ty], [InstrNoMem]>;
185 def int_x86_sse_cvttps2pi : GCCBuiltin<"__builtin_ia32_cvttps2pi">,
186 Intrinsic<[llvm_v2i32_ty, llvm_v4i32_ty], [InstrNoMem]>;
187 def int_x86_sse_cvtsi2ss : GCCBuiltin<"__builtin_ia32_cvtsi2ss">,
188 Intrinsic<[llvm_v4f32_ty, llvm_int_ty], [InstrNoMem]>;
189 def int_x86_sse_cvtpi2ps : GCCBuiltin<"__builtin_ia32_cvtpi2ps">,
190 Intrinsic<[llvm_v4f32_ty, llvm_v2i32_ty], [InstrNoMem]>;
194 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
195 def int_x86_sse_loadh_ps : GCCBuiltin<"__builtin_ia32_loadhps">,
196 Intrinsic<[llvm_v4f32_ty, llvm_ptr_ty], [IntrReadMem]>;
197 def int_x86_sse_loadl_ps : GCCBuiltin<"__builtin_ia32_loadlps">,
198 Intrinsic<[llvm_v4f32_ty, llvm_ptr_ty], [IntrReadMem]>;
199 def int_x86_sse_loadu_ps : GCCBuiltin<"__builtin_ia32_loadups">,
200 Intrinsic<[llvm_v4f32_ty, llvm_ptr_ty], [IntrReadMem]>;
204 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
205 def int_x86_sse_storeh_ps : GCCBuiltin<"__builtin_ia32_storehps">,
206 Intrinsic<[llvm_ptr_ty, llvm_v4f32_ty], [IntrWriteMem]>;
207 def int_x86_sse_storel_ps : GCCBuiltin<"__builtin_ia32_storelps">,
208 Intrinsic<[llvm_ptr_ty, llvm_v4f32_ty], [IntrWriteMem]>;
209 def int_x86_sse_storeu_ps : GCCBuiltin<"__builtin_ia32_storeups">,
210 Intrinsic<[llvm_ptr_ty, llvm_v4f32_ty], [IntrWriteMem]>;
213 // Cacheability support ops
214 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
215 def int_x86_sse_prefetch : GCCBuiltin<"__builtin_ia32_prefetch">,
216 Intrinsic<[llvm_ptr_ty, llvm_int_ty], [IntrWriteMem]>;
217 def int_x86_sse_movntq : GCCBuiltin<"__builtin_ia32_movntq">,
218 Intrinsic<[llvm_ptr_ty, llvm_v2i32_ty], [IntrWriteMem]>;
219 def int_x86_sse_movntps : GCCBuiltin<"__builtin_ia32_movntps">,
220 Intrinsic<[llvm_ptr_ty, llvm_v4f32_ty], [IntrWriteMem]>;
221 def int_x86_sse_sfence : GCCBuiltin<"__builtin_ia32_sfence">,
222 Intrinsic<[llvm_void_ty], [IntrWriteMem]>;
226 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
227 def int_x86_sse_stmxcsr : GCCBuiltin<"__builtin_ia32_stmxcsr">,
228 Intrinsic<[llvm_void_ty, llvm_ptr_ty], [IntrWriteMem]>;
229 def int_x86_sse_ldmxcsr : GCCBuiltin<"__builtin_ia32_ldmxcsr">,
230 Intrinsic<[llvm_void_ty, llvm_ptr_ty], [IntrWriteMem]>;
234 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
235 def int_x86_sse_movmsk_ps : GCCBuiltin<"__builtin_ia32_movmskps">,
236 Intrinsic<[llvm_int_ty, llvm_v4f32_ty], [InstrNoMem]>;
239 //===----------------------------------------------------------------------===//
243 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
244 def int_x86_sse2_add_sd : GCCBuiltin<"__builtin_ia32_addsd">,
245 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
246 llvm_v2f64_ty], [InstrNoMem]>;
247 def int_x86_sse2_sub_sd : GCCBuiltin<"__builtin_ia32_subsd">,
248 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
249 llvm_v2f64_ty], [InstrNoMem]>;
250 def int_x86_sse2_mul_sd : GCCBuiltin<"__builtin_ia32_mulsd">,
251 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
252 llvm_v2f64_ty], [InstrNoMem]>;
253 def int_x86_sse2_div_sd : GCCBuiltin<"__builtin_ia32_divsd">,
254 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
255 llvm_v2f64_ty], [InstrNoMem]>;
256 def int_x86_sse2_sqrt_sd : GCCBuiltin<"__builtin_ia32_sqrtsd">,
257 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty],
259 def int_x86_sse2_sqrt_pd : GCCBuiltin<"__builtin_ia32_sqrtpd">,
260 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty],
262 def int_x86_sse2_rcp_sd : GCCBuiltin<"__builtin_ia32_rcpsd">,
263 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty],
265 def int_x86_sse2_rcp_pd : GCCBuiltin<"__builtin_ia32_rcppd">,
266 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty],
268 def int_x86_sse2_rsqrt_sd : GCCBuiltin<"__builtin_ia32_rsqrtsd">,
269 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty],
271 def int_x86_sse2_rsqrt_pd : GCCBuiltin<"__builtin_ia32_rsqrtpd">,
272 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty],
274 def int_x86_sse2_min_sd : GCCBuiltin<"__builtin_ia32_minsd">,
275 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
276 llvm_v2f64_ty], [InstrNoMem]>;
277 def int_x86_sse2_min_pd : GCCBuiltin<"__builtin_ia32_minpd">,
278 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
279 llvm_v2f64_ty], [InstrNoMem]>;
280 def int_x86_sse2_max_sd : GCCBuiltin<"__builtin_ia32_maxsd">,
281 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
282 llvm_v2f64_ty], [InstrNoMem]>;
283 def int_x86_sse2_max_pd : GCCBuiltin<"__builtin_ia32_maxpd">,
284 Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
285 llvm_v2f64_ty], [InstrNoMem]>;
289 let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
290 def int_x86_sse2_packsswb_128 : GCCBuiltin<"__builtin_ia32_packsswb128">,
291 Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty,
292 llvm_v8i16_ty], [InstrNoMem]>;
293 def int_x86_sse2_packssdw_128 : GCCBuiltin<"__builtin_ia32_packssdw128">,
294 Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty,
295 llvm_v4i32_ty], [InstrNoMem]>;
296 def int_x86_sse2_packuswb_128 : GCCBuiltin<"__builtin_ia32_packuswb128">,
297 Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty,
298 llvm_v8i16_ty], [InstrNoMem]>;
299 def int_x86_sse2_movmskpd : GCCBuiltin<"__builtin_ia32_movmskpd">,
300 Intrinsic<[llvm_int_ty, llvm_v2f64_ty], [InstrNoMem]>;
301 def int_x86_sse2_pmovmskb_128 : GCCBuiltin<"__builtin_ia32_pmovmskb128">,
302 Intrinsic<[llvm_int_ty, llvm_v16i8_ty], [InstrNoMem]>;