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], [IntrArgMemOnly]>;
23  def int_ppc_dcbfl : Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
24  def int_ppc_dcbflp : Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
25  def int_ppc_dcbfps : Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
26  def int_ppc_dcbstps : Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
27  def int_ppc_dcbi  : Intrinsic<[], [llvm_ptr_ty], []>;
28  def int_ppc_dcbst : Intrinsic<[], [llvm_ptr_ty], []>;
29  def int_ppc_dcbt  : Intrinsic<[], [llvm_ptr_ty],
30    [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
31  def int_ppc_dcbtst: Intrinsic<[], [llvm_ptr_ty],
32    [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
33  def int_ppc_dcbt_with_hint: Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
34    [IntrArgMemOnly, NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
35  def int_ppc_dcbtst_with_hint: Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
36    [IntrArgMemOnly, NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
37  def int_ppc_dcbz  : Intrinsic<[], [llvm_ptr_ty], []>;
38  def int_ppc_dcbzl : Intrinsic<[], [llvm_ptr_ty], []>;
39
40  // Population Count in each Byte.
41  def int_ppc_popcntb : Intrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem]>;
42
43  // sync instruction (i.e. sync 0, a.k.a hwsync)
44  def int_ppc_sync : Intrinsic<[], [], []>;
45  // isync instruction
46  def int_ppc_isync : Intrinsic<[], [], []>;
47  // lwsync is sync 1
48  def int_ppc_lwsync : Intrinsic<[], [], []>;
49  // eieio instruction
50  def int_ppc_eieio : Intrinsic<[],[],[]>;
51
52  // Get content from current FPSCR register
53  def int_ppc_readflm : GCCBuiltin<"__builtin_readflm">,
54                        Intrinsic<[llvm_double_ty], [], [IntrNoMem]>;
55  // Set FPSCR register, and return previous content
56  def int_ppc_setflm : GCCBuiltin<"__builtin_setflm">,
57                       Intrinsic<[llvm_double_ty], [llvm_double_ty], []>;
58
59  // Intrinsics for [double]word extended forms of divide instructions
60  def int_ppc_divwe : GCCBuiltin<"__builtin_divwe">,
61                      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
62                                [IntrNoMem]>;
63  def int_ppc_divweu : GCCBuiltin<"__builtin_divweu">,
64                       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
65                                 [IntrNoMem]>;
66  def int_ppc_divde : GCCBuiltin<"__builtin_divde">,
67                      Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
68                                [IntrNoMem]>;
69  def int_ppc_divdeu : GCCBuiltin<"__builtin_divdeu">,
70                       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
71                                 [IntrNoMem]>;
72
73  // Generate a random number
74  def int_ppc_darn : GCCBuiltin<"__builtin_darn">,
75                     Intrinsic<[llvm_i64_ty], [], [IntrNoMem]>;
76  def int_ppc_darnraw : GCCBuiltin<"__builtin_darn_raw">,
77                     Intrinsic<[llvm_i64_ty], [], [IntrNoMem]>;
78  def int_ppc_darn32 : GCCBuiltin<"__builtin_darn_32">,
79                     Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>;
80
81  // Bit permute doubleword
82  def int_ppc_bpermd : GCCBuiltin<"__builtin_bpermd">,
83                       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
84                                 [IntrNoMem]>;
85
86  // Parallel Bits Deposit/Extract Doubleword Builtins.
87  def int_ppc_pdepd
88      : GCCBuiltin<"__builtin_pdepd">,
89        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
90  def int_ppc_pextd
91      : GCCBuiltin<"__builtin_pextd">,
92        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
93
94  // Centrifuge Doubleword Builtin.
95  def int_ppc_cfuged
96      : GCCBuiltin<"__builtin_cfuged">,
97        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
98
99  // Count Leading / Trailing Zeroes under bit Mask Builtins.
100  def int_ppc_cntlzdm
101      : GCCBuiltin<"__builtin_cntlzdm">,
102        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
103  def int_ppc_cnttzdm
104      : GCCBuiltin<"__builtin_cnttzdm">,
105        Intrinsic <[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
106
107  def int_ppc_truncf128_round_to_odd
108      : GCCBuiltin<"__builtin_truncf128_round_to_odd">,
109        Intrinsic <[llvm_double_ty], [llvm_f128_ty], [IntrNoMem]>;
110  def int_ppc_sqrtf128_round_to_odd
111      : GCCBuiltin<"__builtin_sqrtf128_round_to_odd">,
112        Intrinsic <[llvm_f128_ty], [llvm_f128_ty], [IntrNoMem]>;
113  def int_ppc_addf128_round_to_odd
114      : GCCBuiltin<"__builtin_addf128_round_to_odd">,
115        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
116  def int_ppc_subf128_round_to_odd
117      : GCCBuiltin<"__builtin_subf128_round_to_odd">,
118        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
119  def int_ppc_mulf128_round_to_odd
120      : GCCBuiltin<"__builtin_mulf128_round_to_odd">,
121        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
122  def int_ppc_divf128_round_to_odd
123      : GCCBuiltin<"__builtin_divf128_round_to_odd">,
124        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
125  def int_ppc_fmaf128_round_to_odd
126      : GCCBuiltin<"__builtin_fmaf128_round_to_odd">,
127        Intrinsic <[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty,llvm_f128_ty], [IntrNoMem]>;
128  def int_ppc_scalar_extract_expq
129      : GCCBuiltin<"__builtin_vsx_scalar_extract_expq">,
130        Intrinsic <[llvm_i64_ty], [llvm_f128_ty], [IntrNoMem]>;
131  def int_ppc_scalar_insert_exp_qp
132      : GCCBuiltin<"__builtin_vsx_scalar_insert_exp_qp">,
133        Intrinsic <[llvm_f128_ty], [llvm_f128_ty, llvm_i64_ty], [IntrNoMem]>;
134
135}
136
137
138let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
139  /// PowerPC_Vec_Intrinsic - Base class for all altivec intrinsics.
140  class PowerPC_Vec_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
141                              list<LLVMType> param_types,
142                              list<IntrinsicProperty> properties>
143    : GCCBuiltin<!strconcat("__builtin_altivec_", GCCIntSuffix)>,
144      Intrinsic<ret_types, param_types, properties>;
145
146  /// PowerPC_VSX_Intrinsic - Base class for all VSX intrinsics.
147  class PowerPC_VSX_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
148                              list<LLVMType> param_types,
149                              list<IntrinsicProperty> properties>
150    : GCCBuiltin<!strconcat("__builtin_vsx_", GCCIntSuffix)>,
151      Intrinsic<ret_types, param_types, properties>;
152}
153
154//===----------------------------------------------------------------------===//
155// PowerPC MMA Intrinsic Multi Class Definitions.
156//
157
158multiclass PowerPC_MMA_ACC_Intrinsic<list<LLVMType> args> {
159  def NAME: Intrinsic<[llvm_v512i1_ty], args, [IntrNoMem]>;
160  def pp : Intrinsic<[llvm_v512i1_ty], !listconcat([llvm_v512i1_ty], args),
161                     [IntrNoMem]>;
162  def pn : Intrinsic<[llvm_v512i1_ty], !listconcat([llvm_v512i1_ty], args),
163                     [IntrNoMem]>;
164  def np : Intrinsic<[llvm_v512i1_ty], !listconcat([llvm_v512i1_ty], args),
165                     [IntrNoMem]>;
166  def nn : Intrinsic<[llvm_v512i1_ty], !listconcat([llvm_v512i1_ty], args),
167                     [IntrNoMem]>;
168}
169
170multiclass PowerPC_MMA_ACC_PP_Intrinsic<list<LLVMType> args> {
171  def NAME: Intrinsic<[llvm_v512i1_ty], args, [IntrNoMem]>;
172  def pp : Intrinsic<[llvm_v512i1_ty], !listconcat([llvm_v512i1_ty], args),
173                     [IntrNoMem]>;
174}
175
176//===----------------------------------------------------------------------===//
177// PowerPC Altivec Intrinsic Class Definitions.
178//
179
180/// PowerPC_Vec_FF_Intrinsic - A PowerPC intrinsic that takes one v4f32
181/// vector and returns one.  These intrinsics have no side effects.
182class PowerPC_Vec_FF_Intrinsic<string GCCIntSuffix>
183  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
184                          [llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
185
186/// PowerPC_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
187/// vectors and returns one.  These intrinsics have no side effects.
188class PowerPC_Vec_FFF_Intrinsic<string GCCIntSuffix>
189  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
190                          [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
191                          [IntrNoMem]>;
192
193/// PowerPC_Vec_BBB_Intrinsic - A PowerPC intrinsic that takes two v16i8
194/// vectors and returns one.  These intrinsics have no side effects.
195class PowerPC_Vec_BBB_Intrinsic<string GCCIntSuffix>
196  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
197                          [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
198                          [IntrNoMem]>;
199
200/// PowerPC_Vec_HHH_Intrinsic - A PowerPC intrinsic that takes two v8i16
201/// vectors and returns one.  These intrinsics have no side effects.
202class PowerPC_Vec_HHH_Intrinsic<string GCCIntSuffix>
203  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
204                          [llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
205                          [IntrNoMem]>;
206
207/// PowerPC_Vec_WWW_Intrinsic - A PowerPC intrinsic that takes two v4i32
208/// vectors and returns one.  These intrinsics have no side effects.
209class PowerPC_Vec_WWW_Intrinsic<string GCCIntSuffix>
210  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
211                          [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
212                          [IntrNoMem]>;
213
214/// PowerPC_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2i64
215/// vectors and returns one.  These intrinsics have no side effects.
216class PowerPC_Vec_DDD_Intrinsic<string GCCIntSuffix>
217  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
218                          [llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
219                          [IntrNoMem]>;
220
221/// PowerPC_Vec_QQQ_Intrinsic - A PowerPC intrinsic that takes two v1i128
222/// vectors and returns one. These intrinsics have no side effects.
223class PowerPC_Vec_QQQ_Intrinsic<string GCCIntSuffix>
224  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
225                         [llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
226                         [IntrNoMem]>;
227
228/// PowerPC_Vec_QDD_Intrinsic - A PowerPC intrinsic that takes two v2i64
229/// vectors and returns one v1i128. These intrinsics have no side effects.
230class PowerPC_Vec_QDD_Intrinsic<string GCCIntSuffix>
231  : PowerPC_Vec_Intrinsic<GCCIntSuffix,
232                          [llvm_v1i128_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
233                          [IntrNoMem]>;
234
235//===----------------------------------------------------------------------===//
236// PowerPC VSX Intrinsic Class Definitions.
237//
238
239/// PowerPC_VSX_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2f64
240/// vectors and returns one.  These intrinsics have no side effects.
241class PowerPC_VSX_Vec_DDD_Intrinsic<string GCCIntSuffix>
242  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
243                          [llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty],
244                          [IntrNoMem]>;
245
246/// PowerPC_VSX_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
247/// vectors and returns one.  These intrinsics have no side effects.
248class PowerPC_VSX_Vec_FFF_Intrinsic<string GCCIntSuffix>
249  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
250                          [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
251                          [IntrNoMem]>;
252
253/// PowerPC_VSX_Sca_DDD_Intrinsic - A PowerPC intrinsic that takes two f64
254/// scalars and returns one.  These intrinsics have no side effects.
255class PowerPC_VSX_Sca_DDD_Intrinsic<string GCCIntSuffix>
256  : PowerPC_VSX_Intrinsic<GCCIntSuffix,
257                          [llvm_double_ty], [llvm_double_ty, llvm_double_ty],
258                          [IntrNoMem]>;
259
260//===----------------------------------------------------------------------===//
261// PowerPC Altivec Intrinsic Definitions.
262
263let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
264  // Data Stream Control.
265  def int_ppc_altivec_dss : GCCBuiltin<"__builtin_altivec_dss">,
266              Intrinsic<[], [llvm_i32_ty], []>;
267  def int_ppc_altivec_dssall : GCCBuiltin<"__builtin_altivec_dssall">,
268              Intrinsic<[], [], []>;
269  def int_ppc_altivec_dst : GCCBuiltin<"__builtin_altivec_dst">,
270              Intrinsic<[],
271                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
272                        []>;
273  def int_ppc_altivec_dstt : GCCBuiltin<"__builtin_altivec_dstt">,
274              Intrinsic<[],
275                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
276                        []>;
277  def int_ppc_altivec_dstst : GCCBuiltin<"__builtin_altivec_dstst">,
278              Intrinsic<[],
279                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
280                        []>;
281  def int_ppc_altivec_dststt : GCCBuiltin<"__builtin_altivec_dststt">,
282              Intrinsic<[],
283                        [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
284                        []>;
285
286  // VSCR access.
287  def int_ppc_altivec_mfvscr : GCCBuiltin<"__builtin_altivec_mfvscr">,
288              Intrinsic<[llvm_v8i16_ty], [], [IntrNoMem, IntrHasSideEffects]>;
289  def int_ppc_altivec_mtvscr : GCCBuiltin<"__builtin_altivec_mtvscr">,
290              Intrinsic<[], [llvm_v4i32_ty], [IntrNoMem, IntrHasSideEffects]>;
291
292
293  // Loads.  These don't map directly to GCC builtins because they represent the
294  // source address with a single pointer.
295  def int_ppc_altivec_lvx :
296              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
297  def int_ppc_altivec_lvxl :
298              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
299  def int_ppc_altivec_lvebx :
300              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
301  def int_ppc_altivec_lvehx :
302              Intrinsic<[llvm_v8i16_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
303  def int_ppc_altivec_lvewx :
304              Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
305
306  // Stores.  These don't map directly to GCC builtins because they represent the
307  // source address with a single pointer.
308  def int_ppc_altivec_stvx :
309              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
310                        [IntrWriteMem, IntrArgMemOnly]>;
311  def int_ppc_altivec_stvxl :
312              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
313                        [IntrWriteMem, IntrArgMemOnly]>;
314  def int_ppc_altivec_stvebx :
315              Intrinsic<[], [llvm_v16i8_ty, llvm_ptr_ty],
316                        [IntrWriteMem, IntrArgMemOnly]>;
317  def int_ppc_altivec_stvehx :
318              Intrinsic<[], [llvm_v8i16_ty, llvm_ptr_ty],
319                        [IntrWriteMem, IntrArgMemOnly]>;
320  def int_ppc_altivec_stvewx :
321              Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
322                        [IntrWriteMem, IntrArgMemOnly]>;
323
324  // Comparisons setting a vector.
325  def int_ppc_altivec_vcmpbfp : GCCBuiltin<"__builtin_altivec_vcmpbfp">,
326              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
327                        [IntrNoMem]>;
328  def int_ppc_altivec_vcmpeqfp : GCCBuiltin<"__builtin_altivec_vcmpeqfp">,
329              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
330                        [IntrNoMem]>;
331  def int_ppc_altivec_vcmpgefp : GCCBuiltin<"__builtin_altivec_vcmpgefp">,
332              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
333                        [IntrNoMem]>;
334  def int_ppc_altivec_vcmpgtfp : GCCBuiltin<"__builtin_altivec_vcmpgtfp">,
335              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
336                        [IntrNoMem]>;
337
338  def int_ppc_altivec_vcmpequd : GCCBuiltin<"__builtin_altivec_vcmpequd">,
339              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
340                        [IntrNoMem]>;
341  def int_ppc_altivec_vcmpgtsd : GCCBuiltin<"__builtin_altivec_vcmpgtsd">,
342              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
343                        [IntrNoMem]>;
344  def int_ppc_altivec_vcmpgtud : GCCBuiltin<"__builtin_altivec_vcmpgtud">,
345              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
346                        [IntrNoMem]>;
347
348  def int_ppc_altivec_vcmpequw : GCCBuiltin<"__builtin_altivec_vcmpequw">,
349              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
350                        [IntrNoMem]>;
351  def int_ppc_altivec_vcmpgtsw : GCCBuiltin<"__builtin_altivec_vcmpgtsw">,
352              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
353                        [IntrNoMem]>;
354  def int_ppc_altivec_vcmpgtuw : GCCBuiltin<"__builtin_altivec_vcmpgtuw">,
355              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
356                        [IntrNoMem]>;
357  def int_ppc_altivec_vcmpnew : GCCBuiltin<"__builtin_altivec_vcmpnew">,
358              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
359                        [IntrNoMem]>;
360  def int_ppc_altivec_vcmpnezw : GCCBuiltin<"__builtin_altivec_vcmpnezw">,
361              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
362                        [IntrNoMem]>;
363
364  def int_ppc_altivec_vcmpequh : GCCBuiltin<"__builtin_altivec_vcmpequh">,
365              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
366                        [IntrNoMem]>;
367  def int_ppc_altivec_vcmpgtsh : GCCBuiltin<"__builtin_altivec_vcmpgtsh">,
368              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
369                        [IntrNoMem]>;
370  def int_ppc_altivec_vcmpgtuh : GCCBuiltin<"__builtin_altivec_vcmpgtuh">,
371              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
372                        [IntrNoMem]>;
373  def int_ppc_altivec_vcmpneh : GCCBuiltin<"__builtin_altivec_vcmpneh">,
374              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
375                        [IntrNoMem]>;
376  def int_ppc_altivec_vcmpnezh : GCCBuiltin<"__builtin_altivec_vcmpnezh">,
377              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
378                        [IntrNoMem]>;
379
380  def int_ppc_altivec_vcmpequb : GCCBuiltin<"__builtin_altivec_vcmpequb">,
381              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
382                        [IntrNoMem]>;
383  def int_ppc_altivec_vcmpgtsb : GCCBuiltin<"__builtin_altivec_vcmpgtsb">,
384              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
385                        [IntrNoMem]>;
386  def int_ppc_altivec_vcmpgtub : GCCBuiltin<"__builtin_altivec_vcmpgtub">,
387              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
388                        [IntrNoMem]>;
389  def int_ppc_altivec_vcmpneb : GCCBuiltin<"__builtin_altivec_vcmpneb">,
390              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
391                        [IntrNoMem]>;
392  def int_ppc_altivec_vcmpnezb : GCCBuiltin<"__builtin_altivec_vcmpnezb">,
393              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
394                        [IntrNoMem]>;
395
396  def int_ppc_altivec_vcmpequq : GCCBuiltin<"__builtin_altivec_vcmpequq">,
397              Intrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
398                        [IntrNoMem]>;
399  def int_ppc_altivec_vcmpgtsq : GCCBuiltin<"__builtin_altivec_vcmpgtsq">,
400              Intrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
401                        [IntrNoMem]>;
402  def int_ppc_altivec_vcmpgtuq : GCCBuiltin<"__builtin_altivec_vcmpgtuq">,
403              Intrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
404                        [IntrNoMem]>;
405  def int_ppc_altivec_vcmpequq_p : GCCBuiltin<"__builtin_altivec_vcmpequq_p">,
406              Intrinsic<[llvm_i32_ty],
407                        [llvm_i32_ty,llvm_v1i128_ty,llvm_v1i128_ty],
408                        [IntrNoMem]>;
409  def int_ppc_altivec_vcmpgtsq_p : GCCBuiltin<"__builtin_altivec_vcmpgtsq_p">,
410              Intrinsic<[llvm_i32_ty],
411                        [llvm_i32_ty,llvm_v1i128_ty,llvm_v1i128_ty],
412                        [IntrNoMem]>;
413  def int_ppc_altivec_vcmpgtuq_p : GCCBuiltin<"__builtin_altivec_vcmpgtuq_p">,
414              Intrinsic<[llvm_i32_ty],
415                        [llvm_i32_ty,llvm_v1i128_ty,llvm_v1i128_ty],
416                        [IntrNoMem]>;
417
418  // Predicate Comparisons.  The first operand specifies interpretation of CR6.
419  def int_ppc_altivec_vcmpbfp_p : GCCBuiltin<"__builtin_altivec_vcmpbfp_p">,
420              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
421                        [IntrNoMem]>;
422  def int_ppc_altivec_vcmpeqfp_p : GCCBuiltin<"__builtin_altivec_vcmpeqfp_p">,
423              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
424                        [IntrNoMem]>;
425  def int_ppc_altivec_vcmpgefp_p : GCCBuiltin<"__builtin_altivec_vcmpgefp_p">,
426              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
427                        [IntrNoMem]>;
428  def int_ppc_altivec_vcmpgtfp_p : GCCBuiltin<"__builtin_altivec_vcmpgtfp_p">,
429              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
430                        [IntrNoMem]>;
431
432  def int_ppc_altivec_vcmpequd_p : GCCBuiltin<"__builtin_altivec_vcmpequd_p">,
433              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
434                        [IntrNoMem]>;
435  def int_ppc_altivec_vcmpgtsd_p : GCCBuiltin<"__builtin_altivec_vcmpgtsd_p">,
436              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
437                        [IntrNoMem]>;
438  def int_ppc_altivec_vcmpgtud_p : GCCBuiltin<"__builtin_altivec_vcmpgtud_p">,
439              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
440                        [IntrNoMem]>;
441
442  def int_ppc_altivec_vcmpequw_p : GCCBuiltin<"__builtin_altivec_vcmpequw_p">,
443              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
444                        [IntrNoMem]>;
445  def int_ppc_altivec_vcmpgtsw_p : GCCBuiltin<"__builtin_altivec_vcmpgtsw_p">,
446              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
447                        [IntrNoMem]>;
448  def int_ppc_altivec_vcmpgtuw_p : GCCBuiltin<"__builtin_altivec_vcmpgtuw_p">,
449              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
450                        [IntrNoMem]>;
451  def int_ppc_altivec_vcmpnew_p : GCCBuiltin<"__builtin_altivec_vcmpnew_p">,
452              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
453                        [IntrNoMem]>;
454  def int_ppc_altivec_vcmpnezw_p : GCCBuiltin<"__builtin_altivec_vcmpnezw_p">,
455              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
456                        [IntrNoMem]>;
457
458  def int_ppc_altivec_vcmpequh_p : GCCBuiltin<"__builtin_altivec_vcmpequh_p">,
459              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
460                        [IntrNoMem]>;
461  def int_ppc_altivec_vcmpgtsh_p : GCCBuiltin<"__builtin_altivec_vcmpgtsh_p">,
462              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
463                        [IntrNoMem]>;
464  def int_ppc_altivec_vcmpgtuh_p : GCCBuiltin<"__builtin_altivec_vcmpgtuh_p">,
465              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
466                        [IntrNoMem]>;
467  def int_ppc_altivec_vcmpneh_p : GCCBuiltin<"__builtin_altivec_vcmpneh_p">,
468              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
469                        [IntrNoMem]>;
470  def int_ppc_altivec_vcmpnezh_p : GCCBuiltin<"__builtin_altivec_vcmpnezh_p">,
471              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
472                        [IntrNoMem]>;
473
474  def int_ppc_altivec_vcmpequb_p : GCCBuiltin<"__builtin_altivec_vcmpequb_p">,
475              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
476                        [IntrNoMem]>;
477  def int_ppc_altivec_vcmpgtsb_p : GCCBuiltin<"__builtin_altivec_vcmpgtsb_p">,
478              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
479                        [IntrNoMem]>;
480  def int_ppc_altivec_vcmpgtub_p : GCCBuiltin<"__builtin_altivec_vcmpgtub_p">,
481              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
482                        [IntrNoMem]>;
483  def int_ppc_altivec_vcmpneb_p : GCCBuiltin<"__builtin_altivec_vcmpneb_p">,
484              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
485                        [IntrNoMem]>;
486  def int_ppc_altivec_vcmpnezb_p : GCCBuiltin<"__builtin_altivec_vcmpnezb_p">,
487              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
488                        [IntrNoMem]>;
489  def int_ppc_altivec_vclzlsbb : GCCBuiltin<"__builtin_altivec_vclzlsbb">,
490              Intrinsic<[llvm_i32_ty],[llvm_v16i8_ty],[IntrNoMem]>;
491  def int_ppc_altivec_vctzlsbb : GCCBuiltin<"__builtin_altivec_vctzlsbb">,
492              Intrinsic<[llvm_i32_ty],[llvm_v16i8_ty],[IntrNoMem]>;
493  def int_ppc_altivec_vprtybw : GCCBuiltin<"__builtin_altivec_vprtybw">,
494              Intrinsic<[llvm_v4i32_ty],[llvm_v4i32_ty],[IntrNoMem]>;
495  def int_ppc_altivec_vprtybd : GCCBuiltin<"__builtin_altivec_vprtybd">,
496              Intrinsic<[llvm_v2i64_ty],[llvm_v2i64_ty],[IntrNoMem]>;
497  def int_ppc_altivec_vprtybq : GCCBuiltin<"__builtin_altivec_vprtybq">,
498              Intrinsic<[llvm_v1i128_ty],[llvm_v1i128_ty],[IntrNoMem]>;
499
500  // P10 Vector Extract with Mask
501  def int_ppc_altivec_vextractbm : GCCBuiltin<"__builtin_altivec_vextractbm">,
502              Intrinsic<[llvm_i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
503  def int_ppc_altivec_vextracthm : GCCBuiltin<"__builtin_altivec_vextracthm">,
504              Intrinsic<[llvm_i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
505  def int_ppc_altivec_vextractwm : GCCBuiltin<"__builtin_altivec_vextractwm">,
506              Intrinsic<[llvm_i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
507  def int_ppc_altivec_vextractdm : GCCBuiltin<"__builtin_altivec_vextractdm">,
508              Intrinsic<[llvm_i32_ty], [llvm_v2i64_ty], [IntrNoMem]>;
509  def int_ppc_altivec_vextractqm : GCCBuiltin<"__builtin_altivec_vextractqm">,
510              Intrinsic<[llvm_i32_ty], [llvm_v1i128_ty], [IntrNoMem]>;
511
512  // P10 Vector Expand with Mask
513  def int_ppc_altivec_vexpandbm : GCCBuiltin<"__builtin_altivec_vexpandbm">,
514              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
515  def int_ppc_altivec_vexpandhm : GCCBuiltin<"__builtin_altivec_vexpandhm">,
516              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
517  def int_ppc_altivec_vexpandwm : GCCBuiltin<"__builtin_altivec_vexpandwm">,
518              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
519  def int_ppc_altivec_vexpanddm : GCCBuiltin<"__builtin_altivec_vexpanddm">,
520              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
521  def int_ppc_altivec_vexpandqm : GCCBuiltin<"__builtin_altivec_vexpandqm">,
522              Intrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty], [IntrNoMem]>;
523
524  // P10 Vector Count with Mask intrinsics.
525  def int_ppc_altivec_vcntmbb : GCCBuiltin<"__builtin_altivec_vcntmbb">,
526              Intrinsic<[llvm_i64_ty], [llvm_v16i8_ty, llvm_i32_ty],
527                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
528  def int_ppc_altivec_vcntmbh : GCCBuiltin<"__builtin_altivec_vcntmbh">,
529              Intrinsic<[llvm_i64_ty], [llvm_v8i16_ty, llvm_i32_ty],
530                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
531  def int_ppc_altivec_vcntmbw : GCCBuiltin<"__builtin_altivec_vcntmbw">,
532              Intrinsic<[llvm_i64_ty], [llvm_v4i32_ty, llvm_i32_ty],
533                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
534  def int_ppc_altivec_vcntmbd : GCCBuiltin<"__builtin_altivec_vcntmbd">,
535              Intrinsic<[llvm_i64_ty], [llvm_v2i64_ty, llvm_i32_ty],
536                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
537
538  // P10 Move to VSR with Mask Intrinsics.
539  def int_ppc_altivec_mtvsrbm : GCCBuiltin<"__builtin_altivec_mtvsrbm">,
540              Intrinsic<[llvm_v16i8_ty], [llvm_i64_ty], [IntrNoMem]>;
541  def int_ppc_altivec_mtvsrhm : GCCBuiltin<"__builtin_altivec_mtvsrhm">,
542              Intrinsic<[llvm_v8i16_ty], [llvm_i64_ty], [IntrNoMem]>;
543  def int_ppc_altivec_mtvsrwm : GCCBuiltin<"__builtin_altivec_mtvsrwm">,
544              Intrinsic<[llvm_v4i32_ty], [llvm_i64_ty], [IntrNoMem]>;
545  def int_ppc_altivec_mtvsrdm : GCCBuiltin<"__builtin_altivec_mtvsrdm">,
546              Intrinsic<[llvm_v2i64_ty], [llvm_i64_ty], [IntrNoMem]>;
547  def int_ppc_altivec_mtvsrqm : GCCBuiltin<"__builtin_altivec_mtvsrqm">,
548              Intrinsic<[llvm_v1i128_ty], [llvm_i64_ty], [IntrNoMem]>;
549
550  // P10 Vector Parallel Bits Deposit/Extract Doubleword Builtins.
551  def int_ppc_altivec_vpdepd : GCCBuiltin<"__builtin_altivec_vpdepd">,
552              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
553                        [IntrNoMem]>;
554  def int_ppc_altivec_vpextd : GCCBuiltin<"__builtin_altivec_vpextd">,
555              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
556                        [IntrNoMem]>;
557
558  // P10 Vector String Isolate Intrinsics.
559  def int_ppc_altivec_vstribr : GCCBuiltin<"__builtin_altivec_vstribr">,
560              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
561  def int_ppc_altivec_vstribl : GCCBuiltin<"__builtin_altivec_vstribl">,
562              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
563  def int_ppc_altivec_vstrihr : GCCBuiltin<"__builtin_altivec_vstrihr">,
564              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
565  def int_ppc_altivec_vstrihl : GCCBuiltin<"__builtin_altivec_vstrihl">,
566              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
567  // Predicate Intrinsics: The first operand specifies interpretation of CR6.
568  def int_ppc_altivec_vstribr_p : GCCBuiltin<"__builtin_altivec_vstribr_p">,
569              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v16i8_ty], [IntrNoMem]>;
570  def int_ppc_altivec_vstribl_p : GCCBuiltin<"__builtin_altivec_vstribl_p">,
571              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v16i8_ty], [IntrNoMem]>;
572  def int_ppc_altivec_vstrihr_p : GCCBuiltin<"__builtin_altivec_vstrihr_p">,
573              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v8i16_ty], [IntrNoMem]>;
574  def int_ppc_altivec_vstrihl_p : GCCBuiltin<"__builtin_altivec_vstrihl_p">,
575              Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v8i16_ty], [IntrNoMem]>;
576
577  // P10 Vector Centrifuge Builtin.
578  def int_ppc_altivec_vcfuged : GCCBuiltin<"__builtin_altivec_vcfuged">,
579              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
580                        [IntrNoMem]>;
581
582  // P10 Vector Gather Every Nth Bit Builtin.
583  def int_ppc_altivec_vgnb : GCCBuiltin<"__builtin_altivec_vgnb">,
584              Intrinsic<[llvm_i64_ty], [llvm_v1i128_ty, llvm_i32_ty],
585                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
586
587   // P10 Vector Clear Bytes
588   def int_ppc_altivec_vclrlb :  GCCBuiltin<"__builtin_altivec_vclrlb">,
589               Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty],
590                         [IntrNoMem]>;
591   def int_ppc_altivec_vclrrb :  GCCBuiltin<"__builtin_altivec_vclrrb">,
592               Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty],
593                         [IntrNoMem]>;
594
595  // P10 Vector Shift Double Bit Immediate.
596  def int_ppc_altivec_vsldbi : GCCBuiltin<"__builtin_altivec_vsldbi">,
597              Intrinsic<[llvm_v16i8_ty],
598                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
599                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
600  def int_ppc_altivec_vsrdbi : GCCBuiltin<"__builtin_altivec_vsrdbi">,
601              Intrinsic<[llvm_v16i8_ty],
602                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
603                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
604
605  // P10 Vector Insert.
606  def int_ppc_altivec_vinsblx : GCCBuiltin<"__builtin_altivec_vinsblx">,
607              Intrinsic<[llvm_v16i8_ty],
608                        [llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty],
609                        [IntrNoMem]>;
610  def int_ppc_altivec_vinsbrx : GCCBuiltin<"__builtin_altivec_vinsbrx">,
611              Intrinsic<[llvm_v16i8_ty],
612                        [llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty],
613                        [IntrNoMem]>;
614  def int_ppc_altivec_vinshlx : GCCBuiltin<"__builtin_altivec_vinshlx">,
615              Intrinsic<[llvm_v8i16_ty],
616                        [llvm_v8i16_ty, llvm_i32_ty, llvm_i32_ty],
617                        [IntrNoMem]>;
618  def int_ppc_altivec_vinshrx : GCCBuiltin<"__builtin_altivec_vinshrx">,
619              Intrinsic<[llvm_v8i16_ty],
620                        [llvm_v8i16_ty, llvm_i32_ty, llvm_i32_ty],
621                        [IntrNoMem]>;
622  def int_ppc_altivec_vinswlx : GCCBuiltin<"__builtin_altivec_vinswlx">,
623              Intrinsic<[llvm_v4i32_ty],
624                        [llvm_v4i32_ty, llvm_i32_ty, llvm_i32_ty],
625                        [IntrNoMem]>;
626  def int_ppc_altivec_vinswrx : GCCBuiltin<"__builtin_altivec_vinswrx">,
627              Intrinsic<[llvm_v4i32_ty],
628                        [llvm_v4i32_ty, llvm_i32_ty, llvm_i32_ty],
629                        [IntrNoMem]>;
630  def int_ppc_altivec_vinsdlx : GCCBuiltin<"__builtin_altivec_vinsdlx">,
631              Intrinsic<[llvm_v2i64_ty],
632                        [llvm_v2i64_ty, llvm_i64_ty, llvm_i64_ty],
633                        [IntrNoMem]>;
634  def int_ppc_altivec_vinsdrx : GCCBuiltin<"__builtin_altivec_vinsdrx">,
635              Intrinsic<[llvm_v2i64_ty],
636                        [llvm_v2i64_ty, llvm_i64_ty, llvm_i64_ty],
637                        [IntrNoMem]>;
638  def int_ppc_altivec_vinsbvlx : GCCBuiltin<"__builtin_altivec_vinsbvlx">,
639              Intrinsic<[llvm_v16i8_ty],
640                        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty],
641                        [IntrNoMem]>;
642  def int_ppc_altivec_vinsbvrx : GCCBuiltin<"__builtin_altivec_vinsbvrx">,
643              Intrinsic<[llvm_v16i8_ty],
644                        [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty],
645                        [IntrNoMem]>;
646  def int_ppc_altivec_vinshvlx : GCCBuiltin<"__builtin_altivec_vinshvlx">,
647              Intrinsic<[llvm_v8i16_ty],
648                        [llvm_v8i16_ty, llvm_i32_ty, llvm_v8i16_ty],
649                        [IntrNoMem]>;
650 def int_ppc_altivec_vinshvrx : GCCBuiltin<"__builtin_altivec_vinshvrx">,
651              Intrinsic<[llvm_v8i16_ty],
652                        [llvm_v8i16_ty, llvm_i32_ty, llvm_v8i16_ty],
653                        [IntrNoMem]>;
654  def int_ppc_altivec_vinswvlx : GCCBuiltin<"__builtin_altivec_vinswvlx">,
655              Intrinsic<[llvm_v4i32_ty],
656                        [llvm_v4i32_ty, llvm_i32_ty, llvm_v4i32_ty],
657                        [IntrNoMem]>;
658  def int_ppc_altivec_vinswvrx : GCCBuiltin<"__builtin_altivec_vinswvrx">,
659              Intrinsic<[llvm_v4i32_ty],
660                        [llvm_v4i32_ty, llvm_i32_ty, llvm_v4i32_ty],
661                        [IntrNoMem]>;
662  // P10 Vector Insert with immediate.
663  def int_ppc_altivec_vinsw :
664              Intrinsic<[llvm_v4i32_ty],
665                        [llvm_v4i32_ty, llvm_i32_ty, llvm_i32_ty],
666                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
667  def int_ppc_altivec_vinsd :
668              Intrinsic<[llvm_v2i64_ty],
669                        [llvm_v2i64_ty, llvm_i64_ty, llvm_i32_ty],
670                        [IntrNoMem, ImmArg<ArgIndex<2>>]>;
671  // P10 Vector Extract.
672  def int_ppc_altivec_vextdubvlx : GCCBuiltin<"__builtin_altivec_vextdubvlx">,
673              Intrinsic<[llvm_v2i64_ty],
674                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
675                        [IntrNoMem]>;
676  def int_ppc_altivec_vextdubvrx : GCCBuiltin<"__builtin_altivec_vextdubvrx">,
677              Intrinsic<[llvm_v2i64_ty],
678                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
679                        [IntrNoMem]>;
680  def int_ppc_altivec_vextduhvlx : GCCBuiltin<"__builtin_altivec_vextduhvlx">,
681              Intrinsic<[llvm_v2i64_ty],
682                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty],
683                        [IntrNoMem]>;
684  def int_ppc_altivec_vextduhvrx : GCCBuiltin<"__builtin_altivec_vextduhvrx">,
685              Intrinsic<[llvm_v2i64_ty],
686                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty],
687                        [IntrNoMem]>;
688  def int_ppc_altivec_vextduwvlx : GCCBuiltin<"__builtin_altivec_vextduwvlx">,
689              Intrinsic<[llvm_v2i64_ty],
690                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty],
691                        [IntrNoMem]>;
692  def int_ppc_altivec_vextduwvrx : GCCBuiltin<"__builtin_altivec_vextduwvrx">,
693              Intrinsic<[llvm_v2i64_ty],
694                        [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty],
695                        [IntrNoMem]>;
696  def int_ppc_altivec_vextddvlx : GCCBuiltin<"__builtin_altivec_vextddvlx">,
697              Intrinsic<[llvm_v2i64_ty],
698                        [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty],
699                        [IntrNoMem]>;
700  def int_ppc_altivec_vextddvrx : GCCBuiltin<"__builtin_altivec_vextddvrx">,
701              Intrinsic<[llvm_v2i64_ty],
702                        [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty],
703                        [IntrNoMem]>;
704}
705
706// Vector average.
707def int_ppc_altivec_vavgsb : PowerPC_Vec_BBB_Intrinsic<"vavgsb">;
708def int_ppc_altivec_vavgsh : PowerPC_Vec_HHH_Intrinsic<"vavgsh">;
709def int_ppc_altivec_vavgsw : PowerPC_Vec_WWW_Intrinsic<"vavgsw">;
710def int_ppc_altivec_vavgub : PowerPC_Vec_BBB_Intrinsic<"vavgub">;
711def int_ppc_altivec_vavguh : PowerPC_Vec_HHH_Intrinsic<"vavguh">;
712def int_ppc_altivec_vavguw : PowerPC_Vec_WWW_Intrinsic<"vavguw">;
713
714// Vector maximum.
715def int_ppc_altivec_vmaxfp : PowerPC_Vec_FFF_Intrinsic<"vmaxfp">;
716def int_ppc_altivec_vmaxsb : PowerPC_Vec_BBB_Intrinsic<"vmaxsb">;
717def int_ppc_altivec_vmaxsh : PowerPC_Vec_HHH_Intrinsic<"vmaxsh">;
718def int_ppc_altivec_vmaxsw : PowerPC_Vec_WWW_Intrinsic<"vmaxsw">;
719def int_ppc_altivec_vmaxsd : PowerPC_Vec_DDD_Intrinsic<"vmaxsd">;
720def int_ppc_altivec_vmaxub : PowerPC_Vec_BBB_Intrinsic<"vmaxub">;
721def int_ppc_altivec_vmaxuh : PowerPC_Vec_HHH_Intrinsic<"vmaxuh">;
722def int_ppc_altivec_vmaxuw : PowerPC_Vec_WWW_Intrinsic<"vmaxuw">;
723def int_ppc_altivec_vmaxud : PowerPC_Vec_DDD_Intrinsic<"vmaxud">;
724
725// Vector minimum.
726def int_ppc_altivec_vminfp : PowerPC_Vec_FFF_Intrinsic<"vminfp">;
727def int_ppc_altivec_vminsb : PowerPC_Vec_BBB_Intrinsic<"vminsb">;
728def int_ppc_altivec_vminsh : PowerPC_Vec_HHH_Intrinsic<"vminsh">;
729def int_ppc_altivec_vminsw : PowerPC_Vec_WWW_Intrinsic<"vminsw">;
730def int_ppc_altivec_vminsd : PowerPC_Vec_DDD_Intrinsic<"vminsd">;
731def int_ppc_altivec_vminub : PowerPC_Vec_BBB_Intrinsic<"vminub">;
732def int_ppc_altivec_vminuh : PowerPC_Vec_HHH_Intrinsic<"vminuh">;
733def int_ppc_altivec_vminuw : PowerPC_Vec_WWW_Intrinsic<"vminuw">;
734def int_ppc_altivec_vminud : PowerPC_Vec_DDD_Intrinsic<"vminud">;
735
736// Saturating adds.
737def int_ppc_altivec_vaddubs : PowerPC_Vec_BBB_Intrinsic<"vaddubs">;
738def int_ppc_altivec_vaddsbs : PowerPC_Vec_BBB_Intrinsic<"vaddsbs">;
739def int_ppc_altivec_vadduhs : PowerPC_Vec_HHH_Intrinsic<"vadduhs">;
740def int_ppc_altivec_vaddshs : PowerPC_Vec_HHH_Intrinsic<"vaddshs">;
741def int_ppc_altivec_vadduws : PowerPC_Vec_WWW_Intrinsic<"vadduws">;
742def int_ppc_altivec_vaddsws : PowerPC_Vec_WWW_Intrinsic<"vaddsws">;
743def int_ppc_altivec_vaddcuw : PowerPC_Vec_WWW_Intrinsic<"vaddcuw">;
744def int_ppc_altivec_vaddcuq : PowerPC_Vec_QQQ_Intrinsic<"vaddcuq">;
745
746// Saturating subs.
747def int_ppc_altivec_vsububs : PowerPC_Vec_BBB_Intrinsic<"vsububs">;
748def int_ppc_altivec_vsubsbs : PowerPC_Vec_BBB_Intrinsic<"vsubsbs">;
749def int_ppc_altivec_vsubuhs : PowerPC_Vec_HHH_Intrinsic<"vsubuhs">;
750def int_ppc_altivec_vsubshs : PowerPC_Vec_HHH_Intrinsic<"vsubshs">;
751def int_ppc_altivec_vsubuws : PowerPC_Vec_WWW_Intrinsic<"vsubuws">;
752def int_ppc_altivec_vsubsws : PowerPC_Vec_WWW_Intrinsic<"vsubsws">;
753def int_ppc_altivec_vsubcuw : PowerPC_Vec_WWW_Intrinsic<"vsubcuw">;
754def int_ppc_altivec_vsubcuq : PowerPC_Vec_QQQ_Intrinsic<"vsubcuq">;
755
756let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
757  // Saturating multiply-adds.
758  def int_ppc_altivec_vmhaddshs : GCCBuiltin<"__builtin_altivec_vmhaddshs">,
759              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
760                         llvm_v8i16_ty, llvm_v8i16_ty],
761                         [IntrNoMem, IntrHasSideEffects]>;
762  def int_ppc_altivec_vmhraddshs : GCCBuiltin<"__builtin_altivec_vmhraddshs">,
763              Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
764                         llvm_v8i16_ty, llvm_v8i16_ty],
765                         [IntrNoMem, IntrHasSideEffects]>;
766
767  def int_ppc_altivec_vmaddfp : GCCBuiltin<"__builtin_altivec_vmaddfp">,
768              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
769                         llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
770  def int_ppc_altivec_vnmsubfp : GCCBuiltin<"__builtin_altivec_vnmsubfp">,
771              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
772                         llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
773
774  // Vector Multiply Sum Instructions.
775  def int_ppc_altivec_vmsummbm : GCCBuiltin<"__builtin_altivec_vmsummbm">,
776            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
777                       llvm_v4i32_ty], [IntrNoMem]>;
778  def int_ppc_altivec_vmsumshm : GCCBuiltin<"__builtin_altivec_vmsumshm">,
779            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
780                       llvm_v4i32_ty], [IntrNoMem]>;
781  def int_ppc_altivec_vmsumshs : GCCBuiltin<"__builtin_altivec_vmsumshs">,
782            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
783                       llvm_v4i32_ty], [IntrNoMem, IntrHasSideEffects]>;
784  def int_ppc_altivec_vmsumubm : GCCBuiltin<"__builtin_altivec_vmsumubm">,
785            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
786                       llvm_v4i32_ty], [IntrNoMem]>;
787  def int_ppc_altivec_vmsumuhm : GCCBuiltin<"__builtin_altivec_vmsumuhm">,
788            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
789                       llvm_v4i32_ty], [IntrNoMem]>;
790  def int_ppc_altivec_vmsumudm : GCCBuiltin<"__builtin_altivec_vmsumudm">,
791            Intrinsic<[llvm_v1i128_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
792                       llvm_v1i128_ty], [IntrNoMem]>;
793  def int_ppc_altivec_vmsumuhs : GCCBuiltin<"__builtin_altivec_vmsumuhs">,
794            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
795                       llvm_v4i32_ty], [IntrNoMem, IntrHasSideEffects]>;
796  def int_ppc_altivec_vmsumcud : GCCBuiltin<"__builtin_altivec_vmsumcud">,
797            Intrinsic<[llvm_v1i128_ty],
798                      [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v1i128_ty], [IntrNoMem]>;
799
800  // Vector Multiply Instructions.
801  def int_ppc_altivec_vmulesb : GCCBuiltin<"__builtin_altivec_vmulesb">,
802          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
803                    [IntrNoMem]>;
804  def int_ppc_altivec_vmulesh : GCCBuiltin<"__builtin_altivec_vmulesh">,
805          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
806                    [IntrNoMem]>;
807  def int_ppc_altivec_vmulesw : GCCBuiltin<"__builtin_altivec_vmulesw">,
808          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
809                    [IntrNoMem]>;
810  def int_ppc_altivec_vmulesd : PowerPC_Vec_QDD_Intrinsic<"vmulesd">;
811  def int_ppc_altivec_vmuleub : GCCBuiltin<"__builtin_altivec_vmuleub">,
812          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
813                    [IntrNoMem]>;
814  def int_ppc_altivec_vmuleuh : GCCBuiltin<"__builtin_altivec_vmuleuh">,
815          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
816                    [IntrNoMem]>;
817  def int_ppc_altivec_vmuleuw : GCCBuiltin<"__builtin_altivec_vmuleuw">,
818          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
819                    [IntrNoMem]>;
820  def int_ppc_altivec_vmuleud : PowerPC_Vec_QDD_Intrinsic<"vmuleud">;
821
822  def int_ppc_altivec_vmulosb : GCCBuiltin<"__builtin_altivec_vmulosb">,
823          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
824                    [IntrNoMem]>;
825  def int_ppc_altivec_vmulosh : GCCBuiltin<"__builtin_altivec_vmulosh">,
826          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
827                    [IntrNoMem]>;
828  def int_ppc_altivec_vmulosw : GCCBuiltin<"__builtin_altivec_vmulosw">,
829          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
830                    [IntrNoMem]>;
831  def int_ppc_altivec_vmulosd : PowerPC_Vec_QDD_Intrinsic<"vmulosd">;
832  def int_ppc_altivec_vmuloub : GCCBuiltin<"__builtin_altivec_vmuloub">,
833          Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
834                    [IntrNoMem]>;
835  def int_ppc_altivec_vmulouh : GCCBuiltin<"__builtin_altivec_vmulouh">,
836          Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
837                    [IntrNoMem]>;
838  def int_ppc_altivec_vmulouw : GCCBuiltin<"__builtin_altivec_vmulouw">,
839          Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
840                    [IntrNoMem]>;
841  def int_ppc_altivec_vmuloud : PowerPC_Vec_QDD_Intrinsic<"vmuloud">;
842
843  // Vector Sum Instructions.
844  def int_ppc_altivec_vsumsws : GCCBuiltin<"__builtin_altivec_vsumsws">,
845            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
846                      [IntrNoMem, IntrHasSideEffects]>;
847  def int_ppc_altivec_vsum2sws : GCCBuiltin<"__builtin_altivec_vsum2sws">,
848            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
849                      [IntrNoMem, IntrHasSideEffects]>;
850  def int_ppc_altivec_vsum4sbs : GCCBuiltin<"__builtin_altivec_vsum4sbs">,
851            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
852                      [IntrNoMem, IntrHasSideEffects]>;
853  def int_ppc_altivec_vsum4shs : GCCBuiltin<"__builtin_altivec_vsum4shs">,
854            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v4i32_ty],
855                      [IntrNoMem, IntrHasSideEffects]>;
856  def int_ppc_altivec_vsum4ubs : GCCBuiltin<"__builtin_altivec_vsum4ubs">,
857            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
858                      [IntrNoMem, IntrHasSideEffects]>;
859
860  // Vector Sign Extension Instructions
861  def int_ppc_altivec_vextsb2w : GCCBuiltin<"__builtin_altivec_vextsb2w">,
862            Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
863  def int_ppc_altivec_vextsb2d : GCCBuiltin<"__builtin_altivec_vextsb2d">,
864            Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty], [IntrNoMem]>;
865  def int_ppc_altivec_vextsh2w : GCCBuiltin<"__builtin_altivec_vextsh2w">,
866            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
867  def int_ppc_altivec_vextsh2d : GCCBuiltin<"__builtin_altivec_vextsh2d">,
868            Intrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty], [IntrNoMem]>;
869  def int_ppc_altivec_vextsw2d : GCCBuiltin<"__builtin_altivec_vextsw2d">,
870            Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
871  def int_ppc_altivec_vextsd2q : GCCBuiltin<"__builtin_altivec_vextsd2q">,
872            Intrinsic<[llvm_v1i128_ty], [llvm_v2i64_ty], [IntrNoMem]>;
873
874  // Other multiplies.
875  def int_ppc_altivec_vmladduhm : GCCBuiltin<"__builtin_altivec_vmladduhm">,
876            Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
877                       llvm_v8i16_ty], [IntrNoMem]>;
878
879  // Packs.
880  def int_ppc_altivec_vpkpx : GCCBuiltin<"__builtin_altivec_vpkpx">,
881            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
882                      [IntrNoMem]>;
883  def int_ppc_altivec_vpkshss : GCCBuiltin<"__builtin_altivec_vpkshss">,
884            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
885                      [IntrNoMem, IntrHasSideEffects]>;
886  def int_ppc_altivec_vpkshus : GCCBuiltin<"__builtin_altivec_vpkshus">,
887            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
888                      [IntrNoMem, IntrHasSideEffects]>;
889  def int_ppc_altivec_vpkswss : GCCBuiltin<"__builtin_altivec_vpkswss">,
890            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
891                      [IntrNoMem, IntrHasSideEffects]>;
892  def int_ppc_altivec_vpkswus : GCCBuiltin<"__builtin_altivec_vpkswus">,
893            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
894                      [IntrNoMem, IntrHasSideEffects]>;
895  def int_ppc_altivec_vpksdss : GCCBuiltin<"__builtin_altivec_vpksdss">,
896            Intrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
897                      [IntrNoMem, IntrHasSideEffects]>;
898  def int_ppc_altivec_vpksdus : GCCBuiltin<"__builtin_altivec_vpksdus">,
899            Intrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
900                      [IntrNoMem, IntrHasSideEffects]>;
901  // vpkuhum is lowered to a shuffle.
902  def int_ppc_altivec_vpkuhus : GCCBuiltin<"__builtin_altivec_vpkuhus">,
903            Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
904                      [IntrNoMem, IntrHasSideEffects]>;
905  // vpkuwum is lowered to a shuffle.
906  def int_ppc_altivec_vpkuwus : GCCBuiltin<"__builtin_altivec_vpkuwus">,
907            Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
908                      [IntrNoMem, IntrHasSideEffects]>;
909  // vpkudum is lowered to a shuffle.
910  def int_ppc_altivec_vpkudus : GCCBuiltin<"__builtin_altivec_vpkudus">,
911            Intrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
912                      [IntrNoMem, IntrHasSideEffects]>;
913
914  // Unpacks.
915  def int_ppc_altivec_vupkhpx : GCCBuiltin<"__builtin_altivec_vupkhpx">,
916            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
917  def int_ppc_altivec_vupkhsb : GCCBuiltin<"__builtin_altivec_vupkhsb">,
918            Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
919  def int_ppc_altivec_vupkhsh : GCCBuiltin<"__builtin_altivec_vupkhsh">,
920            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
921  def int_ppc_altivec_vupkhsw : GCCBuiltin<"__builtin_altivec_vupkhsw">,
922            Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
923  def int_ppc_altivec_vupklpx : GCCBuiltin<"__builtin_altivec_vupklpx">,
924            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
925  def int_ppc_altivec_vupklsb : GCCBuiltin<"__builtin_altivec_vupklsb">,
926            Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
927  def int_ppc_altivec_vupklsh : GCCBuiltin<"__builtin_altivec_vupklsh">,
928            Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
929  def int_ppc_altivec_vupklsw : GCCBuiltin<"__builtin_altivec_vupklsw">,
930            Intrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
931
932
933  // FP <-> integer conversion.
934  def int_ppc_altivec_vcfsx : GCCBuiltin<"__builtin_altivec_vcfsx">,
935              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
936                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
937  def int_ppc_altivec_vcfux : GCCBuiltin<"__builtin_altivec_vcfux">,
938              Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
939                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
940  def int_ppc_altivec_vctsxs : GCCBuiltin<"__builtin_altivec_vctsxs">,
941              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
942                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
943  def int_ppc_altivec_vctuxs : GCCBuiltin<"__builtin_altivec_vctuxs">,
944              Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
945                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
946
947  def int_ppc_altivec_vrfim : GCCBuiltin<"__builtin_altivec_vrfim">,
948              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
949  def int_ppc_altivec_vrfin : GCCBuiltin<"__builtin_altivec_vrfin">,
950              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
951  def int_ppc_altivec_vrfip : GCCBuiltin<"__builtin_altivec_vrfip">,
952              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
953  def int_ppc_altivec_vrfiz : GCCBuiltin<"__builtin_altivec_vrfiz">,
954              Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
955
956  // Add Extended Quadword
957  def int_ppc_altivec_vaddeuqm : GCCBuiltin<"__builtin_altivec_vaddeuqm">,
958              Intrinsic<[llvm_v1i128_ty],
959                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
960                        [IntrNoMem]>;
961  def int_ppc_altivec_vaddecuq : GCCBuiltin<"__builtin_altivec_vaddecuq">,
962              Intrinsic<[llvm_v1i128_ty],
963                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
964                        [IntrNoMem]>;
965
966  // Sub Extended Quadword
967  def int_ppc_altivec_vsubeuqm : GCCBuiltin<"__builtin_altivec_vsubeuqm">,
968              Intrinsic<[llvm_v1i128_ty],
969                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
970                        [IntrNoMem]>;
971  def int_ppc_altivec_vsubecuq : GCCBuiltin<"__builtin_altivec_vsubecuq">,
972              Intrinsic<[llvm_v1i128_ty],
973                        [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
974                        [IntrNoMem]>;
975
976  // P10 Vector Count Leading / Trailing Zeroes under bit Mask Builtins.
977  def int_ppc_altivec_vclzdm : GCCBuiltin<"__builtin_altivec_vclzdm">,
978              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
979                        [IntrNoMem]>;
980  def int_ppc_altivec_vctzdm : GCCBuiltin<"__builtin_altivec_vctzdm">,
981              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
982                        [IntrNoMem]>;
983}
984
985def int_ppc_altivec_vsl   : PowerPC_Vec_WWW_Intrinsic<"vsl">;
986def int_ppc_altivec_vslo  : PowerPC_Vec_WWW_Intrinsic<"vslo">;
987
988def int_ppc_altivec_vslb  : PowerPC_Vec_BBB_Intrinsic<"vslb">;
989def int_ppc_altivec_vslv  : PowerPC_Vec_BBB_Intrinsic<"vslv">;
990def int_ppc_altivec_vsrv  : PowerPC_Vec_BBB_Intrinsic<"vsrv">;
991def int_ppc_altivec_vslh  : PowerPC_Vec_HHH_Intrinsic<"vslh">;
992def int_ppc_altivec_vslw  : PowerPC_Vec_WWW_Intrinsic<"vslw">;
993
994// Right Shifts.
995def int_ppc_altivec_vsr   : PowerPC_Vec_WWW_Intrinsic<"vsr">;
996def int_ppc_altivec_vsro  : PowerPC_Vec_WWW_Intrinsic<"vsro">;
997
998def int_ppc_altivec_vsrb  : PowerPC_Vec_BBB_Intrinsic<"vsrb">;
999def int_ppc_altivec_vsrh  : PowerPC_Vec_HHH_Intrinsic<"vsrh">;
1000def int_ppc_altivec_vsrw  : PowerPC_Vec_WWW_Intrinsic<"vsrw">;
1001def int_ppc_altivec_vsrab : PowerPC_Vec_BBB_Intrinsic<"vsrab">;
1002def int_ppc_altivec_vsrah : PowerPC_Vec_HHH_Intrinsic<"vsrah">;
1003def int_ppc_altivec_vsraw : PowerPC_Vec_WWW_Intrinsic<"vsraw">;
1004
1005// Rotates.
1006def int_ppc_altivec_vrlb  : PowerPC_Vec_BBB_Intrinsic<"vrlb">;
1007def int_ppc_altivec_vrlh  : PowerPC_Vec_HHH_Intrinsic<"vrlh">;
1008def int_ppc_altivec_vrlw  : PowerPC_Vec_WWW_Intrinsic<"vrlw">;
1009def int_ppc_altivec_vrld  : PowerPC_Vec_DDD_Intrinsic<"vrld">;
1010
1011let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
1012  // Miscellaneous.
1013  def int_ppc_altivec_lvsl :
1014              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
1015  def int_ppc_altivec_lvsr :
1016              Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
1017
1018  def int_ppc_altivec_vperm : GCCBuiltin<"__builtin_altivec_vperm_4si">,
1019              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1020                         llvm_v4i32_ty, llvm_v16i8_ty], [IntrNoMem]>;
1021  def int_ppc_altivec_vsel : GCCBuiltin<"__builtin_altivec_vsel_4si">,
1022              Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1023                         llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1024  def int_ppc_altivec_vgbbd : GCCBuiltin<"__builtin_altivec_vgbbd">,
1025              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1026  def int_ppc_altivec_vbpermq : GCCBuiltin<"__builtin_altivec_vbpermq">,
1027              Intrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
1028                        [IntrNoMem]>;
1029}
1030
1031def int_ppc_altivec_vexptefp  : PowerPC_Vec_FF_Intrinsic<"vexptefp">;
1032def int_ppc_altivec_vlogefp   : PowerPC_Vec_FF_Intrinsic<"vlogefp">;
1033def int_ppc_altivec_vrefp     : PowerPC_Vec_FF_Intrinsic<"vrefp">;
1034def int_ppc_altivec_vrsqrtefp : PowerPC_Vec_FF_Intrinsic<"vrsqrtefp">;
1035
1036// Power8 Intrinsics
1037// Crypto
1038let TargetPrefix = "ppc" in {  // All PPC intrinsics start with "llvm.ppc.".
1039  def int_ppc_altivec_crypto_vsbox :
1040              GCCBuiltin<"__builtin_altivec_crypto_vsbox">,
1041              Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
1042  def int_ppc_altivec_crypto_vpermxor :
1043              GCCBuiltin<"__builtin_altivec_crypto_vpermxor">,
1044              Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty,
1045                         llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
1046
1047def int_ppc_altivec_crypto_vshasigmad :
1048            GCCBuiltin<"__builtin_altivec_crypto_vshasigmad">,
1049            Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty,
1050                       llvm_i32_ty, llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
1051def int_ppc_altivec_crypto_vshasigmaw :
1052            GCCBuiltin<"__builtin_altivec_crypto_vshasigmaw">,
1053            Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1054                       llvm_i32_ty, llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
1055}
1056def int_ppc_altivec_crypto_vcipher :
1057            PowerPC_Vec_DDD_Intrinsic<"crypto_vcipher">;
1058def int_ppc_altivec_crypto_vcipherlast :
1059            PowerPC_Vec_DDD_Intrinsic<"crypto_vcipherlast">;
1060def int_ppc_altivec_crypto_vncipher :
1061            PowerPC_Vec_DDD_Intrinsic<"crypto_vncipher">;
1062def int_ppc_altivec_crypto_vncipherlast :
1063            PowerPC_Vec_DDD_Intrinsic<"crypto_vncipherlast">;
1064def int_ppc_altivec_crypto_vpmsumb :
1065            PowerPC_Vec_BBB_Intrinsic<"crypto_vpmsumb">;
1066def int_ppc_altivec_crypto_vpmsumh :
1067            PowerPC_Vec_HHH_Intrinsic<"crypto_vpmsumh">;
1068def int_ppc_altivec_crypto_vpmsumw :
1069            PowerPC_Vec_WWW_Intrinsic<"crypto_vpmsumw">;
1070def int_ppc_altivec_crypto_vpmsumd :
1071            PowerPC_Vec_DDD_Intrinsic<"crypto_vpmsumd">;
1072
1073// Absolute Difference intrinsics
1074def int_ppc_altivec_vabsdub : PowerPC_Vec_BBB_Intrinsic<"vabsdub">;
1075def int_ppc_altivec_vabsduh : PowerPC_Vec_HHH_Intrinsic<"vabsduh">;
1076def int_ppc_altivec_vabsduw : PowerPC_Vec_WWW_Intrinsic<"vabsduw">;
1077
1078// Vector rotates
1079def int_ppc_altivec_vrlwnm :
1080      PowerPC_Vec_Intrinsic<"vrlwnm", [llvm_v4i32_ty],
1081                            [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1082def int_ppc_altivec_vrlwmi :
1083      PowerPC_Vec_Intrinsic<"vrlwmi", [llvm_v4i32_ty],
1084                            [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
1085                            [IntrNoMem]>;
1086def int_ppc_altivec_vrldnm :
1087      PowerPC_Vec_Intrinsic<"vrldnm", [llvm_v2i64_ty],
1088                            [llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem]>;
1089def int_ppc_altivec_vrldmi :
1090      PowerPC_Vec_Intrinsic<"vrldmi", [llvm_v2i64_ty],
1091                            [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
1092                            [IntrNoMem]>;
1093
1094def int_ppc_altivec_vrlqnm :
1095      PowerPC_Vec_Intrinsic<"vrlqnm", [llvm_v1i128_ty],
1096                           [llvm_v1i128_ty, llvm_v1i128_ty],
1097                            [IntrNoMem]>;
1098def int_ppc_altivec_vrlqmi :
1099      PowerPC_Vec_Intrinsic<"vrlqmi", [llvm_v1i128_ty],
1100                            [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
1101                            [IntrNoMem]>;
1102
1103// Vector Divide Extended Intrinsics.
1104def int_ppc_altivec_vdivesw : PowerPC_Vec_WWW_Intrinsic<"vdivesw">;
1105def int_ppc_altivec_vdiveuw : PowerPC_Vec_WWW_Intrinsic<"vdiveuw">;
1106def int_ppc_altivec_vdivesd : PowerPC_Vec_DDD_Intrinsic<"vdivesd">;
1107def int_ppc_altivec_vdiveud : PowerPC_Vec_DDD_Intrinsic<"vdiveud">;
1108def int_ppc_altivec_vdivesq : PowerPC_Vec_QQQ_Intrinsic<"vdivesq">;
1109def int_ppc_altivec_vdiveuq : PowerPC_Vec_QQQ_Intrinsic<"vdiveuq">;
1110
1111// Vector Multiply High Intrinsics.
1112def int_ppc_altivec_vmulhsw : PowerPC_Vec_WWW_Intrinsic<"vmulhsw">;
1113def int_ppc_altivec_vmulhuw : PowerPC_Vec_WWW_Intrinsic<"vmulhuw">;
1114def int_ppc_altivec_vmulhsd : PowerPC_Vec_DDD_Intrinsic<"vmulhsd">;
1115def int_ppc_altivec_vmulhud : PowerPC_Vec_DDD_Intrinsic<"vmulhud">;
1116
1117//===----------------------------------------------------------------------===//
1118// PowerPC VSX Intrinsic Definitions.
1119
1120let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
1121
1122// Vector load.
1123def int_ppc_vsx_lxvw4x :
1124      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
1125def int_ppc_vsx_lxvd2x :
1126      Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
1127def int_ppc_vsx_lxvw4x_be :
1128      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
1129def int_ppc_vsx_lxvd2x_be :
1130      Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
1131def int_ppc_vsx_lxvl :
1132      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty], [IntrReadMem,
1133      IntrArgMemOnly]>;
1134def int_ppc_vsx_lxvll :
1135      Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty], [IntrReadMem,
1136      IntrArgMemOnly]>;
1137def int_ppc_vsx_lxvp :
1138      Intrinsic<[llvm_v256i1_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly]>;
1139
1140// Vector store.
1141def int_ppc_vsx_stxvw4x : Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
1142                                    [IntrWriteMem, IntrArgMemOnly]>;
1143def int_ppc_vsx_stxvd2x : Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty],
1144                                    [IntrWriteMem, IntrArgMemOnly]>;
1145def int_ppc_vsx_stxvw4x_be : Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
1146                                       [IntrWriteMem, IntrArgMemOnly]>;
1147def int_ppc_vsx_stxvd2x_be : Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty],
1148                                       [IntrWriteMem, IntrArgMemOnly]>;
1149def int_ppc_vsx_stxvl :
1150      Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
1151      [IntrWriteMem, IntrArgMemOnly]>;
1152def int_ppc_vsx_stxvll :
1153      Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
1154      [IntrWriteMem, IntrArgMemOnly]>;
1155def int_ppc_vsx_stxvp :
1156      Intrinsic<[], [llvm_v256i1_ty, llvm_ptr_ty], [IntrWriteMem,
1157      IntrArgMemOnly]>;
1158// Vector and scalar maximum.
1159def int_ppc_vsx_xvmaxdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmaxdp">;
1160def int_ppc_vsx_xvmaxsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvmaxsp">;
1161def int_ppc_vsx_xsmaxdp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmaxdp">;
1162
1163// Vector and scalar minimum.
1164def int_ppc_vsx_xvmindp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmindp">;
1165def int_ppc_vsx_xvminsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvminsp">;
1166def int_ppc_vsx_xsmindp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmindp">;
1167
1168// Vector divide.
1169def int_ppc_vsx_xvdivdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvdivdp">;
1170def int_ppc_vsx_xvdivsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvdivsp">;
1171
1172// Vector round-to-infinity (ceil)
1173def int_ppc_vsx_xvrspip :
1174      Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1175def int_ppc_vsx_xvrdpip :
1176      Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1177
1178// Vector reciprocal estimate
1179def int_ppc_vsx_xvresp : GCCBuiltin<"__builtin_vsx_xvresp">,
1180      Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1181def int_ppc_vsx_xvredp : GCCBuiltin<"__builtin_vsx_xvredp">,
1182      Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1183
1184// Vector rsqrte
1185def int_ppc_vsx_xvrsqrtesp : GCCBuiltin<"__builtin_vsx_xvrsqrtesp">,
1186      Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1187def int_ppc_vsx_xvrsqrtedp : GCCBuiltin<"__builtin_vsx_xvrsqrtedp">,
1188      Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1189
1190// Vector compare
1191def int_ppc_vsx_xvcmpeqdp :
1192      PowerPC_VSX_Intrinsic<"xvcmpeqdp", [llvm_v2i64_ty],
1193                            [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1194def int_ppc_vsx_xvcmpeqdp_p : GCCBuiltin<"__builtin_vsx_xvcmpeqdp_p">,
1195              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
1196                        [IntrNoMem]>;
1197def int_ppc_vsx_xvcmpeqsp :
1198      PowerPC_VSX_Intrinsic<"xvcmpeqsp", [llvm_v4i32_ty],
1199                            [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1200def int_ppc_vsx_xvcmpeqsp_p : GCCBuiltin<"__builtin_vsx_xvcmpeqsp_p">,
1201              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
1202                        [IntrNoMem]>;
1203def int_ppc_vsx_xvcmpgedp :
1204      PowerPC_VSX_Intrinsic<"xvcmpgedp", [llvm_v2i64_ty],
1205                            [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1206def int_ppc_vsx_xvcmpgedp_p : GCCBuiltin<"__builtin_vsx_xvcmpgedp_p">,
1207              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
1208                        [IntrNoMem]>;
1209def int_ppc_vsx_xvcmpgesp :
1210      PowerPC_VSX_Intrinsic<"xvcmpgesp", [llvm_v4i32_ty],
1211                            [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1212def int_ppc_vsx_xvcmpgesp_p : GCCBuiltin<"__builtin_vsx_xvcmpgesp_p">,
1213              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
1214                        [IntrNoMem]>;
1215def int_ppc_vsx_xvcmpgtdp :
1216      PowerPC_VSX_Intrinsic<"xvcmpgtdp", [llvm_v2i64_ty],
1217                            [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1218def int_ppc_vsx_xvcmpgtdp_p : GCCBuiltin<"__builtin_vsx_xvcmpgtdp_p">,
1219              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
1220                        [IntrNoMem]>;
1221def int_ppc_vsx_xvcmpgtsp :
1222      PowerPC_VSX_Intrinsic<"xvcmpgtsp", [llvm_v4i32_ty],
1223                            [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1224def int_ppc_vsx_xvcmpgtsp_p : GCCBuiltin<"__builtin_vsx_xvcmpgtsp_p">,
1225              Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
1226                        [IntrNoMem]>;
1227def int_ppc_vsx_xxleqv :
1228      PowerPC_VSX_Intrinsic<"xxleqv", [llvm_v4i32_ty],
1229                            [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1230def int_ppc_vsx_xviexpdp :
1231      PowerPC_VSX_Intrinsic<"xviexpdp",[llvm_v2f64_ty],
1232                            [llvm_v2i64_ty, llvm_v2i64_ty],[IntrNoMem]>;
1233def int_ppc_vsx_xviexpsp :
1234      PowerPC_VSX_Intrinsic<"xviexpsp",[llvm_v4f32_ty],
1235                            [llvm_v4i32_ty, llvm_v4i32_ty],[IntrNoMem]>;
1236def int_ppc_vsx_xvcvdpsxws :
1237      PowerPC_VSX_Intrinsic<"xvcvdpsxws", [llvm_v4i32_ty],
1238                            [llvm_v2f64_ty], [IntrNoMem]>;
1239def int_ppc_vsx_xvcvdpuxws :
1240      PowerPC_VSX_Intrinsic<"xvcvdpuxws", [llvm_v4i32_ty],
1241                            [llvm_v2f64_ty], [IntrNoMem]>;
1242def int_ppc_vsx_xvcvsxwdp :
1243      PowerPC_VSX_Intrinsic<"xvcvsxwdp", [llvm_v2f64_ty],
1244                            [llvm_v4i32_ty], [IntrNoMem]>;
1245def int_ppc_vsx_xvcvuxwdp :
1246      PowerPC_VSX_Intrinsic<"xvcvuxwdp", [llvm_v2f64_ty],
1247                            [llvm_v4i32_ty], [IntrNoMem]>;
1248def int_ppc_vsx_xvcvspdp :
1249      PowerPC_VSX_Intrinsic<"xvcvspdp", [llvm_v2f64_ty],
1250                            [llvm_v4f32_ty], [IntrNoMem]>;
1251def int_ppc_vsx_xvcvsxdsp :
1252      PowerPC_VSX_Intrinsic<"xvcvsxdsp", [llvm_v4f32_ty],
1253                            [llvm_v2i64_ty], [IntrNoMem]>;
1254def int_ppc_vsx_xvcvuxdsp :
1255      PowerPC_VSX_Intrinsic<"xvcvuxdsp", [llvm_v4f32_ty],
1256                            [llvm_v2i64_ty], [IntrNoMem]>;
1257def int_ppc_vsx_xvcvdpsp :
1258      PowerPC_VSX_Intrinsic<"xvcvdpsp", [llvm_v4f32_ty],
1259                            [llvm_v2f64_ty], [IntrNoMem]>;
1260def int_ppc_vsx_xvcvsphp :
1261      PowerPC_VSX_Intrinsic<"xvcvsphp", [llvm_v4f32_ty],
1262                            [llvm_v4f32_ty], [IntrNoMem]>;
1263def int_ppc_vsx_xvxexpdp :
1264      PowerPC_VSX_Intrinsic<"xvxexpdp", [llvm_v2i64_ty],
1265                            [llvm_v2f64_ty], [IntrNoMem]>;
1266def int_ppc_vsx_xvxexpsp :
1267      PowerPC_VSX_Intrinsic<"xvxexpsp", [llvm_v4i32_ty],
1268                            [llvm_v4f32_ty], [IntrNoMem]>;
1269def int_ppc_vsx_xvxsigdp :
1270      PowerPC_VSX_Intrinsic<"xvxsigdp", [llvm_v2i64_ty],
1271                            [llvm_v2f64_ty], [IntrNoMem]>;
1272def int_ppc_vsx_xvxsigsp :
1273      PowerPC_VSX_Intrinsic<"xvxsigsp", [llvm_v4i32_ty],
1274                            [llvm_v4f32_ty], [IntrNoMem]>;
1275def int_ppc_vsx_xvtstdcdp :
1276      PowerPC_VSX_Intrinsic<"xvtstdcdp", [llvm_v2i64_ty],
1277                            [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1278def int_ppc_vsx_xvtstdcsp :
1279      PowerPC_VSX_Intrinsic<"xvtstdcsp", [llvm_v4i32_ty],
1280                            [llvm_v4f32_ty,llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1281def int_ppc_vsx_xvcvhpsp :
1282      PowerPC_VSX_Intrinsic<"xvcvhpsp", [llvm_v4f32_ty],
1283                            [llvm_v8i16_ty],[IntrNoMem]>;
1284def int_ppc_vsx_xvcvspbf16 :
1285      PowerPC_VSX_Intrinsic<"xvcvspbf16", [llvm_v16i8_ty],
1286                            [llvm_v16i8_ty], [IntrNoMem]>;
1287def int_ppc_vsx_xvcvbf16spn :
1288      PowerPC_VSX_Intrinsic<"xvcvbf16spn", [llvm_v16i8_ty],
1289                            [llvm_v16i8_ty], [IntrNoMem]>;
1290def int_ppc_vsx_xxextractuw :
1291      PowerPC_VSX_Intrinsic<"xxextractuw",[llvm_v2i64_ty],
1292                            [llvm_v2i64_ty,llvm_i32_ty], [IntrNoMem]>;
1293def int_ppc_vsx_xxinsertw :
1294      PowerPC_VSX_Intrinsic<"xxinsertw",[llvm_v4i32_ty],
1295                            [llvm_v4i32_ty,llvm_v2i64_ty,llvm_i32_ty],
1296                            [IntrNoMem]>;
1297def int_ppc_vsx_xvtlsbb :
1298      PowerPC_VSX_Intrinsic<"xvtlsbb", [llvm_i32_ty],
1299                            [llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
1300def int_ppc_vsx_xvtdivdp :
1301      PowerPC_VSX_Intrinsic<"xvtdivdp", [llvm_i32_ty],
1302                            [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1303def int_ppc_vsx_xvtdivsp :
1304      PowerPC_VSX_Intrinsic<"xvtdivsp", [llvm_i32_ty],
1305                            [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1306def int_ppc_vsx_xvtsqrtdp :
1307      PowerPC_VSX_Intrinsic<"xvtsqrtdp", [llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1308def int_ppc_vsx_xvtsqrtsp :
1309      PowerPC_VSX_Intrinsic<"xvtsqrtsp", [llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1310def int_ppc_vsx_xxeval :
1311      PowerPC_VSX_Intrinsic<"xxeval", [llvm_v2i64_ty],
1312                           [llvm_v2i64_ty, llvm_v2i64_ty,
1313                            llvm_v2i64_ty, llvm_i32_ty],
1314                           [IntrNoMem, ImmArg<ArgIndex<3>>]>;
1315def int_ppc_vsx_xxgenpcvbm :
1316      PowerPC_VSX_Intrinsic<"xxgenpcvbm", [llvm_v16i8_ty],
1317                            [llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
1318def int_ppc_vsx_xxgenpcvhm :
1319      PowerPC_VSX_Intrinsic<"xxgenpcvhm", [llvm_v8i16_ty],
1320                            [llvm_v8i16_ty, llvm_i32_ty], [IntrNoMem]>;
1321def int_ppc_vsx_xxgenpcvwm :
1322      PowerPC_VSX_Intrinsic<"xxgenpcvwm", [llvm_v4i32_ty],
1323                            [llvm_v4i32_ty, llvm_i32_ty], [IntrNoMem]>;
1324def int_ppc_vsx_xxgenpcvdm :
1325      PowerPC_VSX_Intrinsic<"xxgenpcvdm", [llvm_v2i64_ty],
1326                            [llvm_v2i64_ty, llvm_i32_ty], [IntrNoMem]>;
1327
1328// P10 VSX Vector permute extended.
1329def int_ppc_vsx_xxpermx :
1330      GCCBuiltin<"__builtin_vsx_xxpermx">,
1331      Intrinsic<[llvm_v16i8_ty],
1332                [llvm_v16i8_ty,llvm_v16i8_ty,llvm_v16i8_ty,llvm_i32_ty],
1333                [IntrNoMem, ImmArg<ArgIndex<3>>]>;
1334// P10 VSX Vector Blend Variable.
1335def  int_ppc_vsx_xxblendvb: GCCBuiltin<"__builtin_vsx_xxblendvb">,
1336       Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
1337                 [IntrNoMem]>;
1338def  int_ppc_vsx_xxblendvh: GCCBuiltin<"__builtin_vsx_xxblendvh">,
1339       Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,llvm_v8i16_ty],
1340                 [IntrNoMem]>;
1341def  int_ppc_vsx_xxblendvw: GCCBuiltin<"__builtin_vsx_xxblendvw">,
1342       Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
1343                 [IntrNoMem]>;
1344def  int_ppc_vsx_xxblendvd: GCCBuiltin<"__builtin_vsx_xxblendvd">,
1345       Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
1346                 [IntrNoMem]>;
1347}
1348
1349//===----------------------------------------------------------------------===//
1350// PowerPC HTM Intrinsic Definitions.
1351
1352let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
1353
1354def int_ppc_tbegin : GCCBuiltin<"__builtin_tbegin">,
1355      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
1356def int_ppc_tend : GCCBuiltin<"__builtin_tend">,
1357      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
1358
1359def int_ppc_tabort : GCCBuiltin<"__builtin_tabort">,
1360      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1361def int_ppc_tabortwc : GCCBuiltin<"__builtin_tabortwc">,
1362      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1363def int_ppc_tabortwci : GCCBuiltin<"__builtin_tabortwci">,
1364      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1365def int_ppc_tabortdc : GCCBuiltin<"__builtin_tabortdc">,
1366      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1367def int_ppc_tabortdci : GCCBuiltin<"__builtin_tabortdci">,
1368      Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1369
1370def int_ppc_tcheck : GCCBuiltin<"__builtin_tcheck">,
1371      Intrinsic<[llvm_i32_ty], [], []>;
1372def int_ppc_treclaim : GCCBuiltin<"__builtin_treclaim">,
1373      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1374def int_ppc_trechkpt : GCCBuiltin<"__builtin_trechkpt">,
1375      Intrinsic<[llvm_i32_ty], [], []>;
1376def int_ppc_tsr : GCCBuiltin<"__builtin_tsr">,
1377      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1378
1379def int_ppc_get_texasr : GCCBuiltin<"__builtin_get_texasr">,
1380      Intrinsic<[llvm_i64_ty], [], []>;
1381def int_ppc_get_texasru : GCCBuiltin<"__builtin_get_texasru">,
1382      Intrinsic<[llvm_i64_ty], [], []>;
1383def int_ppc_get_tfhar : GCCBuiltin<"__builtin_get_tfhar">,
1384      Intrinsic<[llvm_i64_ty], [], []>;
1385def int_ppc_get_tfiar : GCCBuiltin<"__builtin_get_tfiar">,
1386      Intrinsic<[llvm_i64_ty], [], []>;
1387
1388def int_ppc_set_texasr : GCCBuiltin<"__builtin_set_texasr">,
1389      Intrinsic<[], [llvm_i64_ty], []>;
1390def int_ppc_set_texasru : GCCBuiltin<"__builtin_set_texasru">,
1391      Intrinsic<[], [llvm_i64_ty], []>;
1392def int_ppc_set_tfhar : GCCBuiltin<"__builtin_set_tfhar">,
1393      Intrinsic<[], [llvm_i64_ty], []>;
1394def int_ppc_set_tfiar : GCCBuiltin<"__builtin_set_tfiar">,
1395      Intrinsic<[], [llvm_i64_ty], []>;
1396
1397// Extended mnemonics
1398def int_ppc_tendall : GCCBuiltin<"__builtin_tendall">,
1399      Intrinsic<[llvm_i32_ty], [], []>;
1400def int_ppc_tresume : GCCBuiltin<"__builtin_tresume">,
1401      Intrinsic<[llvm_i32_ty], [], []>;
1402def int_ppc_tsuspend : GCCBuiltin<"__builtin_tsuspend">,
1403      Intrinsic<[llvm_i32_ty], [], []>;
1404
1405def int_ppc_ttest : GCCBuiltin<"__builtin_ttest">,
1406      Intrinsic<[llvm_i64_ty], [], []>;
1407
1408def int_ppc_cfence : Intrinsic<[], [llvm_anyint_ty], []>;
1409
1410// PowerPC set FPSCR Intrinsic Definitions.
1411def int_ppc_setrnd : GCCBuiltin<"__builtin_setrnd">,
1412      Intrinsic<[llvm_double_ty], [llvm_i32_ty], []>;
1413}
1414
1415let TargetPrefix = "ppc" in {
1416  def int_ppc_vsx_assemble_pair :
1417        Intrinsic<[llvm_v256i1_ty],
1418                  [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
1419
1420  def int_ppc_vsx_disassemble_pair :
1421        Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty],
1422                  [llvm_v256i1_ty], [IntrNoMem]>;
1423
1424  def int_ppc_mma_assemble_acc :
1425        Intrinsic<[llvm_v512i1_ty],
1426                  [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
1427                  [IntrNoMem]>;
1428
1429  def int_ppc_mma_disassemble_acc :
1430        Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
1431                  [llvm_v512i1_ty], [IntrNoMem]>;
1432
1433  def int_ppc_mma_xxmtacc :
1434        Intrinsic<[llvm_v512i1_ty], [llvm_v512i1_ty], [IntrNoMem]>;
1435
1436  def int_ppc_mma_xxmfacc :
1437        Intrinsic<[llvm_v512i1_ty], [llvm_v512i1_ty], [IntrNoMem]>;
1438
1439  def int_ppc_mma_xxsetaccz :
1440        Intrinsic<[llvm_v512i1_ty], [], [IntrNoMem]>;
1441
1442  // MMA Reduced-Precision: Outer Product Intrinsic Definitions.
1443  defm int_ppc_mma_xvi4ger8 :
1444        PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1445  defm int_ppc_mma_pmxvi4ger8 :
1446        PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1447                                      llvm_i32_ty, llvm_i32_ty]>;
1448
1449  defm int_ppc_mma_xvi8ger4 :
1450       PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1451  defm int_ppc_mma_pmxvi8ger4 :
1452       PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1453                                     llvm_i32_ty, llvm_i32_ty]>;
1454
1455  defm int_ppc_mma_xvi16ger2s :
1456       PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1457  defm int_ppc_mma_pmxvi16ger2s :
1458       PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1459                                     llvm_i32_ty, llvm_i32_ty]>;
1460
1461  defm int_ppc_mma_xvf16ger2 :
1462       PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1463  defm int_ppc_mma_pmxvf16ger2 :
1464       PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1465                                  llvm_i32_ty, llvm_i32_ty]>;
1466  defm int_ppc_mma_xvf32ger :
1467       PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1468  defm int_ppc_mma_pmxvf32ger :
1469       PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1470                                  llvm_i32_ty]>;
1471  defm int_ppc_mma_xvf64ger :
1472       PowerPC_MMA_ACC_Intrinsic<[llvm_v256i1_ty, llvm_v16i8_ty]>;
1473  defm int_ppc_mma_pmxvf64ger :
1474       PowerPC_MMA_ACC_Intrinsic<[llvm_v256i1_ty, llvm_v16i8_ty, llvm_i32_ty,
1475                                  llvm_i32_ty]>;
1476
1477  // MMA Reduced-Precision: bfloat16 Outer Product Intrinsic Definitions.
1478  defm int_ppc_mma_xvbf16ger2 :
1479         PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1480  defm int_ppc_mma_pmxvbf16ger2 :
1481         PowerPC_MMA_ACC_Intrinsic<
1482           [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty]>;
1483
1484  // MMA Reduced-Precision: Missing Integer-based Outer Product Operations.
1485  defm int_ppc_mma_xvi16ger2 :
1486         PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1487  defm int_ppc_mma_pmxvi16ger2 :
1488         PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1489                                       llvm_i32_ty, llvm_i32_ty]>;
1490  def int_ppc_mma_xvi8ger4spp :
1491        Intrinsic<[llvm_v512i1_ty],
1492                  [llvm_v512i1_ty, llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
1493  def int_ppc_mma_pmxvi8ger4spp :
1494        Intrinsic<[llvm_v512i1_ty],
1495                  [llvm_v512i1_ty, llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1496                   llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
1497}
1498