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