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