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