xref: /freebsd-src/contrib/llvm-project/llvm/include/llvm/IR/IntrinsicsPowerPC.td (revision 2aa3ef285a23d802f0bd6c7281612e16834e9b68)
1//===- IntrinsicsPowerPC.td - Defines PowerPC intrinsics ---*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines all of the PowerPC-specific intrinsics.
10//
11//===----------------------------------------------------------------------===//
12
13//===----------------------------------------------------------------------===//
14// Definitions for all PowerPC intrinsics.
15//
16
17// Non-altivec intrinsics.
18let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
19  // dcba/dcbf/dcbi/dcbst/dcbt/dcbz/dcbzl(PPC970) instructions.
20  def int_ppc_dcba  : Intrinsic<[], [llvm_ptr_ty], []>;
21  def int_ppc_dcbf  : GCCBuiltin<"__builtin_dcbf">,
22                      Intrinsic<[], [llvm_ptr_ty], []>;
23  def int_ppc_dcbfl : Intrinsic<[], [llvm_ptr_ty], []>;
24  def int_ppc_dcbflp: Intrinsic<[], [llvm_ptr_ty], []>;
25  def int_ppc_dcbi  : Intrinsic<[], [llvm_ptr_ty], []>;
26  def int_ppc_dcbst : Intrinsic<[], [llvm_ptr_ty], []>;
27  def int_ppc_dcbt  : Intrinsic<[], [llvm_ptr_ty],
28    [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
29  def int_ppc_dcbtst: Intrinsic<[], [llvm_ptr_ty],
30    [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
31  def int_ppc_dcbt_with_hint: Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
32    [IntrArgMemOnly, NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
33  def int_ppc_dcbtst_with_hint: Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
34    [IntrArgMemOnly, NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
35  def int_ppc_dcbz  : Intrinsic<[], [llvm_ptr_ty], []>;
36  def int_ppc_dcbzl : Intrinsic<[], [llvm_ptr_ty], []>;
37
38  // Population Count in each Byte.
39  def int_ppc_popcntb : Intrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem]>;
40
41  // sync instruction (i.e. sync 0, a.k.a hwsync)
42  def int_ppc_sync : Intrinsic<[], [], []>;
43  // isync instruction
44  def int_ppc_isync : Intrinsic<[], [], []>;
45  // lwsync is sync 1
46  def int_ppc_lwsync : Intrinsic<[], [], []>;
47  // eieio instruction
48  def int_ppc_eieio : Intrinsic<[],[],[]>;
49
50  // Intrinsics for [double]word extended forms of divide instructions
51  def int_ppc_divwe : GCCBuiltin<"__builtin_divwe">,
52                      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
53                                [IntrNoMem]>;
54  def int_ppc_divweu : GCCBuiltin<"__builtin_divweu">,
55                       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
56                                 [IntrNoMem]>;
57  def int_ppc_divde : GCCBuiltin<"__builtin_divde">,
58                      Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
59                                [IntrNoMem]>;
60  def int_ppc_divdeu : GCCBuiltin<"__builtin_divdeu">,
61                       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
62                                 [IntrNoMem]>;
63
64  // Bit permute doubleword
65  def int_ppc_bpermd : GCCBuiltin<"__builtin_bpermd">,
66                       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
67                                 [IntrNoMem]>;
68
69  // Parallel Bits Deposit/Extract Doubleword Builtins.
70  def int_ppc_pdepd
71      : GCCBuiltin<"__builtin_pdepd">,
72        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
73  def int_ppc_pextd
74      : GCCBuiltin<"__builtin_pextd">,
75        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
76
77  // Centrifuge Doubleword Builtin.
78  def int_ppc_cfuged
79      : GCCBuiltin<"__builtin_cfuged">,
80        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
81
82  // Count Leading / Trailing Zeroes under bit Mask Builtins.
83  def int_ppc_cntlzdm
84      : GCCBuiltin<"__builtin_cntlzdm">,
85        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
86  def int_ppc_cnttzdm
87      : GCCBuiltin<"__builtin_cnttzdm">,
88        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
89
90  def int_ppc_truncf128_round_to_odd
91      : GCCBuiltin<"__builtin_truncf128_round_to_odd">,
92        Intrinsic <[llvm_double_ty], [llvm_f128_ty], [IntrNoMem]>;
93  def int_ppc_sqrtf128_round_to_odd
94      : GCCBuiltin<"__builtin_sqrtf128_round_to_odd">,
95        Intrinsic <[llvm_f128_ty], [llvm_f128_ty], [IntrNoMem]>;
96  def int_ppc_addf128_round_to_odd
97      : GCCBuiltin<"__builtin_addf128_round_to_odd">,
98        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
99  def int_ppc_subf128_round_to_odd
100      : GCCBuiltin<"__builtin_subf128_round_to_odd">,
101        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
102  def int_ppc_mulf128_round_to_odd
103      : GCCBuiltin<"__builtin_mulf128_round_to_odd">,
104        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
105  def int_ppc_divf128_round_to_odd
106      : GCCBuiltin<"__builtin_divf128_round_to_odd">,
107        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
108  def int_ppc_fmaf128_round_to_odd
109      : GCCBuiltin<"__builtin_fmaf128_round_to_odd">,
110        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
111  def int_ppc_scalar_extract_expq
112      : GCCBuiltin<"__builtin_vsx_scalar_extract_expq">,
113        Intrinsic <[llvm_i64_ty], [llvm_f128_ty], [IntrNoMem]>;
114  def int_ppc_scalar_insert_exp_qp
115      : GCCBuiltin<"__builtin_vsx_scalar_insert_exp_qp">,
116        Intrinsic <[llvm_f128_ty], [llvm_f128_ty, llvm_i64_ty], [IntrNoMem]>;
117
118}
119
120
121let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
122  /// PowerPC_Vec_Intrinsic - Base class for all altivec intrinsics.
123  class PowerPC_Vec_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
124                              list<LLVMType> param_types,
125                              list<IntrinsicProperty> properties>
126    : GCCBuiltin<!strconcat("__builtin_altivec_", GCCIntSuffix)>,
127      Intrinsic<ret_types, param_types, properties>;
128
129  /// PowerPC_VSX_Intrinsic - Base class for all VSX intrinsics.
130  class PowerPC_VSX_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
131                              list<LLVMType> param_types,
132                              list<IntrinsicProperty> properties>
133    : GCCBuiltin<!strconcat("__builtin_vsx_", GCCIntSuffix)>,
134      Intrinsic<ret_types, param_types, properties>;
135}
136
137//===----------------------------------------------------------------------===//
138// PowerPC Altivec Intrinsic Class Definitions.
139//
140
141/// PowerPC_Vec_FF_Intrinsic - A PowerPC intrinsic that takes one v4f32
142/// vector and returns one.  These intrinsics have no side effects.
143class PowerPC_Vec_FF_Intrinsic<string GCCIntSuffix>
144  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
145                          [llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
146
147/// PowerPC_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
148/// vectors and returns one.  These intrinsics have no side effects.
149class PowerPC_Vec_FFF_Intrinsic<string GCCIntSuffix>
150  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
151                          [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
152                          [IntrNoMem]>;
153
154/// PowerPC_Vec_BBB_Intrinsic - A PowerPC intrinsic that takes two v16i8
155/// vectors and returns one.  These intrinsics have no side effects.
156class PowerPC_Vec_BBB_Intrinsic<string GCCIntSuffix>
157  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
158                          [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
159                          [IntrNoMem]>;
160
161/// PowerPC_Vec_HHH_Intrinsic - A PowerPC intrinsic that takes two v8i16
162/// vectors and returns one.  These intrinsics have no side effects.
163class PowerPC_Vec_HHH_Intrinsic<string GCCIntSuffix>
164  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
165                          [llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
166                          [IntrNoMem]>;
167
168/// PowerPC_Vec_WWW_Intrinsic - A PowerPC intrinsic that takes two v4i32
169/// vectors and returns one.  These intrinsics have no side effects.
170class PowerPC_Vec_WWW_Intrinsic<string GCCIntSuffix>
171  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
172                          [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
173                          [IntrNoMem]>;
174
175/// PowerPC_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2i64
176/// vectors and returns one.  These intrinsics have no side effects.
177class PowerPC_Vec_DDD_Intrinsic<string GCCIntSuffix>
178  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
179                          [llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
180                          [IntrNoMem]>;
181
182/// PowerPC_Vec_QQQ_Intrinsic - A PowerPC intrinsic that takes two v1i128
183/// vectors and returns one. These intrinsics have no side effects.
184class PowerPC_Vec_QQQ_Intrinsic<string GCCIntSuffix>
185  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
186                         [llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
187                         [IntrNoMem]>;
188
189//===----------------------------------------------------------------------===//
190// PowerPC VSX Intrinsic Class Definitions.
191//
192
193/// PowerPC_VSX_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2f64
194/// vectors and returns one.  These intrinsics have no side effects.
195class PowerPC_VSX_Vec_DDD_Intrinsic<string GCCIntSuffix>
196  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
197                          [llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty],
198                          [IntrNoMem]>;
199
200/// PowerPC_VSX_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
201/// vectors and returns one.  These intrinsics have no side effects.
202class PowerPC_VSX_Vec_FFF_Intrinsic<string GCCIntSuffix>
203  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
204                          [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
205                          [IntrNoMem]>;
206
207/// PowerPC_VSX_Sca_DDD_Intrinsic - A PowerPC intrinsic that takes two f64
208/// scalars and returns one.  These intrinsics have no side effects.
209class PowerPC_VSX_Sca_DDD_Intrinsic<string GCCIntSuffix>
210  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
211                          [llvm_double_ty], [llvm_double_ty, llvm_double_ty],
212                          [IntrNoMem]>;
213
214//===----------------------------------------------------------------------===//
215// PowerPC Altivec Intrinsic Definitions.
216
217let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
218  // Data Stream Control.
219  def int_ppc_altivec_dss : GCCBuiltin<"__builtin_altivec_dss">,
220              Intrinsic<[], [llvm_i32_ty], []>;
221  def int_ppc_altivec_dssall : GCCBuiltin<"__builtin_altivec_dssall">,
222              Intrinsic<[], [], []>;
223  def int_ppc_altivec_dst : GCCBuiltin<"__builtin_altivec_dst">,
224              Intrinsic<[],
225                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
226                        []>;
227  def int_ppc_altivec_dstt : GCCBuiltin<"__builtin_altivec_dstt">,
228              Intrinsic<[],
229                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
230                        []>;
231  def int_ppc_altivec_dstst : GCCBuiltin<"__builtin_altivec_dstst">,
232              Intrinsic<[],
233                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
234                        []>;
235  def int_ppc_altivec_dststt : GCCBuiltin<"__builtin_altivec_dststt">,
236              Intrinsic<[],
237                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
238                        []>;
239
240  // VSCR access.
241  def int_ppc_altivec_mfvscr : GCCBuiltin<"__builtin_altivec_mfvscr">,
242              Intrinsic<[llvm_v8i16_ty], [], [IntrReadMem]>;
243  def int_ppc_altivec_mtvscr : GCCBuiltin<"__builtin_altivec_mtvscr">,
244              Intrinsic<[], [llvm_v4i32_ty], []>;
245
246
247  // Loads.  These don't map directly to GCC builtins because they represent the
248  // source address with a single pointer.
249  def int_ppc_altivec_lvx :
250              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
251  def int_ppc_altivec_lvxl :
252              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
253  def int_ppc_altivec_lvebx :
254              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
255  def int_ppc_altivec_lvehx :
256              Intrinsic<[llvm_v8i16_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
257  def int_ppc_altivec_lvewx :
258              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
259
260  // Stores.  These don't map directly to GCC builtins because they represent the
261  // source address with a single pointer.
262  def int_ppc_altivec_stvx :
263              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
264                        [IntrWriteMem, IntrArgMemOnly]>;
265  def int_ppc_altivec_stvxl :
266              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
267                        [IntrWriteMem, IntrArgMemOnly]>;
268  def int_ppc_altivec_stvebx :
269              Intrinsic<[], [llvm_v16i8_ty, llvm_ptr_ty],
270                        [IntrWriteMem, IntrArgMemOnly]>;
271  def int_ppc_altivec_stvehx :
272              Intrinsic<[], [llvm_v8i16_ty, llvm_ptr_ty],
273                        [IntrWriteMem, IntrArgMemOnly]>;
274  def int_ppc_altivec_stvewx :
275              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
276                        [IntrWriteMem, IntrArgMemOnly]>;
277
278  // Comparisons setting a vector.
279  def int_ppc_altivec_vcmpbfp : GCCBuiltin<"__builtin_altivec_vcmpbfp">,
280              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
281                        [IntrNoMem]>;
282  def int_ppc_altivec_vcmpeqfp : GCCBuiltin<"__builtin_altivec_vcmpeqfp">,
283              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
284                        [IntrNoMem]>;
285  def int_ppc_altivec_vcmpgefp : GCCBuiltin<"__builtin_altivec_vcmpgefp">,
286              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
287                        [IntrNoMem]>;
288  def int_ppc_altivec_vcmpgtfp : GCCBuiltin<"__builtin_altivec_vcmpgtfp">,
289              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
290                        [IntrNoMem]>;
291
292  def int_ppc_altivec_vcmpequd : GCCBuiltin<"__builtin_altivec_vcmpequd">,
293              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
294                        [IntrNoMem]>;
295  def int_ppc_altivec_vcmpgtsd : GCCBuiltin<"__builtin_altivec_vcmpgtsd">,
296              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
297                        [IntrNoMem]>;
298  def int_ppc_altivec_vcmpgtud : GCCBuiltin<"__builtin_altivec_vcmpgtud">,
299              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
300                        [IntrNoMem]>;
301
302  def int_ppc_altivec_vcmpequw : GCCBuiltin<"__builtin_altivec_vcmpequw">,
303              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
304                        [IntrNoMem]>;
305  def int_ppc_altivec_vcmpgtsw : GCCBuiltin<"__builtin_altivec_vcmpgtsw">,
306              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
307                        [IntrNoMem]>;
308  def int_ppc_altivec_vcmpgtuw : GCCBuiltin<"__builtin_altivec_vcmpgtuw">,
309              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
310                        [IntrNoMem]>;
311  def int_ppc_altivec_vcmpnew : GCCBuiltin<"__builtin_altivec_vcmpnew">,
312              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
313                        [IntrNoMem]>;
314  def int_ppc_altivec_vcmpnezw : GCCBuiltin<"__builtin_altivec_vcmpnezw">,
315              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
316                        [IntrNoMem]>;
317
318  def int_ppc_altivec_vcmpequh : GCCBuiltin<"__builtin_altivec_vcmpequh">,
319              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
320                        [IntrNoMem]>;
321  def int_ppc_altivec_vcmpgtsh : GCCBuiltin<"__builtin_altivec_vcmpgtsh">,
322              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
323                        [IntrNoMem]>;
324  def int_ppc_altivec_vcmpgtuh : GCCBuiltin<"__builtin_altivec_vcmpgtuh">,
325              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
326                        [IntrNoMem]>;
327  def int_ppc_altivec_vcmpneh : GCCBuiltin<"__builtin_altivec_vcmpneh">,
328              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
329                        [IntrNoMem]>;
330  def int_ppc_altivec_vcmpnezh : GCCBuiltin<"__builtin_altivec_vcmpnezh">,
331              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
332                        [IntrNoMem]>;
333
334  def int_ppc_altivec_vcmpequb : GCCBuiltin<"__builtin_altivec_vcmpequb">,
335              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
336                        [IntrNoMem]>;
337  def int_ppc_altivec_vcmpgtsb : GCCBuiltin<"__builtin_altivec_vcmpgtsb">,
338              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
339                        [IntrNoMem]>;
340  def int_ppc_altivec_vcmpgtub : GCCBuiltin<"__builtin_altivec_vcmpgtub">,
341              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
342                        [IntrNoMem]>;
343  def int_ppc_altivec_vcmpneb : GCCBuiltin<"__builtin_altivec_vcmpneb">,
344              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
345                        [IntrNoMem]>;
346  def int_ppc_altivec_vcmpnezb : GCCBuiltin<"__builtin_altivec_vcmpnezb">,
347              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
348                        [IntrNoMem]>;
349
350  // Predicate Comparisons.  The first operand specifies interpretation of CR6.
351  def int_ppc_altivec_vcmpbfp_p : GCCBuiltin<"__builtin_altivec_vcmpbfp_p">,
352              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
353                        [IntrNoMem]>;
354  def int_ppc_altivec_vcmpeqfp_p : GCCBuiltin<"__builtin_altivec_vcmpeqfp_p">,
355              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
356                        [IntrNoMem]>;
357  def int_ppc_altivec_vcmpgefp_p : GCCBuiltin<"__builtin_altivec_vcmpgefp_p">,
358              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
359                        [IntrNoMem]>;
360  def int_ppc_altivec_vcmpgtfp_p : GCCBuiltin<"__builtin_altivec_vcmpgtfp_p">,
361              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
362                        [IntrNoMem]>;
363
364  def int_ppc_altivec_vcmpequd_p : GCCBuiltin<"__builtin_altivec_vcmpequd_p">,
365              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
366                        [IntrNoMem]>;
367  def int_ppc_altivec_vcmpgtsd_p : GCCBuiltin<"__builtin_altivec_vcmpgtsd_p">,
368              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
369                        [IntrNoMem]>;
370  def int_ppc_altivec_vcmpgtud_p : GCCBuiltin<"__builtin_altivec_vcmpgtud_p">,
371              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
372                        [IntrNoMem]>;
373
374  def int_ppc_altivec_vcmpequw_p : GCCBuiltin<"__builtin_altivec_vcmpequw_p">,
375              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
376                        [IntrNoMem]>;
377  def int_ppc_altivec_vcmpgtsw_p : GCCBuiltin<"__builtin_altivec_vcmpgtsw_p">,
378              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
379                        [IntrNoMem]>;
380  def int_ppc_altivec_vcmpgtuw_p : GCCBuiltin<"__builtin_altivec_vcmpgtuw_p">,
381              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
382                        [IntrNoMem]>;
383  def int_ppc_altivec_vcmpnew_p : GCCBuiltin<"__builtin_altivec_vcmpnew_p">,
384              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
385                        [IntrNoMem]>;
386  def int_ppc_altivec_vcmpnezw_p : GCCBuiltin<"__builtin_altivec_vcmpnezw_p">,
387              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
388                        [IntrNoMem]>;
389
390  def int_ppc_altivec_vcmpequh_p : GCCBuiltin<"__builtin_altivec_vcmpequh_p">,
391              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
392                        [IntrNoMem]>;
393  def int_ppc_altivec_vcmpgtsh_p : GCCBuiltin<"__builtin_altivec_vcmpgtsh_p">,
394              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
395                        [IntrNoMem]>;
396  def int_ppc_altivec_vcmpgtuh_p : GCCBuiltin<"__builtin_altivec_vcmpgtuh_p">,
397              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
398                        [IntrNoMem]>;
399  def int_ppc_altivec_vcmpneh_p : GCCBuiltin<"__builtin_altivec_vcmpneh_p">,
400              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
401                        [IntrNoMem]>;
402  def int_ppc_altivec_vcmpnezh_p : GCCBuiltin<"__builtin_altivec_vcmpnezh_p">,
403              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
404                        [IntrNoMem]>;
405
406  def int_ppc_altivec_vcmpequb_p : GCCBuiltin<"__builtin_altivec_vcmpequb_p">,
407              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
408                        [IntrNoMem]>;
409  def int_ppc_altivec_vcmpgtsb_p : GCCBuiltin<"__builtin_altivec_vcmpgtsb_p">,
410              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
411                        [IntrNoMem]>;
412  def int_ppc_altivec_vcmpgtub_p : GCCBuiltin<"__builtin_altivec_vcmpgtub_p">,
413              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
414                        [IntrNoMem]>;
415  def int_ppc_altivec_vcmpneb_p : GCCBuiltin<"__builtin_altivec_vcmpneb_p">,
416              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
417                        [IntrNoMem]>;
418  def int_ppc_altivec_vcmpnezb_p : GCCBuiltin<"__builtin_altivec_vcmpnezb_p">,
419              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
420                        [IntrNoMem]>;
421  def int_ppc_altivec_vclzlsbb : GCCBuiltin<"__builtin_altivec_vclzlsbb">,
422              Intrinsic<[llvm_i32_ty],[llvm_v16i8_ty],[IntrNoMem]>;
423  def int_ppc_altivec_vctzlsbb : GCCBuiltin<"__builtin_altivec_vctzlsbb">,
424              Intrinsic<[llvm_i32_ty],[llvm_v16i8_ty],[IntrNoMem]>;
425  def int_ppc_altivec_vprtybw : GCCBuiltin<"__builtin_altivec_vprtybw">,
426              Intrinsic<[llvm_v4i32_ty],[llvm_v4i32_ty],[IntrNoMem]>;
427  def int_ppc_altivec_vprtybd : GCCBuiltin<"__builtin_altivec_vprtybd">,
428              Intrinsic<[llvm_v2i64_ty],[llvm_v2i64_ty],[IntrNoMem]>;
429  def int_ppc_altivec_vprtybq : GCCBuiltin<"__builtin_altivec_vprtybq">,
430              Intrinsic<[llvm_v1i128_ty],[llvm_v1i128_ty],[IntrNoMem]>;
431
432  // P10 Vector Parallel Bits Deposit/Extract Doubleword Builtins.
433  def int_ppc_altivec_vpdepd : GCCBuiltin<"__builtin_altivec_vpdepd">,
434              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
435                        [IntrNoMem]>;
436  def int_ppc_altivec_vpextd : GCCBuiltin<"__builtin_altivec_vpextd">,
437              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
438                        [IntrNoMem]>;
439
440  // P10 Vector Centrifuge Builtin.
441  def int_ppc_altivec_vcfuged : GCCBuiltin<"__builtin_altivec_vcfuged">,
442              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
443                        [IntrNoMem]>;
444
445  // P10 Vector Gather Every Nth Bit Builtin.
446  def int_ppc_altivec_vgnb : GCCBuiltin<"__builtin_altivec_vgnb">,
447              Intrinsic<[llvm_i64_ty], [llvm_v1i128_ty, llvm_i32_ty],
448                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
449
450   // P10 Vector Clear Bytes
451   def int_ppc_altivec_vclrlb :  GCCBuiltin<"__builtin_altivec_vclrlb">,
452               Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty],
453                         [IntrNoMem]>;
454   def int_ppc_altivec_vclrrb :  GCCBuiltin<"__builtin_altivec_vclrrb">,
455               Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty],
456                         [IntrNoMem]>;
457
458  // P10 Vector Shift Double Bit Immediate.
459  def int_ppc_altivec_vsldbi : GCCBuiltin<"__builtin_altivec_vsldbi">,
460              Intrinsic<[llvm_v16i8_ty],
461                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
462                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
463  def int_ppc_altivec_vsrdbi : GCCBuiltin<"__builtin_altivec_vsrdbi">,
464              Intrinsic<[llvm_v16i8_ty],
465                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
466                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
467
468  // P10 Vector Insert.
469  def int_ppc_altivec_vinsblx : GCCBuiltin<"__builtin_altivec_vinsblx">,
470              Intrinsic<[llvm_v16i8_ty],
471                        [llvm_v16i8_ty, llvm_i64_ty, llvm_i64_ty],
472                        [IntrNoMem]>;
473  def int_ppc_altivec_vinsbrx : GCCBuiltin<"__builtin_altivec_vinsbrx">,
474              Intrinsic<[llvm_v16i8_ty],
475                        [llvm_v16i8_ty, llvm_i64_ty, llvm_i64_ty],
476                        [IntrNoMem]>;
477  def int_ppc_altivec_vinshlx : GCCBuiltin<"__builtin_altivec_vinshlx">,
478              Intrinsic<[llvm_v8i16_ty],
479                        [llvm_v8i16_ty, llvm_i64_ty, llvm_i64_ty],
480                        [IntrNoMem]>;
481  def int_ppc_altivec_vinshrx : GCCBuiltin<"__builtin_altivec_vinshrx">,
482              Intrinsic<[llvm_v8i16_ty],
483                        [llvm_v8i16_ty, llvm_i64_ty, llvm_i64_ty],
484                        [IntrNoMem]>;
485  def int_ppc_altivec_vinswlx : GCCBuiltin<"__builtin_altivec_vinswlx">,
486              Intrinsic<[llvm_v4i32_ty],
487                        [llvm_v4i32_ty, llvm_i64_ty, llvm_i64_ty],
488                        [IntrNoMem]>;
489  def int_ppc_altivec_vinswrx : GCCBuiltin<"__builtin_altivec_vinswrx">,
490              Intrinsic<[llvm_v4i32_ty],
491                        [llvm_v4i32_ty, llvm_i64_ty, llvm_i64_ty],
492                        [IntrNoMem]>;
493  def int_ppc_altivec_vinsdlx : GCCBuiltin<"__builtin_altivec_vinsdlx">,
494              Intrinsic<[llvm_v2i64_ty],
495                        [llvm_v2i64_ty, llvm_i64_ty, llvm_i64_ty],
496                        [IntrNoMem]>;
497  def int_ppc_altivec_vinsdrx : GCCBuiltin<"__builtin_altivec_vinsdrx">,
498              Intrinsic<[llvm_v2i64_ty],
499                        [llvm_v2i64_ty, llvm_i64_ty, llvm_i64_ty],
500                        [IntrNoMem]>;
501  def int_ppc_altivec_vinsbvlx : GCCBuiltin<"__builtin_altivec_vinsbvlx">,
502              Intrinsic<[llvm_v16i8_ty],
503                        [llvm_v16i8_ty, llvm_i64_ty, llvm_v16i8_ty],
504                        [IntrNoMem]>;
505  def int_ppc_altivec_vinsbvrx : GCCBuiltin<"__builtin_altivec_vinsbvrx">,
506              Intrinsic<[llvm_v16i8_ty],
507                        [llvm_v16i8_ty, llvm_i64_ty, llvm_v16i8_ty],
508                        [IntrNoMem]>;
509  def int_ppc_altivec_vinshvlx : GCCBuiltin<"__builtin_altivec_vinshvlx">,
510              Intrinsic<[llvm_v8i16_ty],
511                        [llvm_v8i16_ty, llvm_i64_ty, llvm_v8i16_ty],
512                        [IntrNoMem]>;
513 def int_ppc_altivec_vinshvrx : GCCBuiltin<"__builtin_altivec_vinshvrx">,
514              Intrinsic<[llvm_v8i16_ty],
515                        [llvm_v8i16_ty, llvm_i64_ty, llvm_v8i16_ty],
516                        [IntrNoMem]>;
517  def int_ppc_altivec_vinswvlx : GCCBuiltin<"__builtin_altivec_vinswvlx">,
518              Intrinsic<[llvm_v4i32_ty],
519                        [llvm_v4i32_ty, llvm_i64_ty, llvm_v4i32_ty],
520                        [IntrNoMem]>;
521  def int_ppc_altivec_vinswvrx : GCCBuiltin<"__builtin_altivec_vinswvrx">,
522              Intrinsic<[llvm_v4i32_ty],
523                        [llvm_v4i32_ty, llvm_i64_ty, llvm_v4i32_ty],
524                        [IntrNoMem]>;
525  // P10 Vector Insert with immediate.
526  def int_ppc_altivec_vinsw :
527              Intrinsic<[llvm_v4i32_ty],
528                        [llvm_v4i32_ty, llvm_i64_ty, llvm_i32_ty],
529                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
530  def int_ppc_altivec_vinsd :
531              Intrinsic<[llvm_v2i64_ty],
532                        [llvm_v2i64_ty, llvm_i64_ty, llvm_i32_ty],
533                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
534}
535
536// Vector average.
537def int_ppc_altivec_vavgsb : PowerPC_Vec_BBB_Intrinsic<"vavgsb">;
538def int_ppc_altivec_vavgsh : PowerPC_Vec_HHH_Intrinsic<"vavgsh">;
539def int_ppc_altivec_vavgsw : PowerPC_Vec_WWW_Intrinsic<"vavgsw">;
540def int_ppc_altivec_vavgub : PowerPC_Vec_BBB_Intrinsic<"vavgub">;
541def int_ppc_altivec_vavguh : PowerPC_Vec_HHH_Intrinsic<"vavguh">;
542def int_ppc_altivec_vavguw : PowerPC_Vec_WWW_Intrinsic<"vavguw">;
543
544// Vector maximum.
545def int_ppc_altivec_vmaxfp : PowerPC_Vec_FFF_Intrinsic<"vmaxfp">;
546def int_ppc_altivec_vmaxsb : PowerPC_Vec_BBB_Intrinsic<"vmaxsb">;
547def int_ppc_altivec_vmaxsh : PowerPC_Vec_HHH_Intrinsic<"vmaxsh">;
548def int_ppc_altivec_vmaxsw : PowerPC_Vec_WWW_Intrinsic<"vmaxsw">;
549def int_ppc_altivec_vmaxsd : PowerPC_Vec_DDD_Intrinsic<"vmaxsd">;
550def int_ppc_altivec_vmaxub : PowerPC_Vec_BBB_Intrinsic<"vmaxub">;
551def int_ppc_altivec_vmaxuh : PowerPC_Vec_HHH_Intrinsic<"vmaxuh">;
552def int_ppc_altivec_vmaxuw : PowerPC_Vec_WWW_Intrinsic<"vmaxuw">;
553def int_ppc_altivec_vmaxud : PowerPC_Vec_DDD_Intrinsic<"vmaxud">;
554
555// Vector minimum.
556def int_ppc_altivec_vminfp : PowerPC_Vec_FFF_Intrinsic<"vminfp">;
557def int_ppc_altivec_vminsb : PowerPC_Vec_BBB_Intrinsic<"vminsb">;
558def int_ppc_altivec_vminsh : PowerPC_Vec_HHH_Intrinsic<"vminsh">;
559def int_ppc_altivec_vminsw : PowerPC_Vec_WWW_Intrinsic<"vminsw">;
560def int_ppc_altivec_vminsd : PowerPC_Vec_DDD_Intrinsic<"vminsd">;
561def int_ppc_altivec_vminub : PowerPC_Vec_BBB_Intrinsic<"vminub">;
562def int_ppc_altivec_vminuh : PowerPC_Vec_HHH_Intrinsic<"vminuh">;
563def int_ppc_altivec_vminuw : PowerPC_Vec_WWW_Intrinsic<"vminuw">;
564def int_ppc_altivec_vminud : PowerPC_Vec_DDD_Intrinsic<"vminud">;
565
566// Saturating adds.
567def int_ppc_altivec_vaddubs : PowerPC_Vec_BBB_Intrinsic<"vaddubs">;
568def int_ppc_altivec_vaddsbs : PowerPC_Vec_BBB_Intrinsic<"vaddsbs">;
569def int_ppc_altivec_vadduhs : PowerPC_Vec_HHH_Intrinsic<"vadduhs">;
570def int_ppc_altivec_vaddshs : PowerPC_Vec_HHH_Intrinsic<"vaddshs">;
571def int_ppc_altivec_vadduws : PowerPC_Vec_WWW_Intrinsic<"vadduws">;
572def int_ppc_altivec_vaddsws : PowerPC_Vec_WWW_Intrinsic<"vaddsws">;
573def int_ppc_altivec_vaddcuw : PowerPC_Vec_WWW_Intrinsic<"vaddcuw">;
574def int_ppc_altivec_vaddcuq : PowerPC_Vec_QQQ_Intrinsic<"vaddcuq">;
575
576// Saturating subs.
577def int_ppc_altivec_vsububs : PowerPC_Vec_BBB_Intrinsic<"vsububs">;
578def int_ppc_altivec_vsubsbs : PowerPC_Vec_BBB_Intrinsic<"vsubsbs">;
579def int_ppc_altivec_vsubuhs : PowerPC_Vec_HHH_Intrinsic<"vsubuhs">;
580def int_ppc_altivec_vsubshs : PowerPC_Vec_HHH_Intrinsic<"vsubshs">;
581def int_ppc_altivec_vsubuws : PowerPC_Vec_WWW_Intrinsic<"vsubuws">;
582def int_ppc_altivec_vsubsws : PowerPC_Vec_WWW_Intrinsic<"vsubsws">;
583def int_ppc_altivec_vsubcuw : PowerPC_Vec_WWW_Intrinsic<"vsubcuw">;
584def int_ppc_altivec_vsubcuq : PowerPC_Vec_QQQ_Intrinsic<"vsubcuq">;
585
586let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
587  // Saturating multiply-adds.
588  def int_ppc_altivec_vmhaddshs : GCCBuiltin<"__builtin_altivec_vmhaddshs">,
589              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
590                         llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>;
591  def int_ppc_altivec_vmhraddshs : GCCBuiltin<"__builtin_altivec_vmhraddshs">,
592              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
593                         llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>;
594
595  def int_ppc_altivec_vmaddfp : GCCBuiltin<"__builtin_altivec_vmaddfp">,
596              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
597                         llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
598  def int_ppc_altivec_vnmsubfp : GCCBuiltin<"__builtin_altivec_vnmsubfp">,
599              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
600                         llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
601
602  // Vector Multiply Sum Instructions.
603  def int_ppc_altivec_vmsummbm : GCCBuiltin<"__builtin_altivec_vmsummbm">,
604            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
605                       llvm_v4i32_ty], [IntrNoMem]>;
606  def int_ppc_altivec_vmsumshm : GCCBuiltin<"__builtin_altivec_vmsumshm">,
607            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
608                       llvm_v4i32_ty], [IntrNoMem]>;
609  def int_ppc_altivec_vmsumshs : GCCBuiltin<"__builtin_altivec_vmsumshs">,
610            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
611                       llvm_v4i32_ty], [IntrNoMem]>;
612  def int_ppc_altivec_vmsumubm : GCCBuiltin<"__builtin_altivec_vmsumubm">,
613            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
614                       llvm_v4i32_ty], [IntrNoMem]>;
615  def int_ppc_altivec_vmsumuhm : GCCBuiltin<"__builtin_altivec_vmsumuhm">,
616            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
617                       llvm_v4i32_ty], [IntrNoMem]>;
618  def int_ppc_altivec_vmsumudm : GCCBuiltin<"__builtin_altivec_vmsumudm">,
619            Intrinsic<[llvm_v1i128_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
620                       llvm_v1i128_ty], [IntrNoMem]>;
621  def int_ppc_altivec_vmsumuhs : GCCBuiltin<"__builtin_altivec_vmsumuhs">,
622            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
623                       llvm_v4i32_ty], [IntrNoMem]>;
624
625  // Vector Multiply Instructions.
626  def int_ppc_altivec_vmulesb : GCCBuiltin<"__builtin_altivec_vmulesb">,
627          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
628                    [IntrNoMem]>;
629  def int_ppc_altivec_vmulesh : GCCBuiltin<"__builtin_altivec_vmulesh">,
630          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
631                    [IntrNoMem]>;
632  def int_ppc_altivec_vmulesw : GCCBuiltin<"__builtin_altivec_vmulesw">,
633          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
634                    [IntrNoMem]>;
635  def int_ppc_altivec_vmuleub : GCCBuiltin<"__builtin_altivec_vmuleub">,
636          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
637                    [IntrNoMem]>;
638  def int_ppc_altivec_vmuleuh : GCCBuiltin<"__builtin_altivec_vmuleuh">,
639          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
640                    [IntrNoMem]>;
641  def int_ppc_altivec_vmuleuw : GCCBuiltin<"__builtin_altivec_vmuleuw">,
642          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
643                    [IntrNoMem]>;
644
645  def int_ppc_altivec_vmulosb : GCCBuiltin<"__builtin_altivec_vmulosb">,
646          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
647                    [IntrNoMem]>;
648  def int_ppc_altivec_vmulosh : GCCBuiltin<"__builtin_altivec_vmulosh">,
649          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
650                    [IntrNoMem]>;
651  def int_ppc_altivec_vmulosw : GCCBuiltin<"__builtin_altivec_vmulosw">,
652          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
653                    [IntrNoMem]>;
654  def int_ppc_altivec_vmuloub : GCCBuiltin<"__builtin_altivec_vmuloub">,
655          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
656                    [IntrNoMem]>;
657  def int_ppc_altivec_vmulouh : GCCBuiltin<"__builtin_altivec_vmulouh">,
658          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
659                    [IntrNoMem]>;
660  def int_ppc_altivec_vmulouw : GCCBuiltin<"__builtin_altivec_vmulouw">,
661          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
662                    [IntrNoMem]>;
663
664  // Vector Sum Instructions.
665  def int_ppc_altivec_vsumsws : GCCBuiltin<"__builtin_altivec_vsumsws">,
666            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
667                      [IntrNoMem]>;
668  def int_ppc_altivec_vsum2sws : GCCBuiltin<"__builtin_altivec_vsum2sws">,
669            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
670                      [IntrNoMem]>;
671  def int_ppc_altivec_vsum4sbs : GCCBuiltin<"__builtin_altivec_vsum4sbs">,
672            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
673                      [IntrNoMem]>;
674  def int_ppc_altivec_vsum4shs : GCCBuiltin<"__builtin_altivec_vsum4shs">,
675            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v4i32_ty],
676                      [IntrNoMem]>;
677  def int_ppc_altivec_vsum4ubs : GCCBuiltin<"__builtin_altivec_vsum4ubs">,
678            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
679                      [IntrNoMem]>;
680
681  // Other multiplies.
682  def int_ppc_altivec_vmladduhm : GCCBuiltin<"__builtin_altivec_vmladduhm">,
683            Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
684                       llvm_v8i16_ty], [IntrNoMem]>;
685
686  // Packs.
687  def int_ppc_altivec_vpkpx : GCCBuiltin<"__builtin_altivec_vpkpx">,
688            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
689                      [IntrNoMem]>;
690  def int_ppc_altivec_vpkshss : GCCBuiltin<"__builtin_altivec_vpkshss">,
691            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
692                      [IntrNoMem]>;
693  def int_ppc_altivec_vpkshus : GCCBuiltin<"__builtin_altivec_vpkshus">,
694            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
695                      [IntrNoMem]>;
696  def int_ppc_altivec_vpkswss : GCCBuiltin<"__builtin_altivec_vpkswss">,
697            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
698                      [IntrNoMem]>;
699  def int_ppc_altivec_vpkswus : GCCBuiltin<"__builtin_altivec_vpkswus">,
700            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
701                      [IntrNoMem]>;
702  def int_ppc_altivec_vpksdss : GCCBuiltin<"__builtin_altivec_vpksdss">,
703            Intrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
704                      [IntrNoMem]>;
705  def int_ppc_altivec_vpksdus : GCCBuiltin<"__builtin_altivec_vpksdus">,
706            Intrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
707                      [IntrNoMem]>;
708  // vpkuhum is lowered to a shuffle.
709  def int_ppc_altivec_vpkuhus : GCCBuiltin<"__builtin_altivec_vpkuhus">,
710            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
711                      [IntrNoMem]>;
712  // vpkuwum is lowered to a shuffle.
713  def int_ppc_altivec_vpkuwus : GCCBuiltin<"__builtin_altivec_vpkuwus">,
714            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
715                      [IntrNoMem]>;
716  // vpkudum is lowered to a shuffle.
717  def int_ppc_altivec_vpkudus : GCCBuiltin<"__builtin_altivec_vpkudus">,
718            Intrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
719                      [IntrNoMem]>;
720
721  // Unpacks.
722  def int_ppc_altivec_vupkhpx : GCCBuiltin<"__builtin_altivec_vupkhpx">,
723            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
724  def int_ppc_altivec_vupkhsb : GCCBuiltin<"__builtin_altivec_vupkhsb">,
725            Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
726  def int_ppc_altivec_vupkhsh : GCCBuiltin<"__builtin_altivec_vupkhsh">,
727            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
728  def int_ppc_altivec_vupkhsw : GCCBuiltin<"__builtin_altivec_vupkhsw">,
729            Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
730  def int_ppc_altivec_vupklpx : GCCBuiltin<"__builtin_altivec_vupklpx">,
731            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
732  def int_ppc_altivec_vupklsb : GCCBuiltin<"__builtin_altivec_vupklsb">,
733            Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
734  def int_ppc_altivec_vupklsh : GCCBuiltin<"__builtin_altivec_vupklsh">,
735            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
736  def int_ppc_altivec_vupklsw : GCCBuiltin<"__builtin_altivec_vupklsw">,
737            Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
738
739
740  // FP <-> integer conversion.
741  def int_ppc_altivec_vcfsx : GCCBuiltin<"__builtin_altivec_vcfsx">,
742              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
743                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
744  def int_ppc_altivec_vcfux : GCCBuiltin<"__builtin_altivec_vcfux">,
745              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
746                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
747  def int_ppc_altivec_vctsxs : GCCBuiltin<"__builtin_altivec_vctsxs">,
748              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
749                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
750  def int_ppc_altivec_vctuxs : GCCBuiltin<"__builtin_altivec_vctuxs">,
751              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
752                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
753
754  def int_ppc_altivec_vrfim : GCCBuiltin<"__builtin_altivec_vrfim">,
755              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
756  def int_ppc_altivec_vrfin : GCCBuiltin<"__builtin_altivec_vrfin">,
757              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
758  def int_ppc_altivec_vrfip : GCCBuiltin<"__builtin_altivec_vrfip">,
759              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
760  def int_ppc_altivec_vrfiz : GCCBuiltin<"__builtin_altivec_vrfiz">,
761              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
762
763  // Add Extended Quadword
764  def int_ppc_altivec_vaddeuqm : GCCBuiltin<"__builtin_altivec_vaddeuqm">,
765              Intrinsic<[llvm_v1i128_ty],
766                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
767                        [IntrNoMem]>;
768  def int_ppc_altivec_vaddecuq : GCCBuiltin<"__builtin_altivec_vaddecuq">,
769              Intrinsic<[llvm_v1i128_ty],
770                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
771                        [IntrNoMem]>;
772
773  // Sub Extended Quadword
774  def int_ppc_altivec_vsubeuqm : GCCBuiltin<"__builtin_altivec_vsubeuqm">,
775              Intrinsic<[llvm_v1i128_ty],
776                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
777                        [IntrNoMem]>;
778  def int_ppc_altivec_vsubecuq : GCCBuiltin<"__builtin_altivec_vsubecuq">,
779              Intrinsic<[llvm_v1i128_ty],
780                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
781                        [IntrNoMem]>;
782
783  // P10 Vector Count Leading / Trailing Zeroes under bit Mask Builtins.
784  def int_ppc_altivec_vclzdm : GCCBuiltin<"__builtin_altivec_vclzdm">,
785              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
786                        [IntrNoMem]>;
787  def int_ppc_altivec_vctzdm : GCCBuiltin<"__builtin_altivec_vctzdm">,
788              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
789                        [IntrNoMem]>;
790}
791
792def int_ppc_altivec_vsl   : PowerPC_Vec_WWW_Intrinsic<"vsl">;
793def int_ppc_altivec_vslo  : PowerPC_Vec_WWW_Intrinsic<"vslo">;
794
795def int_ppc_altivec_vslb  : PowerPC_Vec_BBB_Intrinsic<"vslb">;
796def int_ppc_altivec_vslv  : PowerPC_Vec_BBB_Intrinsic<"vslv">;
797def int_ppc_altivec_vsrv  : PowerPC_Vec_BBB_Intrinsic<"vsrv">;
798def int_ppc_altivec_vslh  : PowerPC_Vec_HHH_Intrinsic<"vslh">;
799def int_ppc_altivec_vslw  : PowerPC_Vec_WWW_Intrinsic<"vslw">;
800
801// Right Shifts.
802def int_ppc_altivec_vsr   : PowerPC_Vec_WWW_Intrinsic<"vsr">;
803def int_ppc_altivec_vsro  : PowerPC_Vec_WWW_Intrinsic<"vsro">;
804
805def int_ppc_altivec_vsrb  : PowerPC_Vec_BBB_Intrinsic<"vsrb">;
806def int_ppc_altivec_vsrh  : PowerPC_Vec_HHH_Intrinsic<"vsrh">;
807def int_ppc_altivec_vsrw  : PowerPC_Vec_WWW_Intrinsic<"vsrw">;
808def int_ppc_altivec_vsrab : PowerPC_Vec_BBB_Intrinsic<"vsrab">;
809def int_ppc_altivec_vsrah : PowerPC_Vec_HHH_Intrinsic<"vsrah">;
810def int_ppc_altivec_vsraw : PowerPC_Vec_WWW_Intrinsic<"vsraw">;
811
812// Rotates.
813def int_ppc_altivec_vrlb  : PowerPC_Vec_BBB_Intrinsic<"vrlb">;
814def int_ppc_altivec_vrlh  : PowerPC_Vec_HHH_Intrinsic<"vrlh">;
815def int_ppc_altivec_vrlw  : PowerPC_Vec_WWW_Intrinsic<"vrlw">;
816def int_ppc_altivec_vrld  : PowerPC_Vec_DDD_Intrinsic<"vrld">;
817
818let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
819  // Miscellaneous.
820  def int_ppc_altivec_lvsl :
821              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
822  def int_ppc_altivec_lvsr :
823              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
824
825  def int_ppc_altivec_vperm : GCCBuiltin<"__builtin_altivec_vperm_4si">,
826              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
827                         llvm_v4i32_ty, llvm_v16i8_ty], [IntrNoMem]>;
828  def int_ppc_altivec_vsel : GCCBuiltin<"__builtin_altivec_vsel_4si">,
829              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
830                         llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
831  def int_ppc_altivec_vgbbd : GCCBuiltin<"__builtin_altivec_vgbbd">,
832              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
833  def int_ppc_altivec_vbpermq : GCCBuiltin<"__builtin_altivec_vbpermq">,
834              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
835                        [IntrNoMem]>;
836}
837
838def int_ppc_altivec_vexptefp  : PowerPC_Vec_FF_Intrinsic<"vexptefp">;
839def int_ppc_altivec_vlogefp   : PowerPC_Vec_FF_Intrinsic<"vlogefp">;
840def int_ppc_altivec_vrefp     : PowerPC_Vec_FF_Intrinsic<"vrefp">;
841def int_ppc_altivec_vrsqrtefp : PowerPC_Vec_FF_Intrinsic<"vrsqrtefp">;
842
843// Power8 Intrinsics
844// Crypto
845let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
846  def int_ppc_altivec_crypto_vsbox :
847              GCCBuiltin<"__builtin_altivec_crypto_vsbox">,
848              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
849  def int_ppc_altivec_crypto_vpermxor :
850              GCCBuiltin<"__builtin_altivec_crypto_vpermxor">,
851              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
852                         llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
853
854def int_ppc_altivec_crypto_vshasigmad :
855            GCCBuiltin<"__builtin_altivec_crypto_vshasigmad">,
856            Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
857                       llvm_i32_ty, llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
858def int_ppc_altivec_crypto_vshasigmaw :
859            GCCBuiltin<"__builtin_altivec_crypto_vshasigmaw">,
860            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
861                       llvm_i32_ty, llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
862}
863def int_ppc_altivec_crypto_vcipher :
864            PowerPC_Vec_DDD_Intrinsic<"crypto_vcipher">;
865def int_ppc_altivec_crypto_vcipherlast :
866            PowerPC_Vec_DDD_Intrinsic<"crypto_vcipherlast">;
867def int_ppc_altivec_crypto_vncipher :
868            PowerPC_Vec_DDD_Intrinsic<"crypto_vncipher">;
869def int_ppc_altivec_crypto_vncipherlast :
870            PowerPC_Vec_DDD_Intrinsic<"crypto_vncipherlast">;
871def int_ppc_altivec_crypto_vpmsumb :
872            PowerPC_Vec_BBB_Intrinsic<"crypto_vpmsumb">;
873def int_ppc_altivec_crypto_vpmsumh :
874            PowerPC_Vec_HHH_Intrinsic<"crypto_vpmsumh">;
875def int_ppc_altivec_crypto_vpmsumw :
876            PowerPC_Vec_WWW_Intrinsic<"crypto_vpmsumw">;
877def int_ppc_altivec_crypto_vpmsumd :
878            PowerPC_Vec_DDD_Intrinsic<"crypto_vpmsumd">;
879
880// Absolute Difference intrinsics
881def int_ppc_altivec_vabsdub : PowerPC_Vec_BBB_Intrinsic<"vabsdub">;
882def int_ppc_altivec_vabsduh : PowerPC_Vec_HHH_Intrinsic<"vabsduh">;
883def int_ppc_altivec_vabsduw : PowerPC_Vec_WWW_Intrinsic<"vabsduw">;
884
885// Vector rotates
886def int_ppc_altivec_vrlwnm :
887      PowerPC_Vec_Intrinsic<"vrlwnm", [llvm_v4i32_ty],
888                            [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
889def int_ppc_altivec_vrlwmi :
890      PowerPC_Vec_Intrinsic<"vrlwmi", [llvm_v4i32_ty],
891                            [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
892                            [IntrNoMem]>;
893def int_ppc_altivec_vrldnm :
894      PowerPC_Vec_Intrinsic<"vrldnm", [llvm_v2i64_ty],
895                            [llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem]>;
896def int_ppc_altivec_vrldmi :
897      PowerPC_Vec_Intrinsic<"vrldmi", [llvm_v2i64_ty],
898                            [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
899                            [IntrNoMem]>;
900
901//===----------------------------------------------------------------------===//
902// PowerPC VSX Intrinsic Definitions.
903
904let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
905
906// Vector load.
907def int_ppc_vsx_lxvw4x :
908      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
909def int_ppc_vsx_lxvd2x :
910      Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
911def int_ppc_vsx_lxvw4x_be :
912      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
913def int_ppc_vsx_lxvd2x_be :
914      Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
915def int_ppc_vsx_lxvl :
916      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty], [IntrReadMem,
917      IntrArgMemOnly]>;
918def int_ppc_vsx_lxvll :
919      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty], [IntrReadMem,
920      IntrArgMemOnly]>;
921def int_ppc_vsx_stxvl :
922      Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
923      [IntrWriteMem, IntrArgMemOnly]>;
924def int_ppc_vsx_stxvll :
925      Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
926      [IntrWriteMem, IntrArgMemOnly]>;
927
928// Vector store.
929def int_ppc_vsx_stxvw4x : Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
930                                    [IntrWriteMem, IntrArgMemOnly]>;
931def int_ppc_vsx_stxvd2x : Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty],
932                                    [IntrWriteMem, IntrArgMemOnly]>;
933def int_ppc_vsx_stxvw4x_be : Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
934                                       [IntrWriteMem, IntrArgMemOnly]>;
935def int_ppc_vsx_stxvd2x_be : Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty],
936                                       [IntrWriteMem, IntrArgMemOnly]>;
937// Vector and scalar maximum.
938def int_ppc_vsx_xvmaxdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmaxdp">;
939def int_ppc_vsx_xvmaxsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvmaxsp">;
940def int_ppc_vsx_xsmaxdp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmaxdp">;
941
942// Vector and scalar minimum.
943def int_ppc_vsx_xvmindp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmindp">;
944def int_ppc_vsx_xvminsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvminsp">;
945def int_ppc_vsx_xsmindp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmindp">;
946
947// Vector divide.
948def int_ppc_vsx_xvdivdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvdivdp">;
949def int_ppc_vsx_xvdivsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvdivsp">;
950
951// Vector round-to-infinity (ceil)
952def int_ppc_vsx_xvrspip :
953      Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
954def int_ppc_vsx_xvrdpip :
955      Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
956
957// Vector reciprocal estimate
958def int_ppc_vsx_xvresp : GCCBuiltin<"__builtin_vsx_xvresp">,
959      Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
960def int_ppc_vsx_xvredp : GCCBuiltin<"__builtin_vsx_xvredp">,
961      Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
962
963// Vector rsqrte
964def int_ppc_vsx_xvrsqrtesp : GCCBuiltin<"__builtin_vsx_xvrsqrtesp">,
965      Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
966def int_ppc_vsx_xvrsqrtedp : GCCBuiltin<"__builtin_vsx_xvrsqrtedp">,
967      Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
968
969// Vector compare
970def int_ppc_vsx_xvcmpeqdp :
971      PowerPC_VSX_Intrinsic<"xvcmpeqdp", [llvm_v2i64_ty],
972                            [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
973def int_ppc_vsx_xvcmpeqdp_p : GCCBuiltin<"__builtin_vsx_xvcmpeqdp_p">,
974              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
975                        [IntrNoMem]>;
976def int_ppc_vsx_xvcmpeqsp :
977      PowerPC_VSX_Intrinsic<"xvcmpeqsp", [llvm_v4i32_ty],
978                            [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
979def int_ppc_vsx_xvcmpeqsp_p : GCCBuiltin<"__builtin_vsx_xvcmpeqsp_p">,
980              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
981                        [IntrNoMem]>;
982def int_ppc_vsx_xvcmpgedp :
983      PowerPC_VSX_Intrinsic<"xvcmpgedp", [llvm_v2i64_ty],
984                            [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
985def int_ppc_vsx_xvcmpgedp_p : GCCBuiltin<"__builtin_vsx_xvcmpgedp_p">,
986              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
987                        [IntrNoMem]>;
988def int_ppc_vsx_xvcmpgesp :
989      PowerPC_VSX_Intrinsic<"xvcmpgesp", [llvm_v4i32_ty],
990                            [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
991def int_ppc_vsx_xvcmpgesp_p : GCCBuiltin<"__builtin_vsx_xvcmpgesp_p">,
992              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
993                        [IntrNoMem]>;
994def int_ppc_vsx_xvcmpgtdp :
995      PowerPC_VSX_Intrinsic<"xvcmpgtdp", [llvm_v2i64_ty],
996                            [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
997def int_ppc_vsx_xvcmpgtdp_p : GCCBuiltin<"__builtin_vsx_xvcmpgtdp_p">,
998              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
999                        [IntrNoMem]>;
1000def int_ppc_vsx_xvcmpgtsp :
1001      PowerPC_VSX_Intrinsic<"xvcmpgtsp", [llvm_v4i32_ty],
1002                            [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1003def int_ppc_vsx_xvcmpgtsp_p : GCCBuiltin<"__builtin_vsx_xvcmpgtsp_p">,
1004              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
1005                        [IntrNoMem]>;
1006def int_ppc_vsx_xxleqv :
1007      PowerPC_VSX_Intrinsic<"xxleqv", [llvm_v4i32_ty],
1008                            [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1009def int_ppc_vsx_xviexpdp :
1010      PowerPC_VSX_Intrinsic<"xviexpdp",[llvm_v2f64_ty],
1011                            [llvm_v2i64_ty, llvm_v2i64_ty],[IntrNoMem]>;
1012def int_ppc_vsx_xviexpsp :
1013      PowerPC_VSX_Intrinsic<"xviexpsp",[llvm_v4f32_ty],
1014                            [llvm_v4i32_ty, llvm_v4i32_ty],[IntrNoMem]>;
1015def int_ppc_vsx_xvcvdpsxws :
1016      PowerPC_VSX_Intrinsic<"xvcvdpsxws", [llvm_v4i32_ty],
1017                            [llvm_v2f64_ty], [IntrNoMem]>;
1018def int_ppc_vsx_xvcvdpuxws :
1019      PowerPC_VSX_Intrinsic<"xvcvdpuxws", [llvm_v4i32_ty],
1020                            [llvm_v2f64_ty], [IntrNoMem]>;
1021def int_ppc_vsx_xvcvsxwdp :
1022      PowerPC_VSX_Intrinsic<"xvcvsxwdp", [llvm_v2f64_ty],
1023                            [llvm_v4i32_ty], [IntrNoMem]>;
1024def int_ppc_vsx_xvcvuxwdp :
1025      PowerPC_VSX_Intrinsic<"xvcvuxwdp", [llvm_v2f64_ty],
1026                            [llvm_v4i32_ty], [IntrNoMem]>;
1027def int_ppc_vsx_xvcvspdp :
1028      PowerPC_VSX_Intrinsic<"xvcvspdp", [llvm_v2f64_ty],
1029                            [llvm_v4f32_ty], [IntrNoMem]>;
1030def int_ppc_vsx_xvcvsxdsp :
1031      PowerPC_VSX_Intrinsic<"xvcvsxdsp", [llvm_v4f32_ty],
1032                            [llvm_v2i64_ty], [IntrNoMem]>;
1033def int_ppc_vsx_xvcvuxdsp :
1034      PowerPC_VSX_Intrinsic<"xvcvuxdsp", [llvm_v4f32_ty],
1035                            [llvm_v2i64_ty], [IntrNoMem]>;
1036def int_ppc_vsx_xvcvdpsp :
1037      PowerPC_VSX_Intrinsic<"xvcvdpsp", [llvm_v4f32_ty],
1038                            [llvm_v2f64_ty], [IntrNoMem]>;
1039def int_ppc_vsx_xvcvsphp :
1040      PowerPC_VSX_Intrinsic<"xvcvsphp", [llvm_v4f32_ty],
1041                            [llvm_v4f32_ty], [IntrNoMem]>;
1042def int_ppc_vsx_xvxexpdp :
1043      PowerPC_VSX_Intrinsic<"xvxexpdp", [llvm_v2i64_ty],
1044                            [llvm_v2f64_ty], [IntrNoMem]>;
1045def int_ppc_vsx_xvxexpsp :
1046      PowerPC_VSX_Intrinsic<"xvxexpsp", [llvm_v4i32_ty],
1047                            [llvm_v4f32_ty], [IntrNoMem]>;
1048def int_ppc_vsx_xvxsigdp :
1049      PowerPC_VSX_Intrinsic<"xvxsigdp", [llvm_v2i64_ty],
1050                            [llvm_v2f64_ty], [IntrNoMem]>;
1051def int_ppc_vsx_xvxsigsp :
1052      PowerPC_VSX_Intrinsic<"xvxsigsp", [llvm_v4i32_ty],
1053                            [llvm_v4f32_ty], [IntrNoMem]>;
1054def int_ppc_vsx_xvtstdcdp :
1055      PowerPC_VSX_Intrinsic<"xvtstdcdp", [llvm_v2i64_ty],
1056                            [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1057def int_ppc_vsx_xvtstdcsp :
1058      PowerPC_VSX_Intrinsic<"xvtstdcsp", [llvm_v4i32_ty],
1059                            [llvm_v4f32_ty,llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1060def int_ppc_vsx_xvcvhpsp :
1061      PowerPC_VSX_Intrinsic<"xvcvhpsp", [llvm_v4f32_ty],
1062                            [llvm_v8i16_ty],[IntrNoMem]>;
1063def int_ppc_vsx_xxextractuw :
1064      PowerPC_VSX_Intrinsic<"xxextractuw",[llvm_v2i64_ty],
1065                            [llvm_v2i64_ty,llvm_i32_ty], [IntrNoMem]>;
1066def int_ppc_vsx_xxinsertw :
1067      PowerPC_VSX_Intrinsic<"xxinsertw",[llvm_v4i32_ty],
1068                            [llvm_v4i32_ty,llvm_v2i64_ty,llvm_i32_ty],
1069                            [IntrNoMem]>;
1070def int_ppc_vsx_xvtlsbb :
1071      PowerPC_VSX_Intrinsic<"xvtlsbb", [llvm_i32_ty],
1072                            [llvm_v16i8_ty, llvm_i1_ty], [IntrNoMem]>;
1073def int_ppc_vsx_xxeval :
1074      PowerPC_VSX_Intrinsic<"xxeval", [llvm_v2i64_ty],
1075                           [llvm_v2i64_ty, llvm_v2i64_ty,
1076                            llvm_v2i64_ty, llvm_i32_ty],
1077                           [IntrNoMem, ImmArg<ArgIndex<3>>]>;
1078def int_ppc_vsx_xxgenpcvbm :
1079      PowerPC_VSX_Intrinsic<"xxgenpcvbm", [llvm_v16i8_ty],
1080                            [llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
1081def int_ppc_vsx_xxgenpcvhm :
1082      PowerPC_VSX_Intrinsic<"xxgenpcvhm", [llvm_v8i16_ty],
1083                            [llvm_v8i16_ty, llvm_i32_ty], [IntrNoMem]>;
1084def int_ppc_vsx_xxgenpcvwm :
1085      PowerPC_VSX_Intrinsic<"xxgenpcvwm", [llvm_v4i32_ty],
1086                            [llvm_v4i32_ty, llvm_i32_ty], [IntrNoMem]>;
1087def int_ppc_vsx_xxgenpcvdm :
1088      PowerPC_VSX_Intrinsic<"xxgenpcvdm", [llvm_v2i64_ty],
1089                            [llvm_v2i64_ty, llvm_i32_ty], [IntrNoMem]>;
1090
1091// P10 VSX Vector permute extended.
1092def int_ppc_vsx_xxpermx :
1093      GCCBuiltin<"__builtin_vsx_xxpermx">,
1094      Intrinsic<[llvm_v16i8_ty],
1095                [llvm_v16i8_ty,llvm_v16i8_ty,llvm_v16i8_ty,llvm_i32_ty],
1096                [IntrNoMem, ImmArg<ArgIndex<3>>]>;
1097// P10 VSX Vector Blend Variable.
1098def  int_ppc_vsx_xxblendvb: GCCBuiltin<"__builtin_vsx_xxblendvb">,
1099       Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
1100                 [IntrNoMem]>;
1101def  int_ppc_vsx_xxblendvh: GCCBuiltin<"__builtin_vsx_xxblendvh">,
1102       Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,llvm_v8i16_ty],
1103                 [IntrNoMem]>;
1104def  int_ppc_vsx_xxblendvw: GCCBuiltin<"__builtin_vsx_xxblendvw">,
1105       Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
1106                 [IntrNoMem]>;
1107def  int_ppc_vsx_xxblendvd: GCCBuiltin<"__builtin_vsx_xxblendvd">,
1108       Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
1109                 [IntrNoMem]>;
1110}
1111
1112//===----------------------------------------------------------------------===//
1113// PowerPC QPX Intrinsics.
1114//
1115
1116let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
1117  /// PowerPC_QPX_Intrinsic - Base class for all QPX intrinsics.
1118  class PowerPC_QPX_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
1119                              list<LLVMType> param_types,
1120                              list<IntrinsicProperty> properties>
1121    : GCCBuiltin<!strconcat("__builtin_qpx_", GCCIntSuffix)>,
1122      Intrinsic<ret_types, param_types, properties>;
1123}
1124
1125//===----------------------------------------------------------------------===//
1126// PowerPC QPX Intrinsic Class Definitions.
1127//
1128
1129/// PowerPC_QPX_FF_Intrinsic - A PowerPC intrinsic that takes one v4f64
1130/// vector and returns one.  These intrinsics have no side effects.
1131class PowerPC_QPX_FF_Intrinsic<string GCCIntSuffix>
1132  : PowerPC_QPX_Intrinsic<GCCIntSuffix,
1133                          [llvm_v4f64_ty], [llvm_v4f64_ty], [IntrNoMem]>;
1134
1135/// PowerPC_QPX_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f64
1136/// vectors and returns one.  These intrinsics have no side effects.
1137class PowerPC_QPX_FFF_Intrinsic<string GCCIntSuffix>
1138  : PowerPC_QPX_Intrinsic<GCCIntSuffix,
1139                          [llvm_v4f64_ty], [llvm_v4f64_ty, llvm_v4f64_ty],
1140                          [IntrNoMem]>;
1141
1142/// PowerPC_QPX_FFFF_Intrinsic - A PowerPC intrinsic that takes three v4f64
1143/// vectors and returns one.  These intrinsics have no side effects.
1144class PowerPC_QPX_FFFF_Intrinsic<string GCCIntSuffix>
1145  : PowerPC_QPX_Intrinsic<GCCIntSuffix,
1146                          [llvm_v4f64_ty],
1147                          [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
1148                          [IntrNoMem]>;
1149
1150/// PowerPC_QPX_Load_Intrinsic - A PowerPC intrinsic that takes a pointer
1151/// and returns a v4f64.
1152class PowerPC_QPX_Load_Intrinsic<string GCCIntSuffix>
1153  : PowerPC_QPX_Intrinsic<GCCIntSuffix,
1154                          [llvm_v4f64_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
1155
1156/// PowerPC_QPX_LoadPerm_Intrinsic - A PowerPC intrinsic that takes a pointer
1157/// and returns a v4f64 permutation.
1158class PowerPC_QPX_LoadPerm_Intrinsic<string GCCIntSuffix>
1159  : PowerPC_QPX_Intrinsic<GCCIntSuffix,
1160                          [llvm_v4f64_ty], [llvm_ptr_ty], [IntrNoMem]>;
1161
1162/// PowerPC_QPX_Store_Intrinsic - A PowerPC intrinsic that takes a pointer
1163/// and stores a v4f64.
1164class PowerPC_QPX_Store_Intrinsic<string GCCIntSuffix>
1165  : PowerPC_QPX_Intrinsic<GCCIntSuffix,
1166                          [], [llvm_v4f64_ty, llvm_ptr_ty],
1167                          [IntrWriteMem, IntrArgMemOnly]>;
1168
1169//===----------------------------------------------------------------------===//
1170// PowerPC QPX Intrinsic Definitions.
1171
1172let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
1173  // Add Instructions
1174  def int_ppc_qpx_qvfadd : PowerPC_QPX_FFF_Intrinsic<"qvfadd">;
1175  def int_ppc_qpx_qvfadds : PowerPC_QPX_FFF_Intrinsic<"qvfadds">;
1176  def int_ppc_qpx_qvfsub : PowerPC_QPX_FFF_Intrinsic<"qvfsub">;
1177  def int_ppc_qpx_qvfsubs : PowerPC_QPX_FFF_Intrinsic<"qvfsubs">;
1178
1179  // Estimate Instructions
1180  def int_ppc_qpx_qvfre : PowerPC_QPX_FF_Intrinsic<"qvfre">;
1181  def int_ppc_qpx_qvfres : PowerPC_QPX_FF_Intrinsic<"qvfres">;
1182  def int_ppc_qpx_qvfrsqrte : PowerPC_QPX_FF_Intrinsic<"qvfrsqrte">;
1183  def int_ppc_qpx_qvfrsqrtes : PowerPC_QPX_FF_Intrinsic<"qvfrsqrtes">;
1184
1185  // Multiply Instructions
1186  def int_ppc_qpx_qvfmul : PowerPC_QPX_FFF_Intrinsic<"qvfmul">;
1187  def int_ppc_qpx_qvfmuls : PowerPC_QPX_FFF_Intrinsic<"qvfmuls">;
1188  def int_ppc_qpx_qvfxmul : PowerPC_QPX_FFF_Intrinsic<"qvfxmul">;
1189  def int_ppc_qpx_qvfxmuls : PowerPC_QPX_FFF_Intrinsic<"qvfxmuls">;
1190
1191  // Multiply-add instructions
1192  def int_ppc_qpx_qvfmadd : PowerPC_QPX_FFFF_Intrinsic<"qvfmadd">;
1193  def int_ppc_qpx_qvfmadds : PowerPC_QPX_FFFF_Intrinsic<"qvfmadds">;
1194  def int_ppc_qpx_qvfnmadd : PowerPC_QPX_FFFF_Intrinsic<"qvfnmadd">;
1195  def int_ppc_qpx_qvfnmadds : PowerPC_QPX_FFFF_Intrinsic<"qvfnmadds">;
1196  def int_ppc_qpx_qvfmsub : PowerPC_QPX_FFFF_Intrinsic<"qvfmsub">;
1197  def int_ppc_qpx_qvfmsubs : PowerPC_QPX_FFFF_Intrinsic<"qvfmsubs">;
1198  def int_ppc_qpx_qvfnmsub : PowerPC_QPX_FFFF_Intrinsic<"qvfnmsub">;
1199  def int_ppc_qpx_qvfnmsubs : PowerPC_QPX_FFFF_Intrinsic<"qvfnmsubs">;
1200  def int_ppc_qpx_qvfxmadd : PowerPC_QPX_FFFF_Intrinsic<"qvfxmadd">;
1201  def int_ppc_qpx_qvfxmadds : PowerPC_QPX_FFFF_Intrinsic<"qvfxmadds">;
1202  def int_ppc_qpx_qvfxxnpmadd : PowerPC_QPX_FFFF_Intrinsic<"qvfxxnpmadd">;
1203  def int_ppc_qpx_qvfxxnpmadds : PowerPC_QPX_FFFF_Intrinsic<"qvfxxnpmadds">;
1204  def int_ppc_qpx_qvfxxcpnmadd : PowerPC_QPX_FFFF_Intrinsic<"qvfxxcpnmadd">;
1205  def int_ppc_qpx_qvfxxcpnmadds : PowerPC_QPX_FFFF_Intrinsic<"qvfxxcpnmadds">;
1206  def int_ppc_qpx_qvfxxmadd : PowerPC_QPX_FFFF_Intrinsic<"qvfxxmadd">;
1207  def int_ppc_qpx_qvfxxmadds : PowerPC_QPX_FFFF_Intrinsic<"qvfxxmadds">;
1208
1209  // Select Instruction
1210  def int_ppc_qpx_qvfsel : PowerPC_QPX_FFFF_Intrinsic<"qvfsel">;
1211
1212  // Permute Instruction
1213  def int_ppc_qpx_qvfperm : PowerPC_QPX_FFFF_Intrinsic<"qvfperm">;
1214
1215  // Convert and Round Instructions
1216  def int_ppc_qpx_qvfctid : PowerPC_QPX_FF_Intrinsic<"qvfctid">;
1217  def int_ppc_qpx_qvfctidu : PowerPC_QPX_FF_Intrinsic<"qvfctidu">;
1218  def int_ppc_qpx_qvfctidz : PowerPC_QPX_FF_Intrinsic<"qvfctidz">;
1219  def int_ppc_qpx_qvfctiduz : PowerPC_QPX_FF_Intrinsic<"qvfctiduz">;
1220  def int_ppc_qpx_qvfctiw : PowerPC_QPX_FF_Intrinsic<"qvfctiw">;
1221  def int_ppc_qpx_qvfctiwu : PowerPC_QPX_FF_Intrinsic<"qvfctiwu">;
1222  def int_ppc_qpx_qvfctiwz : PowerPC_QPX_FF_Intrinsic<"qvfctiwz">;
1223  def int_ppc_qpx_qvfctiwuz : PowerPC_QPX_FF_Intrinsic<"qvfctiwuz">;
1224  def int_ppc_qpx_qvfcfid : PowerPC_QPX_FF_Intrinsic<"qvfcfid">;
1225  def int_ppc_qpx_qvfcfidu : PowerPC_QPX_FF_Intrinsic<"qvfcfidu">;
1226  def int_ppc_qpx_qvfcfids : PowerPC_QPX_FF_Intrinsic<"qvfcfids">;
1227  def int_ppc_qpx_qvfcfidus : PowerPC_QPX_FF_Intrinsic<"qvfcfidus">;
1228  def int_ppc_qpx_qvfrsp : PowerPC_QPX_FF_Intrinsic<"qvfrsp">;
1229  def int_ppc_qpx_qvfriz : PowerPC_QPX_FF_Intrinsic<"qvfriz">;
1230  def int_ppc_qpx_qvfrin : PowerPC_QPX_FF_Intrinsic<"qvfrin">;
1231  def int_ppc_qpx_qvfrip : PowerPC_QPX_FF_Intrinsic<"qvfrip">;
1232  def int_ppc_qpx_qvfrim : PowerPC_QPX_FF_Intrinsic<"qvfrim">;
1233
1234  // Move Instructions
1235  def int_ppc_qpx_qvfneg : PowerPC_QPX_FF_Intrinsic<"qvfneg">;
1236  def int_ppc_qpx_qvfabs : PowerPC_QPX_FF_Intrinsic<"qvfabs">;
1237  def int_ppc_qpx_qvfnabs : PowerPC_QPX_FF_Intrinsic<"qvfnabs">;
1238  def int_ppc_qpx_qvfcpsgn : PowerPC_QPX_FFF_Intrinsic<"qvfcpsgn">;
1239
1240  // Compare Instructions
1241  def int_ppc_qpx_qvftstnan : PowerPC_QPX_FFF_Intrinsic<"qvftstnan">;
1242  def int_ppc_qpx_qvfcmplt : PowerPC_QPX_FFF_Intrinsic<"qvfcmplt">;
1243  def int_ppc_qpx_qvfcmpgt : PowerPC_QPX_FFF_Intrinsic<"qvfcmpgt">;
1244  def int_ppc_qpx_qvfcmpeq : PowerPC_QPX_FFF_Intrinsic<"qvfcmpeq">;
1245
1246  // Load instructions
1247  def int_ppc_qpx_qvlfd : PowerPC_QPX_Load_Intrinsic<"qvlfd">;
1248  def int_ppc_qpx_qvlfda : PowerPC_QPX_Load_Intrinsic<"qvlfda">;
1249  def int_ppc_qpx_qvlfs : PowerPC_QPX_Load_Intrinsic<"qvlfs">;
1250  def int_ppc_qpx_qvlfsa : PowerPC_QPX_Load_Intrinsic<"qvlfsa">;
1251
1252  def int_ppc_qpx_qvlfcda : PowerPC_QPX_Load_Intrinsic<"qvlfcda">;
1253  def int_ppc_qpx_qvlfcd : PowerPC_QPX_Load_Intrinsic<"qvlfcd">;
1254  def int_ppc_qpx_qvlfcsa : PowerPC_QPX_Load_Intrinsic<"qvlfcsa">;
1255  def int_ppc_qpx_qvlfcs : PowerPC_QPX_Load_Intrinsic<"qvlfcs">;
1256  def int_ppc_qpx_qvlfiwaa : PowerPC_QPX_Load_Intrinsic<"qvlfiwaa">;
1257  def int_ppc_qpx_qvlfiwa : PowerPC_QPX_Load_Intrinsic<"qvlfiwa">;
1258  def int_ppc_qpx_qvlfiwza : PowerPC_QPX_Load_Intrinsic<"qvlfiwza">;
1259  def int_ppc_qpx_qvlfiwz : PowerPC_QPX_Load_Intrinsic<"qvlfiwz">;
1260
1261  def int_ppc_qpx_qvlpcld : PowerPC_QPX_LoadPerm_Intrinsic<"qvlpcld">;
1262  def int_ppc_qpx_qvlpcls : PowerPC_QPX_LoadPerm_Intrinsic<"qvlpcls">;
1263  def int_ppc_qpx_qvlpcrd : PowerPC_QPX_LoadPerm_Intrinsic<"qvlpcrd">;
1264  def int_ppc_qpx_qvlpcrs : PowerPC_QPX_LoadPerm_Intrinsic<"qvlpcrs">;
1265
1266  // Store instructions
1267  def int_ppc_qpx_qvstfd : PowerPC_QPX_Store_Intrinsic<"qvstfd">;
1268  def int_ppc_qpx_qvstfda : PowerPC_QPX_Store_Intrinsic<"qvstfda">;
1269  def int_ppc_qpx_qvstfs : PowerPC_QPX_Store_Intrinsic<"qvstfs">;
1270  def int_ppc_qpx_qvstfsa : PowerPC_QPX_Store_Intrinsic<"qvstfsa">;
1271
1272  def int_ppc_qpx_qvstfcda : PowerPC_QPX_Store_Intrinsic<"qvstfcda">;
1273  def int_ppc_qpx_qvstfcd : PowerPC_QPX_Store_Intrinsic<"qvstfcd">;
1274  def int_ppc_qpx_qvstfcsa : PowerPC_QPX_Store_Intrinsic<"qvstfcsa">;
1275  def int_ppc_qpx_qvstfcs : PowerPC_QPX_Store_Intrinsic<"qvstfcs">;
1276  def int_ppc_qpx_qvstfiwa : PowerPC_QPX_Store_Intrinsic<"qvstfiwa">;
1277  def int_ppc_qpx_qvstfiw : PowerPC_QPX_Store_Intrinsic<"qvstfiw">;
1278
1279  // Logical and permutation formation
1280  def int_ppc_qpx_qvflogical : PowerPC_QPX_Intrinsic<"qvflogical",
1281                          [llvm_v4f64_ty],
1282                          [llvm_v4f64_ty, llvm_v4f64_ty, llvm_i32_ty],
1283                          [IntrNoMem]>;
1284  def int_ppc_qpx_qvgpci : PowerPC_QPX_Intrinsic<"qvgpci",
1285                          [llvm_v4f64_ty], [llvm_i32_ty], [IntrNoMem]>;
1286}
1287
1288//===----------------------------------------------------------------------===//
1289// PowerPC HTM Intrinsic Definitions.
1290
1291let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
1292
1293def int_ppc_tbegin : GCCBuiltin<"__builtin_tbegin">,
1294      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
1295def int_ppc_tend : GCCBuiltin<"__builtin_tend">,
1296      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
1297
1298def int_ppc_tabort : GCCBuiltin<"__builtin_tabort">,
1299      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1300def int_ppc_tabortwc : GCCBuiltin<"__builtin_tabortwc">,
1301      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1302def int_ppc_tabortwci : GCCBuiltin<"__builtin_tabortwci">,
1303      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1304def int_ppc_tabortdc : GCCBuiltin<"__builtin_tabortdc">,
1305      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1306def int_ppc_tabortdci : GCCBuiltin<"__builtin_tabortdci">,
1307      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1308
1309def int_ppc_tcheck : GCCBuiltin<"__builtin_tcheck">,
1310      Intrinsic<[llvm_i32_ty], [], []>;
1311def int_ppc_treclaim : GCCBuiltin<"__builtin_treclaim">,
1312      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1313def int_ppc_trechkpt : GCCBuiltin<"__builtin_trechkpt">,
1314      Intrinsic<[llvm_i32_ty], [], []>;
1315def int_ppc_tsr : GCCBuiltin<"__builtin_tsr">,
1316      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1317
1318def int_ppc_get_texasr : GCCBuiltin<"__builtin_get_texasr">,
1319      Intrinsic<[llvm_i64_ty], [], []>;
1320def int_ppc_get_texasru : GCCBuiltin<"__builtin_get_texasru">,
1321      Intrinsic<[llvm_i64_ty], [], []>;
1322def int_ppc_get_tfhar : GCCBuiltin<"__builtin_get_tfhar">,
1323      Intrinsic<[llvm_i64_ty], [], []>;
1324def int_ppc_get_tfiar : GCCBuiltin<"__builtin_get_tfiar">,
1325      Intrinsic<[llvm_i64_ty], [], []>;
1326
1327def int_ppc_set_texasr : GCCBuiltin<"__builtin_set_texasr">,
1328      Intrinsic<[], [llvm_i64_ty], []>;
1329def int_ppc_set_texasru : GCCBuiltin<"__builtin_set_texasru">,
1330      Intrinsic<[], [llvm_i64_ty], []>;
1331def int_ppc_set_tfhar : GCCBuiltin<"__builtin_set_tfhar">,
1332      Intrinsic<[], [llvm_i64_ty], []>;
1333def int_ppc_set_tfiar : GCCBuiltin<"__builtin_set_tfiar">,
1334      Intrinsic<[], [llvm_i64_ty], []>;
1335
1336// Extended mnemonics
1337def int_ppc_tendall : GCCBuiltin<"__builtin_tendall">,
1338      Intrinsic<[llvm_i32_ty], [], []>;
1339def int_ppc_tresume : GCCBuiltin<"__builtin_tresume">,
1340      Intrinsic<[llvm_i32_ty], [], []>;
1341def int_ppc_tsuspend : GCCBuiltin<"__builtin_tsuspend">,
1342      Intrinsic<[llvm_i32_ty], [], []>;
1343
1344def int_ppc_ttest : GCCBuiltin<"__builtin_ttest">,
1345      Intrinsic<[llvm_i64_ty], [], []>;
1346
1347def int_ppc_cfence : Intrinsic<[], [llvm_anyint_ty], []>;
1348
1349// PowerPC set FPSCR Intrinsic Definitions.
1350def int_ppc_setrnd : GCCBuiltin<"__builtin_setrnd">,
1351      Intrinsic<[llvm_double_ty], [llvm_i32_ty], []>;
1352
1353}
1354