1//===- IntrinsicsPowerPC.td - Defines PowerPC intrinsics ---*- tablegen -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines all of the PowerPC-specific intrinsics.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15// Definitions for all PowerPC intrinsics.
16//
17
18// Non-altivec intrinsics.
19let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
20  // dcba/dcbf/dcbi/dcbst/dcbt/dcbz/dcbzl(PPC970) instructions.
21  def int_ppc_dcba  : Intrinsic<[], [llvm_ptr_ty], []>;
22  def int_ppc_dcbf  : Intrinsic<[], [llvm_ptr_ty], []>;
23  def int_ppc_dcbi  : Intrinsic<[], [llvm_ptr_ty], []>;
24  def int_ppc_dcbst : Intrinsic<[], [llvm_ptr_ty], []>;
25  def int_ppc_dcbt  : Intrinsic<[], [llvm_ptr_ty],
26    [IntrReadWriteArgMem, NoCapture<0>]>;
27  def int_ppc_dcbtst: Intrinsic<[], [llvm_ptr_ty], []>;
28  def int_ppc_dcbz  : Intrinsic<[], [llvm_ptr_ty], []>;
29  def int_ppc_dcbzl : Intrinsic<[], [llvm_ptr_ty], []>;
30
31  // sync instruction (i.e. sync 0, a.k.a hwsync)
32  def int_ppc_sync : Intrinsic<[], [], []>;
33  // lwsync is sync 1
34  def int_ppc_lwsync : Intrinsic<[], [], []>;
35
36  // Intrinsics used to generate ctr-based loops. These should only be
37  // generated by the PowerPC backend!
38  def int_ppc_mtctr : Intrinsic<[], [llvm_anyint_ty], []>;
39  def int_ppc_is_decremented_ctr_nonzero : Intrinsic<[llvm_i1_ty], [], []>;
40}
41
42
43let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
44  /// PowerPC_Vec_Intrinsic - Base class for all altivec intrinsics.
45  class PowerPC_Vec_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
46                              list<LLVMType> param_types,
47                              list<IntrinsicProperty> properties>
48    : GCCBuiltin<!strconcat("__builtin_altivec_", GCCIntSuffix)>,
49      Intrinsic<ret_types, param_types, properties>;
50
51  /// PowerPC_VSX_Intrinsic - Base class for all VSX intrinsics.
52  class PowerPC_VSX_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
53                              list<LLVMType> param_types,
54                              list<IntrinsicProperty> properties>
55    : GCCBuiltin<!strconcat("__builtin_vsx_", GCCIntSuffix)>,
56      Intrinsic<ret_types, param_types, properties>;
57}
58
59//===----------------------------------------------------------------------===//
60// PowerPC Altivec Intrinsic Class Definitions.
61//
62
63/// PowerPC_Vec_FF_Intrinsic - A PowerPC intrinsic that takes one v4f32
64/// vector and returns one.  These intrinsics have no side effects.
65class PowerPC_Vec_FF_Intrinsic<string GCCIntSuffix>
66  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
67                          [llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
68
69/// PowerPC_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
70/// vectors and returns one.  These intrinsics have no side effects.
71class PowerPC_Vec_FFF_Intrinsic<string GCCIntSuffix>
72  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
73                          [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
74                          [IntrNoMem]>;
75
76/// PowerPC_Vec_BBB_Intrinsic - A PowerPC intrinsic that takes two v16f8
77/// vectors and returns one.  These intrinsics have no side effects.
78class PowerPC_Vec_BBB_Intrinsic<string GCCIntSuffix>
79  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
80                          [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
81                          [IntrNoMem]>;
82
83/// PowerPC_Vec_HHH_Intrinsic - A PowerPC intrinsic that takes two v8i16
84/// vectors and returns one.  These intrinsics have no side effects.
85class PowerPC_Vec_HHH_Intrinsic<string GCCIntSuffix>
86  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
87                          [llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
88                          [IntrNoMem]>;
89
90/// PowerPC_Vec_WWW_Intrinsic - A PowerPC intrinsic that takes two v4i32
91/// vectors and returns one.  These intrinsics have no side effects.
92class PowerPC_Vec_WWW_Intrinsic<string GCCIntSuffix>
93  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
94                          [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
95                          [IntrNoMem]>;
96
97
98//===----------------------------------------------------------------------===//
99// PowerPC VSX Intrinsic Class Definitions.
100//
101
102/// PowerPC_VSX_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2f64
103/// vectors and returns one.  These intrinsics have no side effects.
104class PowerPC_VSX_Vec_DDD_Intrinsic<string GCCIntSuffix>
105  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
106                          [llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty],
107                          [IntrNoMem]>;
108
109/// PowerPC_VSX_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
110/// vectors and returns one.  These intrinsics have no side effects.
111class PowerPC_VSX_Vec_FFF_Intrinsic<string GCCIntSuffix>
112  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
113                          [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
114                          [IntrNoMem]>;
115
116/// PowerPC_VSX_Sca_DDD_Intrinsic - A PowerPC intrinsic that takes two f64
117/// scalars and returns one.  These intrinsics have no side effects.
118class PowerPC_VSX_Sca_DDD_Intrinsic<string GCCIntSuffix>
119  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
120                          [llvm_double_ty], [llvm_double_ty, llvm_double_ty],
121                          [IntrNoMem]>;
122
123
124//===----------------------------------------------------------------------===//
125// PowerPC Altivec Intrinsic Definitions.
126
127let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
128  // Data Stream Control.
129  def int_ppc_altivec_dss : GCCBuiltin<"__builtin_altivec_dss">,
130              Intrinsic<[], [llvm_i32_ty], []>;
131  def int_ppc_altivec_dssall : GCCBuiltin<"__builtin_altivec_dssall">,
132              Intrinsic<[], [], []>;
133  def int_ppc_altivec_dst : GCCBuiltin<"__builtin_altivec_dst">,
134              Intrinsic<[],
135                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
136                        []>;
137  def int_ppc_altivec_dstt : GCCBuiltin<"__builtin_altivec_dstt">,
138              Intrinsic<[],
139                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
140                        []>;
141  def int_ppc_altivec_dstst : GCCBuiltin<"__builtin_altivec_dstst">,
142              Intrinsic<[],
143                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
144                        []>;
145  def int_ppc_altivec_dststt : GCCBuiltin<"__builtin_altivec_dststt">,
146              Intrinsic<[],
147                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
148                        []>;
149
150  // VSCR access.
151  def int_ppc_altivec_mfvscr : GCCBuiltin<"__builtin_altivec_mfvscr">,
152              Intrinsic<[llvm_v8i16_ty], [], [IntrReadMem]>;
153  def int_ppc_altivec_mtvscr : GCCBuiltin<"__builtin_altivec_mtvscr">,
154              Intrinsic<[], [llvm_v4i32_ty], []>;
155
156
157  // Loads.  These don't map directly to GCC builtins because they represent the
158  // source address with a single pointer.
159  def int_ppc_altivec_lvx :
160              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
161  def int_ppc_altivec_lvxl :
162              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
163  def int_ppc_altivec_lvebx :
164              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
165  def int_ppc_altivec_lvehx :
166              Intrinsic<[llvm_v8i16_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
167  def int_ppc_altivec_lvewx :
168              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
169
170  // Stores.  These don't map directly to GCC builtins because they represent the
171  // source address with a single pointer.
172  def int_ppc_altivec_stvx :
173              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
174                        [IntrReadWriteArgMem]>;
175  def int_ppc_altivec_stvxl :
176              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
177                        [IntrReadWriteArgMem]>;
178  def int_ppc_altivec_stvebx :
179              Intrinsic<[], [llvm_v16i8_ty, llvm_ptr_ty],
180                        [IntrReadWriteArgMem]>;
181  def int_ppc_altivec_stvehx :
182              Intrinsic<[], [llvm_v8i16_ty, llvm_ptr_ty],
183                        [IntrReadWriteArgMem]>;
184  def int_ppc_altivec_stvewx :
185              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
186                        [IntrReadWriteArgMem]>;
187
188  // Comparisons setting a vector.
189  def int_ppc_altivec_vcmpbfp : GCCBuiltin<"__builtin_altivec_vcmpbfp">,
190              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
191                        [IntrNoMem]>;
192  def int_ppc_altivec_vcmpeqfp : GCCBuiltin<"__builtin_altivec_vcmpeqfp">,
193              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
194                        [IntrNoMem]>;
195  def int_ppc_altivec_vcmpgefp : GCCBuiltin<"__builtin_altivec_vcmpgefp">,
196              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
197                        [IntrNoMem]>;
198  def int_ppc_altivec_vcmpgtfp : GCCBuiltin<"__builtin_altivec_vcmpgtfp">,
199              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
200                        [IntrNoMem]>;
201
202  def int_ppc_altivec_vcmpequw : GCCBuiltin<"__builtin_altivec_vcmpequw">,
203              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
204                        [IntrNoMem]>;
205  def int_ppc_altivec_vcmpgtsw : GCCBuiltin<"__builtin_altivec_vcmpgtsw">,
206              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
207                        [IntrNoMem]>;
208  def int_ppc_altivec_vcmpgtuw : GCCBuiltin<"__builtin_altivec_vcmpgtuw">,
209              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
210                        [IntrNoMem]>;
211
212  def int_ppc_altivec_vcmpequh : GCCBuiltin<"__builtin_altivec_vcmpequh">,
213              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
214                        [IntrNoMem]>;
215  def int_ppc_altivec_vcmpgtsh : GCCBuiltin<"__builtin_altivec_vcmpgtsh">,
216              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
217                        [IntrNoMem]>;
218  def int_ppc_altivec_vcmpgtuh : GCCBuiltin<"__builtin_altivec_vcmpgtuh">,
219              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
220                        [IntrNoMem]>;
221
222  def int_ppc_altivec_vcmpequb : GCCBuiltin<"__builtin_altivec_vcmpequb">,
223              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
224                        [IntrNoMem]>;
225  def int_ppc_altivec_vcmpgtsb : GCCBuiltin<"__builtin_altivec_vcmpgtsb">,
226              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
227                        [IntrNoMem]>;
228  def int_ppc_altivec_vcmpgtub : GCCBuiltin<"__builtin_altivec_vcmpgtub">,
229              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
230                        [IntrNoMem]>;
231
232  // Predicate Comparisons.  The first operand specifies interpretation of CR6.
233  def int_ppc_altivec_vcmpbfp_p : GCCBuiltin<"__builtin_altivec_vcmpbfp_p">,
234              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
235                        [IntrNoMem]>;
236  def int_ppc_altivec_vcmpeqfp_p : GCCBuiltin<"__builtin_altivec_vcmpeqfp_p">,
237              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
238                        [IntrNoMem]>;
239  def int_ppc_altivec_vcmpgefp_p : GCCBuiltin<"__builtin_altivec_vcmpgefp_p">,
240              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
241                        [IntrNoMem]>;
242  def int_ppc_altivec_vcmpgtfp_p : GCCBuiltin<"__builtin_altivec_vcmpgtfp_p">,
243              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
244                        [IntrNoMem]>;
245
246  def int_ppc_altivec_vcmpequw_p : GCCBuiltin<"__builtin_altivec_vcmpequw_p">,
247              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
248                        [IntrNoMem]>;
249  def int_ppc_altivec_vcmpgtsw_p : GCCBuiltin<"__builtin_altivec_vcmpgtsw_p">,
250              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
251                        [IntrNoMem]>;
252  def int_ppc_altivec_vcmpgtuw_p : GCCBuiltin<"__builtin_altivec_vcmpgtuw_p">,
253              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
254                        [IntrNoMem]>;
255
256  def int_ppc_altivec_vcmpequh_p : GCCBuiltin<"__builtin_altivec_vcmpequh_p">,
257              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
258                        [IntrNoMem]>;
259  def int_ppc_altivec_vcmpgtsh_p : GCCBuiltin<"__builtin_altivec_vcmpgtsh_p">,
260              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
261                        [IntrNoMem]>;
262  def int_ppc_altivec_vcmpgtuh_p : GCCBuiltin<"__builtin_altivec_vcmpgtuh_p">,
263              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
264                        [IntrNoMem]>;
265
266  def int_ppc_altivec_vcmpequb_p : GCCBuiltin<"__builtin_altivec_vcmpequb_p">,
267              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
268                        [IntrNoMem]>;
269  def int_ppc_altivec_vcmpgtsb_p : GCCBuiltin<"__builtin_altivec_vcmpgtsb_p">,
270              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
271                        [IntrNoMem]>;
272  def int_ppc_altivec_vcmpgtub_p : GCCBuiltin<"__builtin_altivec_vcmpgtub_p">,
273              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
274                        [IntrNoMem]>;
275}
276
277// Vector average.
278def int_ppc_altivec_vavgsb : PowerPC_Vec_BBB_Intrinsic<"vavgsb">;
279def int_ppc_altivec_vavgsh : PowerPC_Vec_HHH_Intrinsic<"vavgsh">;
280def int_ppc_altivec_vavgsw : PowerPC_Vec_WWW_Intrinsic<"vavgsw">;
281def int_ppc_altivec_vavgub : PowerPC_Vec_BBB_Intrinsic<"vavgub">;
282def int_ppc_altivec_vavguh : PowerPC_Vec_HHH_Intrinsic<"vavguh">;
283def int_ppc_altivec_vavguw : PowerPC_Vec_WWW_Intrinsic<"vavguw">;
284
285// Vector maximum.
286def int_ppc_altivec_vmaxfp : PowerPC_Vec_FFF_Intrinsic<"vmaxfp">;
287def int_ppc_altivec_vmaxsb : PowerPC_Vec_BBB_Intrinsic<"vmaxsb">;
288def int_ppc_altivec_vmaxsh : PowerPC_Vec_HHH_Intrinsic<"vmaxsh">;
289def int_ppc_altivec_vmaxsw : PowerPC_Vec_WWW_Intrinsic<"vmaxsw">;
290def int_ppc_altivec_vmaxub : PowerPC_Vec_BBB_Intrinsic<"vmaxub">;
291def int_ppc_altivec_vmaxuh : PowerPC_Vec_HHH_Intrinsic<"vmaxuh">;
292def int_ppc_altivec_vmaxuw : PowerPC_Vec_WWW_Intrinsic<"vmaxuw">;
293
294// Vector minimum.
295def int_ppc_altivec_vminfp : PowerPC_Vec_FFF_Intrinsic<"vminfp">;
296def int_ppc_altivec_vminsb : PowerPC_Vec_BBB_Intrinsic<"vminsb">;
297def int_ppc_altivec_vminsh : PowerPC_Vec_HHH_Intrinsic<"vminsh">;
298def int_ppc_altivec_vminsw : PowerPC_Vec_WWW_Intrinsic<"vminsw">;
299def int_ppc_altivec_vminub : PowerPC_Vec_BBB_Intrinsic<"vminub">;
300def int_ppc_altivec_vminuh : PowerPC_Vec_HHH_Intrinsic<"vminuh">;
301def int_ppc_altivec_vminuw : PowerPC_Vec_WWW_Intrinsic<"vminuw">;
302
303// Saturating adds.
304def int_ppc_altivec_vaddubs : PowerPC_Vec_BBB_Intrinsic<"vaddubs">;
305def int_ppc_altivec_vaddsbs : PowerPC_Vec_BBB_Intrinsic<"vaddsbs">;
306def int_ppc_altivec_vadduhs : PowerPC_Vec_HHH_Intrinsic<"vadduhs">;
307def int_ppc_altivec_vaddshs : PowerPC_Vec_HHH_Intrinsic<"vaddshs">;
308def int_ppc_altivec_vadduws : PowerPC_Vec_WWW_Intrinsic<"vadduws">;
309def int_ppc_altivec_vaddsws : PowerPC_Vec_WWW_Intrinsic<"vaddsws">;
310def int_ppc_altivec_vaddcuw : PowerPC_Vec_WWW_Intrinsic<"vaddcuw">;
311
312// Saturating subs.
313def int_ppc_altivec_vsububs : PowerPC_Vec_BBB_Intrinsic<"vsububs">;
314def int_ppc_altivec_vsubsbs : PowerPC_Vec_BBB_Intrinsic<"vsubsbs">;
315def int_ppc_altivec_vsubuhs : PowerPC_Vec_HHH_Intrinsic<"vsubuhs">;
316def int_ppc_altivec_vsubshs : PowerPC_Vec_HHH_Intrinsic<"vsubshs">;
317def int_ppc_altivec_vsubuws : PowerPC_Vec_WWW_Intrinsic<"vsubuws">;
318def int_ppc_altivec_vsubsws : PowerPC_Vec_WWW_Intrinsic<"vsubsws">;
319def int_ppc_altivec_vsubcuw : PowerPC_Vec_WWW_Intrinsic<"vsubcuw">;
320
321let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
322  // Saturating multiply-adds.
323  def int_ppc_altivec_vmhaddshs : GCCBuiltin<"__builtin_altivec_vmhaddshs">,
324              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
325                         llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>;
326  def int_ppc_altivec_vmhraddshs : GCCBuiltin<"__builtin_altivec_vmhraddshs">,
327              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
328                         llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>;
329
330  def int_ppc_altivec_vmaddfp : GCCBuiltin<"__builtin_altivec_vmaddfp">,
331              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
332                         llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
333  def int_ppc_altivec_vnmsubfp : GCCBuiltin<"__builtin_altivec_vnmsubfp">,
334              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
335                         llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
336
337  // Vector Multiply Sum Intructions.
338  def int_ppc_altivec_vmsummbm : GCCBuiltin<"__builtin_altivec_vmsummbm">,
339            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
340                       llvm_v4i32_ty], [IntrNoMem]>;
341  def int_ppc_altivec_vmsumshm : GCCBuiltin<"__builtin_altivec_vmsumshm">,
342            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
343                       llvm_v4i32_ty], [IntrNoMem]>;
344  def int_ppc_altivec_vmsumshs : GCCBuiltin<"__builtin_altivec_vmsumshs">,
345            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
346                       llvm_v4i32_ty], [IntrNoMem]>;
347  def int_ppc_altivec_vmsumubm : GCCBuiltin<"__builtin_altivec_vmsumubm">,
348            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
349                       llvm_v4i32_ty], [IntrNoMem]>;
350  def int_ppc_altivec_vmsumuhm : GCCBuiltin<"__builtin_altivec_vmsumuhm">,
351            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
352                       llvm_v4i32_ty], [IntrNoMem]>;
353  def int_ppc_altivec_vmsumuhs : GCCBuiltin<"__builtin_altivec_vmsumuhs">,
354            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
355                       llvm_v4i32_ty], [IntrNoMem]>;
356
357  // Vector Multiply Intructions.
358  def int_ppc_altivec_vmulesb : GCCBuiltin<"__builtin_altivec_vmulesb">,
359          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
360                    [IntrNoMem]>;
361  def int_ppc_altivec_vmulesh : GCCBuiltin<"__builtin_altivec_vmulesh">,
362          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
363                    [IntrNoMem]>;
364  def int_ppc_altivec_vmuleub : GCCBuiltin<"__builtin_altivec_vmuleub">,
365          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
366                    [IntrNoMem]>;
367  def int_ppc_altivec_vmuleuh : GCCBuiltin<"__builtin_altivec_vmuleuh">,
368          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
369                    [IntrNoMem]>;
370
371  def int_ppc_altivec_vmulosb : GCCBuiltin<"__builtin_altivec_vmulosb">,
372          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
373                    [IntrNoMem]>;
374  def int_ppc_altivec_vmulosh : GCCBuiltin<"__builtin_altivec_vmulosh">,
375          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
376                    [IntrNoMem]>;
377  def int_ppc_altivec_vmuloub : GCCBuiltin<"__builtin_altivec_vmuloub">,
378          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
379                    [IntrNoMem]>;
380  def int_ppc_altivec_vmulouh : GCCBuiltin<"__builtin_altivec_vmulouh">,
381          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
382                    [IntrNoMem]>;
383
384  // Vector Sum Intructions.
385  def int_ppc_altivec_vsumsws : GCCBuiltin<"__builtin_altivec_vsumsws">,
386            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
387                      [IntrNoMem]>;
388  def int_ppc_altivec_vsum2sws : GCCBuiltin<"__builtin_altivec_vsum2sws">,
389            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
390                      [IntrNoMem]>;
391  def int_ppc_altivec_vsum4sbs : GCCBuiltin<"__builtin_altivec_vsum4sbs">,
392            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
393                      [IntrNoMem]>;
394  def int_ppc_altivec_vsum4shs : GCCBuiltin<"__builtin_altivec_vsum4shs">,
395            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v4i32_ty],
396                      [IntrNoMem]>;
397  def int_ppc_altivec_vsum4ubs : GCCBuiltin<"__builtin_altivec_vsum4ubs">,
398            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
399                      [IntrNoMem]>;
400
401  // Other multiplies.
402  def int_ppc_altivec_vmladduhm : GCCBuiltin<"__builtin_altivec_vmladduhm">,
403            Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
404                       llvm_v8i16_ty], [IntrNoMem]>;
405
406  // Packs.
407  def int_ppc_altivec_vpkpx : GCCBuiltin<"__builtin_altivec_vpkpx">,
408            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
409                      [IntrNoMem]>;
410  def int_ppc_altivec_vpkshss : GCCBuiltin<"__builtin_altivec_vpkshss">,
411            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
412                      [IntrNoMem]>;
413  def int_ppc_altivec_vpkshus : GCCBuiltin<"__builtin_altivec_vpkshus">,
414            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
415                      [IntrNoMem]>;
416  def int_ppc_altivec_vpkswss : GCCBuiltin<"__builtin_altivec_vpkswss">,
417            Intrinsic<[llvm_v16i8_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
418                      [IntrNoMem]>;
419  def int_ppc_altivec_vpkswus : GCCBuiltin<"__builtin_altivec_vpkswus">,
420            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
421                      [IntrNoMem]>;
422  // vpkuhum is lowered to a shuffle.
423  def int_ppc_altivec_vpkuhus : GCCBuiltin<"__builtin_altivec_vpkuhus">,
424            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
425                      [IntrNoMem]>;
426  // vpkuwum is lowered to a shuffle.
427  def int_ppc_altivec_vpkuwus : GCCBuiltin<"__builtin_altivec_vpkuwus">,
428            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
429                      [IntrNoMem]>;
430
431  // Unpacks.
432  def int_ppc_altivec_vupkhpx : GCCBuiltin<"__builtin_altivec_vupkhpx">,
433            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
434  def int_ppc_altivec_vupkhsb : GCCBuiltin<"__builtin_altivec_vupkhsb">,
435            Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
436  def int_ppc_altivec_vupkhsh : GCCBuiltin<"__builtin_altivec_vupkhsh">,
437            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
438  def int_ppc_altivec_vupklpx : GCCBuiltin<"__builtin_altivec_vupklpx">,
439            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
440  def int_ppc_altivec_vupklsb : GCCBuiltin<"__builtin_altivec_vupklsb">,
441            Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
442  def int_ppc_altivec_vupklsh : GCCBuiltin<"__builtin_altivec_vupklsh">,
443            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
444
445
446  // FP <-> integer conversion.
447  def int_ppc_altivec_vcfsx : GCCBuiltin<"__builtin_altivec_vcfsx">,
448              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
449                        [IntrNoMem]>;
450  def int_ppc_altivec_vcfux : GCCBuiltin<"__builtin_altivec_vcfux">,
451              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
452                        [IntrNoMem]>;
453  def int_ppc_altivec_vctsxs : GCCBuiltin<"__builtin_altivec_vctsxs">,
454              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
455                        [IntrNoMem]>;
456  def int_ppc_altivec_vctuxs : GCCBuiltin<"__builtin_altivec_vctuxs">,
457              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
458                        [IntrNoMem]>;
459
460  def int_ppc_altivec_vrfim : GCCBuiltin<"__builtin_altivec_vrfim">,
461              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
462  def int_ppc_altivec_vrfin : GCCBuiltin<"__builtin_altivec_vrfin">,
463              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
464  def int_ppc_altivec_vrfip : GCCBuiltin<"__builtin_altivec_vrfip">,
465              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
466  def int_ppc_altivec_vrfiz : GCCBuiltin<"__builtin_altivec_vrfiz">,
467              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
468}
469
470def int_ppc_altivec_vsl   : PowerPC_Vec_WWW_Intrinsic<"vsl">;
471def int_ppc_altivec_vslo  : PowerPC_Vec_WWW_Intrinsic<"vslo">;
472
473def int_ppc_altivec_vslb  : PowerPC_Vec_BBB_Intrinsic<"vslb">;
474def int_ppc_altivec_vslh  : PowerPC_Vec_HHH_Intrinsic<"vslh">;
475def int_ppc_altivec_vslw  : PowerPC_Vec_WWW_Intrinsic<"vslw">;
476
477// Right Shifts.
478def int_ppc_altivec_vsr   : PowerPC_Vec_WWW_Intrinsic<"vsr">;
479def int_ppc_altivec_vsro  : PowerPC_Vec_WWW_Intrinsic<"vsro">;
480
481def int_ppc_altivec_vsrb  : PowerPC_Vec_BBB_Intrinsic<"vsrb">;
482def int_ppc_altivec_vsrh  : PowerPC_Vec_HHH_Intrinsic<"vsrh">;
483def int_ppc_altivec_vsrw  : PowerPC_Vec_WWW_Intrinsic<"vsrw">;
484def int_ppc_altivec_vsrab : PowerPC_Vec_BBB_Intrinsic<"vsrab">;
485def int_ppc_altivec_vsrah : PowerPC_Vec_HHH_Intrinsic<"vsrah">;
486def int_ppc_altivec_vsraw : PowerPC_Vec_WWW_Intrinsic<"vsraw">;
487
488// Rotates.
489def int_ppc_altivec_vrlb  : PowerPC_Vec_BBB_Intrinsic<"vrlb">;
490def int_ppc_altivec_vrlh  : PowerPC_Vec_HHH_Intrinsic<"vrlh">;
491def int_ppc_altivec_vrlw  : PowerPC_Vec_WWW_Intrinsic<"vrlw">;
492
493let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
494  // Miscellaneous.
495  def int_ppc_altivec_lvsl :
496              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
497  def int_ppc_altivec_lvsr :
498              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
499
500  def int_ppc_altivec_vperm : GCCBuiltin<"__builtin_altivec_vperm_4si">,
501              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
502                         llvm_v4i32_ty, llvm_v16i8_ty], [IntrNoMem]>;
503  def int_ppc_altivec_vsel : GCCBuiltin<"__builtin_altivec_vsel_4si">,
504              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
505                         llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
506}
507
508def int_ppc_altivec_vexptefp  : PowerPC_Vec_FF_Intrinsic<"vexptefp">;
509def int_ppc_altivec_vlogefp   : PowerPC_Vec_FF_Intrinsic<"vlogefp">;
510def int_ppc_altivec_vrefp     : PowerPC_Vec_FF_Intrinsic<"vrefp">;
511def int_ppc_altivec_vrsqrtefp : PowerPC_Vec_FF_Intrinsic<"vrsqrtefp">;
512
513
514//===----------------------------------------------------------------------===//
515// PowerPC VSX Intrinsic Definitions.
516
517let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
518
519// Vector load.
520def int_ppc_vsx_lxvw4x :
521      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
522def int_ppc_vsx_lxvd2x :
523      Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty], [IntrReadArgMem]>;
524
525// Vector store.
526def int_ppc_vsx_stxvw4x :
527      Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty], [IntrReadWriteArgMem]>;
528def int_ppc_vsx_stxvd2x :
529      Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty], [IntrReadWriteArgMem]>;
530
531// Vector and scalar maximum.
532def int_ppc_vsx_xvmaxdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmaxdp">;
533def int_ppc_vsx_xvmaxsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvmaxsp">;
534def int_ppc_vsx_xsmaxdp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmaxdp">;
535
536// Vector and scalar minimum.
537def int_ppc_vsx_xvmindp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmindp">;
538def int_ppc_vsx_xvminsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvminsp">;
539def int_ppc_vsx_xsmindp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmindp">;
540
541// Vector divide.
542def int_ppc_vsx_xvdivdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvdivdp">;
543def int_ppc_vsx_xvdivsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvdivsp">;
544}
545