Add some more intrinsics: rotates, fp rounds, and random other fp instructions.
[oota-llvm.git] / include / llvm / IntrinsicsPowerPC.td
1 //===- IntrinsicsPowerPC.td - Defines PowerPC intrinsics ---*- tablegen -*-===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
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.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines all of the PowerPC-specific intrinsics.
11 //
12 //===----------------------------------------------------------------------===//
13
14 let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
15   // Loads.
16   def int_ppc_altivec_lvx : GCCBuiltin<"__builtin_altivec_lvx">,
17               Intrinsic<[llvm_v4i32_ty, llvm_ptr_ty], [IntrReadMem]>;
18   def int_ppc_altivec_lvxl : GCCBuiltin<"__builtin_altivec_lvxl">,
19               Intrinsic<[llvm_v4i32_ty, llvm_ptr_ty], [IntrReadMem]>;
20   def int_ppc_altivec_lvebx : GCCBuiltin<"__builtin_altivec_lvebx">,
21               Intrinsic<[llvm_v16i8_ty, llvm_ptr_ty], [IntrReadMem]>;
22   def int_ppc_altivec_lvehx : GCCBuiltin<"__builtin_altivec_lvehx">,
23               Intrinsic<[llvm_v8i16_ty, llvm_ptr_ty], [IntrReadMem]>;
24   def int_ppc_altivec_lvewx : GCCBuiltin<"__builtin_altivec_lvewx">,
25               Intrinsic<[llvm_v4i32_ty, llvm_ptr_ty], [IntrReadMem]>;
26
27   // Stores.
28   def int_ppc_altivec_stvx : GCCBuiltin<"__builtin_altivec_stvx">,
29               Intrinsic<[llvm_void_ty, llvm_v4i32_ty, llvm_ptr_ty],
30                         [IntrWriteMem]>;
31   def int_ppc_altivec_stvxl : GCCBuiltin<"__builtin_altivec_stvxl">,
32               Intrinsic<[llvm_void_ty, llvm_v4i32_ty, llvm_ptr_ty],
33                         [IntrWriteMem]>;
34   def int_ppc_altivec_stvebx : GCCBuiltin<"__builtin_altivec_stvebx">,
35               Intrinsic<[llvm_void_ty, llvm_v16i8_ty, llvm_ptr_ty],
36                         [IntrWriteMem]>;
37   def int_ppc_altivec_stvehx : GCCBuiltin<"__builtin_altivec_stvehx">,
38               Intrinsic<[llvm_void_ty, llvm_v8i16_ty, llvm_ptr_ty],
39                         [IntrWriteMem]>;
40   def int_ppc_altivec_stvewx : GCCBuiltin<"__builtin_altivec_stvewx">,
41               Intrinsic<[llvm_void_ty, llvm_v4i32_ty, llvm_ptr_ty],
42                         [IntrWriteMem]>;
43
44   // Comparisons setting a vector.
45   def int_ppc_altivec_vcmpbfp : GCCBuiltin<"__builtin_altivec_vcmpbfp">,
46               Intrinsic<[llvm_v4i32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
47                         [InstrNoMem]>;
48   def int_ppc_altivec_vcmpeqfp : GCCBuiltin<"__builtin_altivec_vcmpeqfp">,
49               Intrinsic<[llvm_v4i32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
50                         [InstrNoMem]>;
51   def int_ppc_altivec_vcmpgefp : GCCBuiltin<"__builtin_altivec_vcmpgefp">,
52               Intrinsic<[llvm_v4i32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
53                         [InstrNoMem]>;
54   def int_ppc_altivec_vcmpgtfp : GCCBuiltin<"__builtin_altivec_vcmpgtfp">,
55               Intrinsic<[llvm_v4i32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
56                         [InstrNoMem]>;
57                         
58   def int_ppc_altivec_vcmpequw : GCCBuiltin<"__builtin_altivec_vcmpequw">,
59               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
60                         [InstrNoMem]>;
61   def int_ppc_altivec_vcmpgtsw : GCCBuiltin<"__builtin_altivec_vcmpgtsw">,
62               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
63                         [InstrNoMem]>;
64   def int_ppc_altivec_vcmpgtuw : GCCBuiltin<"__builtin_altivec_vcmpgtuw">,
65               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
66                         [InstrNoMem]>;
67                         
68   def int_ppc_altivec_vcmpequh : GCCBuiltin<"__builtin_altivec_vcmpequh">,
69               Intrinsic<[llvm_v4i32_ty, llvm_v8i16_ty, llvm_v8i16_ty],
70                         [InstrNoMem]>;
71   def int_ppc_altivec_vcmpgtsh : GCCBuiltin<"__builtin_altivec_vcmpgtsh">,
72               Intrinsic<[llvm_v4i32_ty, llvm_v8i16_ty, llvm_v8i16_ty],
73                         [InstrNoMem]>;
74   def int_ppc_altivec_vcmpgtuh : GCCBuiltin<"__builtin_altivec_vcmpgtuh">,
75               Intrinsic<[llvm_v4i32_ty, llvm_v8i16_ty, llvm_v8i16_ty],
76                         [InstrNoMem]>;
77
78   def int_ppc_altivec_vcmpequb : GCCBuiltin<"__builtin_altivec_vcmpequb">,
79               Intrinsic<[llvm_v4i32_ty, llvm_v16i8_ty, llvm_v16i8_ty],
80                         [InstrNoMem]>;
81   def int_ppc_altivec_vcmpgtsb : GCCBuiltin<"__builtin_altivec_vcmpgtsb">,
82               Intrinsic<[llvm_v4i32_ty, llvm_v16i8_ty, llvm_v16i8_ty],
83                         [InstrNoMem]>;
84   def int_ppc_altivec_vcmpgtub : GCCBuiltin<"__builtin_altivec_vcmpgtub">,
85               Intrinsic<[llvm_v4i32_ty, llvm_v16i8_ty, llvm_v16i8_ty],
86                         [InstrNoMem]>;
87
88   // Predicate Comparisons.  The first operand specifies interpretation of CR6.
89   def int_ppc_altivec_vcmpbfp_p : GCCBuiltin<"__builtin_altivec_vcmpbfp_p">,
90               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v4f32_ty,llvm_v4f32_ty],
91                         [InstrNoMem]>;
92   def int_ppc_altivec_vcmpeqfp_p : GCCBuiltin<"__builtin_altivec_vcmpeqfp_p">,
93               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v4f32_ty,llvm_v4f32_ty],
94                         [InstrNoMem]>;
95   def int_ppc_altivec_vcmpgefp_p : GCCBuiltin<"__builtin_altivec_vcmpgefp_p">,
96               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v4f32_ty,llvm_v4f32_ty],
97                         [InstrNoMem]>;
98   def int_ppc_altivec_vcmpgtfp_p : GCCBuiltin<"__builtin_altivec_vcmpgtfp_p">,
99               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v4f32_ty,llvm_v4f32_ty],
100                         [InstrNoMem]>;
101                         
102   def int_ppc_altivec_vcmpequw_p : GCCBuiltin<"__builtin_altivec_vcmpequw_p">,
103               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v4i32_ty,llvm_v4i32_ty],
104                         [InstrNoMem]>;
105   def int_ppc_altivec_vcmpgtsw_p : GCCBuiltin<"__builtin_altivec_vcmpgtsw_p">,
106               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v4i32_ty,llvm_v4i32_ty],
107                         [InstrNoMem]>;
108   def int_ppc_altivec_vcmpgtuw_p : GCCBuiltin<"__builtin_altivec_vcmpgtuw_p">,
109               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v4i32_ty,llvm_v4i32_ty],
110                         [InstrNoMem]>;
111                         
112   def int_ppc_altivec_vcmpequh_p : GCCBuiltin<"__builtin_altivec_vcmpequh_p">,
113               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v8i16_ty,llvm_v8i16_ty],
114                         [InstrNoMem]>;
115   def int_ppc_altivec_vcmpgtsh_p : GCCBuiltin<"__builtin_altivec_vcmpgtsh_p">,
116               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v8i16_ty,llvm_v8i16_ty],
117                         [InstrNoMem]>;
118   def int_ppc_altivec_vcmpgtuh_p : GCCBuiltin<"__builtin_altivec_vcmpgtuh_p">,
119               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v8i16_ty,llvm_v8i16_ty],
120                         [InstrNoMem]>;
121
122   def int_ppc_altivec_vcmpequb_p : GCCBuiltin<"__builtin_altivec_vcmpequb_p">,
123               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v16i8_ty,llvm_v16i8_ty],
124                         [InstrNoMem]>;
125   def int_ppc_altivec_vcmpgtsb_p : GCCBuiltin<"__builtin_altivec_vcmpgtsb_p">,
126               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v16i8_ty,llvm_v16i8_ty],
127                         [InstrNoMem]>;
128   def int_ppc_altivec_vcmpgtub_p : GCCBuiltin<"__builtin_altivec_vcmpgtub_p">,
129               Intrinsic<[llvm_int_ty, llvm_int_ty, llvm_v16i8_ty,llvm_v16i8_ty],
130                         [InstrNoMem]>;
131
132   // Saturating adds and subs.
133   def int_ppc_altivec_vaddubs : GCCBuiltin<"__builtin_altivec_vaddubs">,
134               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
135                         [InstrNoMem]>;
136   def int_ppc_altivec_vaddsbs : GCCBuiltin<"__builtin_altivec_vaddsbs">,
137               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
138                         [InstrNoMem]>;
139   def int_ppc_altivec_vadduhs : GCCBuiltin<"__builtin_altivec_vadduhs">,
140               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
141                         [InstrNoMem]>;
142   def int_ppc_altivec_vaddshs : GCCBuiltin<"__builtin_altivec_vaddshs">,
143               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
144                         [InstrNoMem]>;
145   def int_ppc_altivec_vadduws : GCCBuiltin<"__builtin_altivec_vadduws">,
146               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
147                         [InstrNoMem]>;
148   def int_ppc_altivec_vaddsws : GCCBuiltin<"__builtin_altivec_vaddsws">,
149               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
150                         [InstrNoMem]>;
151
152   def int_ppc_altivec_vmaddfp : GCCBuiltin<"__builtin_altivec_vmaddfp">,
153               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
154                          llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
155   def int_ppc_altivec_vaddcuw : GCCBuiltin<"__builtin_altivec_vaddcuw">,
156               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
157                         [InstrNoMem]>;
158
159   def int_ppc_altivec_vsububs : GCCBuiltin<"__builtin_altivec_vsububs">,
160               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
161                         [InstrNoMem]>;
162   def int_ppc_altivec_vsubsbs : GCCBuiltin<"__builtin_altivec_vsubsbs">,
163               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
164                         [InstrNoMem]>;
165   def int_ppc_altivec_vsubuhs : GCCBuiltin<"__builtin_altivec_vsubuhs">,
166               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
167                         [InstrNoMem]>;
168   def int_ppc_altivec_vsubshs : GCCBuiltin<"__builtin_altivec_vsubshs">,
169               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
170                         [InstrNoMem]>;
171   def int_ppc_altivec_vsubuws : GCCBuiltin<"__builtin_altivec_vsubuws">,
172               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
173                         [InstrNoMem]>;
174   def int_ppc_altivec_vsubsws : GCCBuiltin<"__builtin_altivec_vsubsws">,
175               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
176                         [InstrNoMem]>;
177
178   def int_ppc_altivec_vnmsubfp : GCCBuiltin<"__builtin_altivec_vnmsubfp">,
179               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
180                          llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
181   def int_ppc_altivec_vsubcuw : GCCBuiltin<"__builtin_altivec_vsubcuw">,
182               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
183                         [InstrNoMem]>;
184
185   // Vector Sum Instructions.
186   def int_ppc_altivec_vsumsws : GCCBuiltin<"__builtin_altivec_vsumsws">,
187             Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
188                       [InstrNoMem]>;
189   def int_ppc_altivec_vsum2sws : GCCBuiltin<"__builtin_altivec_vsum2sws">,
190             Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
191                       [InstrNoMem]>;
192   def int_ppc_altivec_vsum4sbs : GCCBuiltin<"__builtin_altivec_vsum4sbs">,
193             Intrinsic<[llvm_v4i32_ty, llvm_v16i8_ty, llvm_v4i32_ty],
194                       [InstrNoMem]>;
195   def int_ppc_altivec_vsum4shs : GCCBuiltin<"__builtin_altivec_vsum4shs">,
196             Intrinsic<[llvm_v4i32_ty, llvm_v8i16_ty, llvm_v4i32_ty],
197                       [InstrNoMem]>;
198   def int_ppc_altivec_vsum4ubs : GCCBuiltin<"__builtin_altivec_vsum4ubs">,
199             Intrinsic<[llvm_v4i32_ty, llvm_v16i8_ty, llvm_v4i32_ty],
200                       [InstrNoMem]>;
201
202
203   // FP to integer conversion.
204   def int_ppc_altivec_vcfsx : GCCBuiltin<"__builtin_altivec_vcfsx">,
205               Intrinsic<[llvm_v4f32_ty, llvm_v4i32_ty, llvm_int_ty],
206                         [InstrNoMem]>;
207   def int_ppc_altivec_vcfux : GCCBuiltin<"__builtin_altivec_vcfux">,
208               Intrinsic<[llvm_v4f32_ty, llvm_v4i32_ty, llvm_int_ty],
209                         [InstrNoMem]>;
210
211   def int_ppc_altivec_vrfim : GCCBuiltin<"__builtin_altivec_vrfim">,
212               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
213   def int_ppc_altivec_vrfin : GCCBuiltin<"__builtin_altivec_vrfin">,
214               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
215   def int_ppc_altivec_vrfip : GCCBuiltin<"__builtin_altivec_vrfip">,
216               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
217   def int_ppc_altivec_vrfiz : GCCBuiltin<"__builtin_altivec_vrfiz">,
218               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
219
220   // Left Shifts.
221   def int_ppc_altivec_vsldoi : GCCBuiltin<"__builtin_altivec_vsldoi_4si">,
222               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, 
223                          llvm_v4i32_ty, llvm_int_ty], [InstrNoMem]>;
224   def int_ppc_altivec_vslo : GCCBuiltin<"__builtin_altivec_vslo">,
225               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
226                         [InstrNoMem]>;
227
228   def int_ppc_altivec_vslb : GCCBuiltin<"__builtin_altivec_vslb">,
229               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
230                         [InstrNoMem]>;
231   def int_ppc_altivec_vslh : GCCBuiltin<"__builtin_altivec_vslh">,
232               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
233                         [InstrNoMem]>;
234   def int_ppc_altivec_vslw : GCCBuiltin<"__builtin_altivec_vslw">,
235               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
236                         [InstrNoMem]>;
237
238   // Right Shifts.
239   def int_ppc_altivec_vsr : GCCBuiltin<"__builtin_altivec_vsr">,
240               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
241                         [InstrNoMem]>;
242   def int_ppc_altivec_vsro : GCCBuiltin<"__builtin_altivec_vsro">,
243               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
244                         [InstrNoMem]>;
245
246   def int_ppc_altivec_vsrb : GCCBuiltin<"__builtin_altivec_vsrb">,
247               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
248                         [InstrNoMem]>;
249   def int_ppc_altivec_vsrh : GCCBuiltin<"__builtin_altivec_vsrh">,
250               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
251                         [InstrNoMem]>;
252   def int_ppc_altivec_vsrw : GCCBuiltin<"__builtin_altivec_vsrw">,
253               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
254                         [InstrNoMem]>;
255   def int_ppc_altivec_vsrab : GCCBuiltin<"__builtin_altivec_vsrab">,
256               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
257                         [InstrNoMem]>;
258   def int_ppc_altivec_vsrah : GCCBuiltin<"__builtin_altivec_vsrah">,
259               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
260                         [InstrNoMem]>;
261   def int_ppc_altivec_vsraw : GCCBuiltin<"__builtin_altivec_vsraw">,
262               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
263                         [InstrNoMem]>;
264
265   // Rotates.
266   def int_ppc_altivec_vrlb : GCCBuiltin<"__builtin_altivec_vrlb">,
267               Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
268                         [InstrNoMem]>;
269   def int_ppc_altivec_vrlh : GCCBuiltin<"__builtin_altivec_vrlh">,
270               Intrinsic<[llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
271                         [InstrNoMem]>;
272   def int_ppc_altivec_vrlw : GCCBuiltin<"__builtin_altivec_vrlw">,
273               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
274                         [InstrNoMem]>;
275
276   // Miscellaneous.
277   def int_ppc_altivec_vsel : GCCBuiltin<"__builtin_altivec_vsel_4si">,
278               Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, 
279                          llvm_v4i32_ty, llvm_v4i32_ty], [InstrNoMem]>;
280
281   def int_ppc_altivec_vexptefp : GCCBuiltin<"__builtin_altivec_vexptefp">,
282               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
283   def int_ppc_altivec_vlogefp : GCCBuiltin<"__builtin_altivec_vlogefp">,
284               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
285   def int_ppc_altivec_vrefp : GCCBuiltin<"__builtin_altivec_vrefp">,
286               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
287   def int_ppc_altivec_vrsqrtefp : GCCBuiltin<"__builtin_altivec_vrsqrtefp">,
288               Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
289 }
290