Warning, /include/llvm/IR/IntrinsicsPowerPC.td is written in an unsupported language. File is not indexed.
0001 //===- IntrinsicsPowerPC.td - Defines PowerPC intrinsics ---*- tablegen -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 // This file defines all of the PowerPC-specific intrinsics.
0010 //
0011 //===----------------------------------------------------------------------===//
0012
0013 //===----------------------------------------------------------------------===//
0014 // Definitions for all PowerPC intrinsics.
0015 //
0016
0017 // Non-altivec intrinsics.
0018 let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.".
0019 // dcba/dcbf/dcbi/dcbst/dcbt/dcbz/dcbzl(PPC970) instructions.
0020 def int_ppc_dcba : Intrinsic<[], [llvm_ptr_ty], []>;
0021 def int_ppc_dcbf : ClangBuiltin<"__builtin_dcbf">,
0022 Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
0023 def int_ppc_dcbfps : Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
0024 def int_ppc_dcbstps : Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
0025 def int_ppc_dcbi : Intrinsic<[], [llvm_ptr_ty], []>;
0026 def int_ppc_dcbt_with_hint: Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
0027 [IntrArgMemOnly, NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0028 def int_ppc_dcbtst_with_hint: Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
0029 [IntrArgMemOnly, NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0030 def int_ppc_dcbzl : Intrinsic<[], [llvm_ptr_ty], []>;
0031
0032 // Emit pseudo instruction as fence of instruction motion
0033 def int_ppc_fence : ClangBuiltin<"__builtin_ppc_fence">,
0034 DefaultAttrsIntrinsic<[], [],
0035 [IntrNoMerge, IntrHasSideEffects]>;
0036
0037 // Get content from current FPSCR register
0038 def int_ppc_readflm : ClangBuiltin<"__builtin_readflm">,
0039 DefaultAttrsIntrinsic<[llvm_double_ty], [],
0040 [IntrNoMerge, IntrHasSideEffects]>;
0041 def int_ppc_mffsl : ClangBuiltin<"__builtin_ppc_mffsl">,
0042 DefaultAttrsIntrinsic<[llvm_double_ty], [],
0043 [IntrNoMerge, IntrHasSideEffects]>;
0044
0045 // Set FPSCR register, and return previous content
0046 def int_ppc_setflm : ClangBuiltin<"__builtin_setflm">,
0047 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty],
0048 [IntrHasSideEffects]>;
0049
0050 // Intrinsics for [double]word extended forms of divide instructions
0051 def int_ppc_divwe : ClangBuiltin<"__builtin_divwe">,
0052 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0053 [IntrNoMem]>;
0054 def int_ppc_divweu : ClangBuiltin<"__builtin_divweu">,
0055 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0056 [IntrNoMem]>;
0057 def int_ppc_divde : ClangBuiltin<"__builtin_divde">,
0058 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0059 [IntrNoMem]>;
0060 def int_ppc_divdeu : ClangBuiltin<"__builtin_divdeu">,
0061 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0062 [IntrNoMem]>;
0063
0064 def int_ppc_unpack_longdouble : ClangBuiltin<"__builtin_unpack_longdouble">,
0065 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_ppcf128_ty, llvm_i32_ty],
0066 [IntrNoMem]>;
0067 def int_ppc_pack_longdouble : ClangBuiltin<"__builtin_pack_longdouble">,
0068 DefaultAttrsIntrinsic<[llvm_ppcf128_ty], [llvm_double_ty, llvm_double_ty],
0069 [IntrNoMem]>;
0070
0071 // Generate a random number
0072 def int_ppc_darn : ClangBuiltin<"__builtin_darn">,
0073 DefaultAttrsIntrinsic<[llvm_i64_ty], [],
0074 [IntrNoMerge, IntrHasSideEffects]>;
0075 def int_ppc_darnraw : ClangBuiltin<"__builtin_darn_raw">,
0076 DefaultAttrsIntrinsic<[llvm_i64_ty], [],
0077 [IntrNoMerge, IntrHasSideEffects]>;
0078 def int_ppc_darn32 : ClangBuiltin<"__builtin_darn_32">,
0079 DefaultAttrsIntrinsic<[llvm_i32_ty], [],
0080 [IntrNoMerge, IntrHasSideEffects]>;
0081
0082 // Bit permute doubleword
0083 def int_ppc_bpermd : ClangBuiltin<"__builtin_bpermd">,
0084 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0085 [IntrNoMem]>;
0086
0087 // Parallel Bits Deposit/Extract Doubleword Builtins.
0088 def int_ppc_pdepd
0089 : ClangBuiltin<"__builtin_pdepd">,
0090 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0091 [IntrNoMem]>;
0092 def int_ppc_pextd
0093 : ClangBuiltin<"__builtin_pextd">,
0094 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0095 [IntrNoMem]>;
0096
0097 // Centrifuge Doubleword Builtin.
0098 def int_ppc_cfuged
0099 : ClangBuiltin<"__builtin_cfuged">,
0100 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0101 [IntrNoMem]>;
0102
0103 // Count Leading / Trailing Zeroes under bit Mask Builtins.
0104 def int_ppc_cntlzdm
0105 : ClangBuiltin<"__builtin_cntlzdm">,
0106 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0107 [IntrNoMem]>;
0108 def int_ppc_cnttzdm
0109 : ClangBuiltin<"__builtin_cnttzdm">,
0110 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
0111 [IntrNoMem]>;
0112
0113 def int_ppc_truncf128_round_to_odd
0114 : ClangBuiltin<"__builtin_truncf128_round_to_odd">,
0115 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_f128_ty], [IntrNoMem]>;
0116 def int_ppc_sqrtf128_round_to_odd
0117 : ClangBuiltin<"__builtin_sqrtf128_round_to_odd">,
0118 DefaultAttrsIntrinsic<[llvm_f128_ty], [llvm_f128_ty], [IntrNoMem]>;
0119 def int_ppc_addf128_round_to_odd
0120 : ClangBuiltin<"__builtin_addf128_round_to_odd">,
0121 DefaultAttrsIntrinsic<[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty],
0122 [IntrNoMem]>;
0123 def int_ppc_subf128_round_to_odd
0124 : ClangBuiltin<"__builtin_subf128_round_to_odd">,
0125 DefaultAttrsIntrinsic<[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty],
0126 [IntrNoMem]>;
0127 def int_ppc_mulf128_round_to_odd
0128 : ClangBuiltin<"__builtin_mulf128_round_to_odd">,
0129 DefaultAttrsIntrinsic<[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty],
0130 [IntrNoMem]>;
0131 def int_ppc_divf128_round_to_odd
0132 : ClangBuiltin<"__builtin_divf128_round_to_odd">,
0133 DefaultAttrsIntrinsic<[llvm_f128_ty], [llvm_f128_ty,llvm_f128_ty],
0134 [IntrNoMem]>;
0135 def int_ppc_fmaf128_round_to_odd
0136 : ClangBuiltin<"__builtin_fmaf128_round_to_odd">,
0137 DefaultAttrsIntrinsic<[llvm_f128_ty],
0138 [llvm_f128_ty,llvm_f128_ty,llvm_f128_ty],
0139 [IntrNoMem]>;
0140 def int_ppc_scalar_extract_expq
0141 : ClangBuiltin<"__builtin_vsx_scalar_extract_expq">,
0142 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_f128_ty], [IntrNoMem]>;
0143 def int_ppc_scalar_insert_exp_qp
0144 : ClangBuiltin<"__builtin_vsx_scalar_insert_exp_qp">,
0145 DefaultAttrsIntrinsic<[llvm_f128_ty], [llvm_f128_ty, llvm_i64_ty],
0146 [IntrNoMem]>;
0147
0148 // Intrinsics defined to maintain XL compatibility
0149 def int_ppc_tdw
0150 : ClangBuiltin<"__builtin_ppc_tdw">,
0151 Intrinsic <[], [llvm_i64_ty, llvm_i64_ty, llvm_i32_ty], [ImmArg<ArgIndex<2>>]>;
0152 def int_ppc_tw
0153 : ClangBuiltin<"__builtin_ppc_tw">,
0154 Intrinsic <[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<2>>]>;
0155 def int_ppc_trapd
0156 : ClangBuiltin<"__builtin_ppc_trapd">,
0157 Intrinsic <[], [llvm_i64_ty], []>;
0158 def int_ppc_trap
0159 : ClangBuiltin<"__builtin_ppc_trap">,
0160 Intrinsic <[], [llvm_i32_ty], []>;
0161 def int_ppc_fcfid
0162 : ClangBuiltin<"__builtin_ppc_fcfid">,
0163 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0164 def int_ppc_fcfud
0165 : ClangBuiltin<"__builtin_ppc_fcfud">,
0166 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0167 def int_ppc_fctid
0168 : ClangBuiltin<"__builtin_ppc_fctid">,
0169 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0170 def int_ppc_fctidz
0171 : ClangBuiltin<"__builtin_ppc_fctidz">,
0172 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0173 def int_ppc_fctiw
0174 : ClangBuiltin<"__builtin_ppc_fctiw">,
0175 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0176 def int_ppc_fctiwz
0177 : ClangBuiltin<"__builtin_ppc_fctiwz">,
0178 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0179 def int_ppc_fctudz
0180 : ClangBuiltin<"__builtin_ppc_fctudz">,
0181 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0182 def int_ppc_fctuwz
0183 : ClangBuiltin<"__builtin_ppc_fctuwz">,
0184 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
0185 def int_ppc_rlwimi
0186 : ClangBuiltin<"__builtin_ppc_rlwimi">,
0187 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
0188 [IntrNoMem, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
0189 def int_ppc_rlwnm
0190 : ClangBuiltin<"__builtin_ppc_rlwnm">,
0191 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
0192 [IntrNoMem, ImmArg<ArgIndex<2>>]>;
0193 def int_ppc_rldimi
0194 : DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty, llvm_i32_ty, llvm_i64_ty],
0195 [IntrNoMem, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
0196
0197 // XL compatible select functions
0198 // TODO: Add llvm_f128_ty support.
0199 def int_ppc_maxfe
0200 : DefaultAttrsIntrinsic<
0201 [llvm_ppcf128_ty],
0202 [llvm_ppcf128_ty, llvm_ppcf128_ty, llvm_ppcf128_ty, llvm_vararg_ty],
0203 [IntrNoMem]>;
0204 def int_ppc_maxfl
0205 : DefaultAttrsIntrinsic<
0206 [llvm_double_ty],
0207 [llvm_double_ty, llvm_double_ty, llvm_double_ty, llvm_vararg_ty],
0208 [IntrNoMem]>;
0209 def int_ppc_maxfs
0210 : DefaultAttrsIntrinsic<
0211 [llvm_float_ty],
0212 [llvm_float_ty, llvm_float_ty, llvm_float_ty, llvm_vararg_ty],
0213 [IntrNoMem]>;
0214 def int_ppc_minfe
0215 : DefaultAttrsIntrinsic<
0216 [llvm_ppcf128_ty],
0217 [llvm_ppcf128_ty, llvm_ppcf128_ty, llvm_ppcf128_ty, llvm_vararg_ty],
0218 [IntrNoMem]>;
0219 def int_ppc_minfl
0220 : DefaultAttrsIntrinsic<
0221 [llvm_double_ty],
0222 [llvm_double_ty, llvm_double_ty, llvm_double_ty, llvm_vararg_ty],
0223 [IntrNoMem]>;
0224 def int_ppc_minfs
0225 : DefaultAttrsIntrinsic<
0226 [llvm_float_ty],
0227 [llvm_float_ty, llvm_float_ty, llvm_float_ty, llvm_vararg_ty],
0228 [IntrNoMem]>;
0229 // Load of a value provided by the system library at a fixed address. Used for
0230 // accessing things like the HWCAP word provided by Glibc. The immediate
0231 // argument is not an address but a value defined in
0232 // include/llvm/TargetParser/PPCTargetParser.def. Each of the values provided
0233 // by Glibc is a 32-bit word.
0234 def int_ppc_fixed_addr_ld
0235 : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty],
0236 [IntrInaccessibleMemOnly, ImmArg<ArgIndex<0>>]>;
0237
0238 }
0239
0240 let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.".
0241 /// PowerPC_Vec_Intrinsic - Base class for all altivec intrinsics.
0242 class PowerPC_Vec_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
0243 list<LLVMType> param_types,
0244 list<IntrinsicProperty> properties>
0245 : ClangBuiltin<!strconcat("__builtin_altivec_", GCCIntSuffix)>,
0246 DefaultAttrsIntrinsic<ret_types, param_types, properties>;
0247
0248 /// PowerPC_VSX_Intrinsic - Base class for all VSX intrinsics.
0249 class PowerPC_VSX_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types,
0250 list<LLVMType> param_types,
0251 list<IntrinsicProperty> properties>
0252 : ClangBuiltin<!strconcat("__builtin_vsx_", GCCIntSuffix)>,
0253 DefaultAttrsIntrinsic<ret_types, param_types, properties>;
0254 }
0255
0256 //===----------------------------------------------------------------------===//
0257 // PowerPC MMA Intrinsic Multi Class Definitions.
0258 //
0259
0260 multiclass PowerPC_MMA_ACC_Intrinsic<list<LLVMType> args> {
0261 def NAME: DefaultAttrsIntrinsic<[llvm_v512i1_ty], args, [IntrNoMem]>;
0262 def pp : DefaultAttrsIntrinsic<[llvm_v512i1_ty],
0263 !listconcat([llvm_v512i1_ty], args),
0264 [IntrNoMem]>;
0265 def pn : DefaultAttrsIntrinsic<[llvm_v512i1_ty],
0266 !listconcat([llvm_v512i1_ty], args),
0267 [IntrNoMem]>;
0268 def np : DefaultAttrsIntrinsic<[llvm_v512i1_ty],
0269 !listconcat([llvm_v512i1_ty], args),
0270 [IntrNoMem]>;
0271 def nn : DefaultAttrsIntrinsic<[llvm_v512i1_ty],
0272 !listconcat([llvm_v512i1_ty], args),
0273 [IntrNoMem]>;
0274 }
0275
0276 multiclass PowerPC_MMA_ACC_PP_Intrinsic<list<LLVMType> args> {
0277 def NAME: DefaultAttrsIntrinsic<[llvm_v512i1_ty], args, [IntrNoMem]>;
0278 def pp : DefaultAttrsIntrinsic<[llvm_v512i1_ty],
0279 !listconcat([llvm_v512i1_ty], args),
0280 [IntrNoMem]>;
0281 }
0282
0283 //===----------------------------------------------------------------------===//
0284 // PowerPC Altivec Intrinsic Class Definitions.
0285 //
0286
0287 /// PowerPC_Vec_FF_Intrinsic - A PowerPC intrinsic that takes one v4f32
0288 /// vector and returns one. These intrinsics have no side effects.
0289 class PowerPC_Vec_FF_Intrinsic<string GCCIntSuffix>
0290 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0291 [llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
0292
0293 /// PowerPC_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
0294 /// vectors and returns one. These intrinsics have no side effects.
0295 class PowerPC_Vec_FFF_Intrinsic<string GCCIntSuffix>
0296 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0297 [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
0298 [IntrNoMem]>;
0299
0300 /// PowerPC_Vec_BBB_Intrinsic - A PowerPC intrinsic that takes two v16i8
0301 /// vectors and returns one. These intrinsics have no side effects.
0302 class PowerPC_Vec_BBB_Intrinsic<string GCCIntSuffix>
0303 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0304 [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0305 [IntrNoMem]>;
0306
0307 /// PowerPC_Vec_HHH_Intrinsic - A PowerPC intrinsic that takes two v8i16
0308 /// vectors and returns one. These intrinsics have no side effects.
0309 class PowerPC_Vec_HHH_Intrinsic<string GCCIntSuffix>
0310 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0311 [llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0312 [IntrNoMem]>;
0313
0314 /// PowerPC_Vec_WWW_Intrinsic - A PowerPC intrinsic that takes two v4i32
0315 /// vectors and returns one. These intrinsics have no side effects.
0316 class PowerPC_Vec_WWW_Intrinsic<string GCCIntSuffix>
0317 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0318 [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0319 [IntrNoMem]>;
0320
0321 /// PowerPC_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2i64
0322 /// vectors and returns one. These intrinsics have no side effects.
0323 class PowerPC_Vec_DDD_Intrinsic<string GCCIntSuffix>
0324 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0325 [llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0326 [IntrNoMem]>;
0327
0328 /// PowerPC_Vec_QQQ_Intrinsic - A PowerPC intrinsic that takes two v1i128
0329 /// vectors and returns one. These intrinsics have no side effects.
0330 class PowerPC_Vec_QQQ_Intrinsic<string GCCIntSuffix>
0331 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0332 [llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
0333 [IntrNoMem]>;
0334
0335 /// PowerPC_Vec_QDD_Intrinsic - A PowerPC intrinsic that takes two v2i64
0336 /// vectors and returns one v1i128. These intrinsics have no side effects.
0337 class PowerPC_Vec_QDD_Intrinsic<string GCCIntSuffix>
0338 : PowerPC_Vec_Intrinsic<GCCIntSuffix,
0339 [llvm_v1i128_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0340 [IntrNoMem]>;
0341
0342 //===----------------------------------------------------------------------===//
0343 // PowerPC VSX Intrinsic Class Definitions.
0344 //
0345
0346 /// PowerPC_VSX_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2f64
0347 /// vectors and returns one. These intrinsics have no side effects.
0348 class PowerPC_VSX_Vec_DDD_Intrinsic<string GCCIntSuffix>
0349 : PowerPC_VSX_Intrinsic<GCCIntSuffix,
0350 [llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty],
0351 [IntrNoMem]>;
0352
0353 /// PowerPC_VSX_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32
0354 /// vectors and returns one. These intrinsics have no side effects.
0355 class PowerPC_VSX_Vec_FFF_Intrinsic<string GCCIntSuffix>
0356 : PowerPC_VSX_Intrinsic<GCCIntSuffix,
0357 [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
0358 [IntrNoMem]>;
0359
0360 /// PowerPC_VSX_Sca_DDD_Intrinsic - A PowerPC intrinsic that takes two f64
0361 /// scalars and returns one. These intrinsics have no side effects.
0362 class PowerPC_VSX_Sca_DDD_Intrinsic<string GCCIntSuffix>
0363 : PowerPC_VSX_Intrinsic<GCCIntSuffix,
0364 [llvm_double_ty], [llvm_double_ty, llvm_double_ty],
0365 [IntrNoMem]>;
0366
0367 //===----------------------------------------------------------------------===//
0368 // PowerPC Altivec Intrinsic Definitions.
0369
0370 let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.".
0371 // Data Stream Control.
0372 def int_ppc_altivec_dss : ClangBuiltin<"__builtin_altivec_dss">,
0373 Intrinsic<[], [llvm_i32_ty], []>;
0374 def int_ppc_altivec_dssall : ClangBuiltin<"__builtin_altivec_dssall">,
0375 Intrinsic<[], [], []>;
0376 def int_ppc_altivec_dst : ClangBuiltin<"__builtin_altivec_dst">,
0377 Intrinsic<[],
0378 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
0379 []>;
0380 def int_ppc_altivec_dstt : ClangBuiltin<"__builtin_altivec_dstt">,
0381 Intrinsic<[],
0382 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
0383 []>;
0384 def int_ppc_altivec_dstst : ClangBuiltin<"__builtin_altivec_dstst">,
0385 Intrinsic<[],
0386 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
0387 []>;
0388 def int_ppc_altivec_dststt : ClangBuiltin<"__builtin_altivec_dststt">,
0389 Intrinsic<[],
0390 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
0391 []>;
0392
0393 // VSCR access.
0394 def int_ppc_altivec_mfvscr : ClangBuiltin<"__builtin_altivec_mfvscr">,
0395 Intrinsic<[llvm_v8i16_ty], [], [IntrNoMem, IntrHasSideEffects]>;
0396 def int_ppc_altivec_mtvscr : ClangBuiltin<"__builtin_altivec_mtvscr">,
0397 Intrinsic<[], [llvm_v4i32_ty], [IntrNoMem, IntrHasSideEffects]>;
0398
0399
0400 // Loads. These don't map directly to GCC builtins because they represent the
0401 // source address with a single pointer.
0402 def int_ppc_altivec_lvx :
0403 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty],
0404 [IntrReadMem, IntrArgMemOnly]>;
0405 def int_ppc_altivec_lvxl :
0406 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty],
0407 [IntrReadMem, IntrArgMemOnly]>;
0408 def int_ppc_altivec_lvebx :
0409 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_ptr_ty],
0410 [IntrReadMem, IntrArgMemOnly]>;
0411 def int_ppc_altivec_lvehx :
0412 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_ptr_ty],
0413 [IntrReadMem, IntrArgMemOnly]>;
0414 def int_ppc_altivec_lvewx :
0415 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty],
0416 [IntrReadMem, IntrArgMemOnly]>;
0417
0418 // Stores. These don't map directly to GCC builtins because they represent the
0419 // source address with a single pointer.
0420 def int_ppc_altivec_stvx :
0421 DefaultAttrsIntrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
0422 [IntrWriteMem, IntrArgMemOnly]>;
0423 def int_ppc_altivec_stvxl :
0424 DefaultAttrsIntrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
0425 [IntrWriteMem, IntrArgMemOnly]>;
0426 def int_ppc_altivec_stvebx :
0427 DefaultAttrsIntrinsic<[], [llvm_v16i8_ty, llvm_ptr_ty],
0428 [IntrWriteMem, IntrArgMemOnly]>;
0429 def int_ppc_altivec_stvehx :
0430 DefaultAttrsIntrinsic<[], [llvm_v8i16_ty, llvm_ptr_ty],
0431 [IntrWriteMem, IntrArgMemOnly]>;
0432 def int_ppc_altivec_stvewx :
0433 DefaultAttrsIntrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
0434 [IntrWriteMem, IntrArgMemOnly]>;
0435
0436 // Comparisons setting a vector.
0437 def int_ppc_altivec_vcmpbfp : ClangBuiltin<"__builtin_altivec_vcmpbfp">,
0438 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
0439 [IntrNoMem]>;
0440 def int_ppc_altivec_vcmpeqfp : ClangBuiltin<"__builtin_altivec_vcmpeqfp">,
0441 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
0442 [IntrNoMem]>;
0443 def int_ppc_altivec_vcmpgefp : ClangBuiltin<"__builtin_altivec_vcmpgefp">,
0444 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
0445 [IntrNoMem]>;
0446 def int_ppc_altivec_vcmpgtfp : ClangBuiltin<"__builtin_altivec_vcmpgtfp">,
0447 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
0448 [IntrNoMem]>;
0449
0450 def int_ppc_altivec_vcmpequd : ClangBuiltin<"__builtin_altivec_vcmpequd">,
0451 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0452 [IntrNoMem]>;
0453 def int_ppc_altivec_vcmpgtsd : ClangBuiltin<"__builtin_altivec_vcmpgtsd">,
0454 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0455 [IntrNoMem]>;
0456 def int_ppc_altivec_vcmpgtud : ClangBuiltin<"__builtin_altivec_vcmpgtud">,
0457 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0458 [IntrNoMem]>;
0459
0460 def int_ppc_altivec_vcmpequw : ClangBuiltin<"__builtin_altivec_vcmpequw">,
0461 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0462 [IntrNoMem]>;
0463 def int_ppc_altivec_vcmpgtsw : ClangBuiltin<"__builtin_altivec_vcmpgtsw">,
0464 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0465 [IntrNoMem]>;
0466 def int_ppc_altivec_vcmpgtuw : ClangBuiltin<"__builtin_altivec_vcmpgtuw">,
0467 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0468 [IntrNoMem]>;
0469 def int_ppc_altivec_vcmpnew : ClangBuiltin<"__builtin_altivec_vcmpnew">,
0470 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0471 [IntrNoMem]>;
0472 def int_ppc_altivec_vcmpnezw : ClangBuiltin<"__builtin_altivec_vcmpnezw">,
0473 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0474 [IntrNoMem]>;
0475
0476 def int_ppc_altivec_vcmpequh : ClangBuiltin<"__builtin_altivec_vcmpequh">,
0477 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0478 [IntrNoMem]>;
0479 def int_ppc_altivec_vcmpgtsh : ClangBuiltin<"__builtin_altivec_vcmpgtsh">,
0480 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0481 [IntrNoMem]>;
0482 def int_ppc_altivec_vcmpgtuh : ClangBuiltin<"__builtin_altivec_vcmpgtuh">,
0483 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0484 [IntrNoMem]>;
0485 def int_ppc_altivec_vcmpneh : ClangBuiltin<"__builtin_altivec_vcmpneh">,
0486 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0487 [IntrNoMem]>;
0488 def int_ppc_altivec_vcmpnezh : ClangBuiltin<"__builtin_altivec_vcmpnezh">,
0489 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0490 [IntrNoMem]>;
0491
0492 def int_ppc_altivec_vcmpequb : ClangBuiltin<"__builtin_altivec_vcmpequb">,
0493 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0494 [IntrNoMem]>;
0495 def int_ppc_altivec_vcmpgtsb : ClangBuiltin<"__builtin_altivec_vcmpgtsb">,
0496 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0497 [IntrNoMem]>;
0498 def int_ppc_altivec_vcmpgtub : ClangBuiltin<"__builtin_altivec_vcmpgtub">,
0499 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0500 [IntrNoMem]>;
0501 def int_ppc_altivec_vcmpneb : ClangBuiltin<"__builtin_altivec_vcmpneb">,
0502 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0503 [IntrNoMem]>;
0504 def int_ppc_altivec_vcmpnezb : ClangBuiltin<"__builtin_altivec_vcmpnezb">,
0505 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0506 [IntrNoMem]>;
0507
0508 def int_ppc_altivec_vcmpequq : ClangBuiltin<"__builtin_altivec_vcmpequq">,
0509 DefaultAttrsIntrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
0510 [IntrNoMem]>;
0511 def int_ppc_altivec_vcmpgtsq : ClangBuiltin<"__builtin_altivec_vcmpgtsq">,
0512 DefaultAttrsIntrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
0513 [IntrNoMem]>;
0514 def int_ppc_altivec_vcmpgtuq : ClangBuiltin<"__builtin_altivec_vcmpgtuq">,
0515 DefaultAttrsIntrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty],
0516 [IntrNoMem]>;
0517 def int_ppc_altivec_vcmpequq_p : ClangBuiltin<"__builtin_altivec_vcmpequq_p">,
0518 DefaultAttrsIntrinsic<[llvm_i32_ty],
0519 [llvm_i32_ty,llvm_v1i128_ty,llvm_v1i128_ty],
0520 [IntrNoMem]>;
0521 def int_ppc_altivec_vcmpgtsq_p : ClangBuiltin<"__builtin_altivec_vcmpgtsq_p">,
0522 DefaultAttrsIntrinsic<[llvm_i32_ty],
0523 [llvm_i32_ty,llvm_v1i128_ty,llvm_v1i128_ty],
0524 [IntrNoMem]>;
0525 def int_ppc_altivec_vcmpgtuq_p : ClangBuiltin<"__builtin_altivec_vcmpgtuq_p">,
0526 DefaultAttrsIntrinsic<[llvm_i32_ty],
0527 [llvm_i32_ty,llvm_v1i128_ty,llvm_v1i128_ty],
0528 [IntrNoMem]>;
0529
0530 // Predicate Comparisons. The first operand specifies interpretation of CR6.
0531 def int_ppc_altivec_vcmpbfp_p : ClangBuiltin<"__builtin_altivec_vcmpbfp_p">,
0532 DefaultAttrsIntrinsic<[llvm_i32_ty],
0533 [llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
0534 [IntrNoMem]>;
0535 def int_ppc_altivec_vcmpeqfp_p : ClangBuiltin<"__builtin_altivec_vcmpeqfp_p">,
0536 DefaultAttrsIntrinsic<[llvm_i32_ty],
0537 [llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
0538 [IntrNoMem]>;
0539 def int_ppc_altivec_vcmpgefp_p : ClangBuiltin<"__builtin_altivec_vcmpgefp_p">,
0540 DefaultAttrsIntrinsic<[llvm_i32_ty],
0541 [llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
0542 [IntrNoMem]>;
0543 def int_ppc_altivec_vcmpgtfp_p : ClangBuiltin<"__builtin_altivec_vcmpgtfp_p">,
0544 DefaultAttrsIntrinsic<[llvm_i32_ty],
0545 [llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
0546 [IntrNoMem]>;
0547
0548 def int_ppc_altivec_vcmpequd_p : ClangBuiltin<"__builtin_altivec_vcmpequd_p">,
0549 DefaultAttrsIntrinsic<[llvm_i32_ty],
0550 [llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
0551 [IntrNoMem]>;
0552 def int_ppc_altivec_vcmpgtsd_p : ClangBuiltin<"__builtin_altivec_vcmpgtsd_p">,
0553 DefaultAttrsIntrinsic<[llvm_i32_ty],
0554 [llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
0555 [IntrNoMem]>;
0556 def int_ppc_altivec_vcmpgtud_p : ClangBuiltin<"__builtin_altivec_vcmpgtud_p">,
0557 DefaultAttrsIntrinsic<[llvm_i32_ty],
0558 [llvm_i32_ty,llvm_v2i64_ty,llvm_v2i64_ty],
0559 [IntrNoMem]>;
0560
0561 def int_ppc_altivec_vcmpequw_p : ClangBuiltin<"__builtin_altivec_vcmpequw_p">,
0562 DefaultAttrsIntrinsic<[llvm_i32_ty],
0563 [llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
0564 [IntrNoMem]>;
0565 def int_ppc_altivec_vcmpgtsw_p : ClangBuiltin<"__builtin_altivec_vcmpgtsw_p">,
0566 DefaultAttrsIntrinsic<[llvm_i32_ty],
0567 [llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
0568 [IntrNoMem]>;
0569 def int_ppc_altivec_vcmpgtuw_p : ClangBuiltin<"__builtin_altivec_vcmpgtuw_p">,
0570 DefaultAttrsIntrinsic<[llvm_i32_ty],
0571 [llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
0572 [IntrNoMem]>;
0573 def int_ppc_altivec_vcmpnew_p : ClangBuiltin<"__builtin_altivec_vcmpnew_p">,
0574 DefaultAttrsIntrinsic<[llvm_i32_ty],
0575 [llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
0576 [IntrNoMem]>;
0577 def int_ppc_altivec_vcmpnezw_p : ClangBuiltin<"__builtin_altivec_vcmpnezw_p">,
0578 DefaultAttrsIntrinsic<[llvm_i32_ty],
0579 [llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty],
0580 [IntrNoMem]>;
0581
0582 def int_ppc_altivec_vcmpequh_p : ClangBuiltin<"__builtin_altivec_vcmpequh_p">,
0583 DefaultAttrsIntrinsic<[llvm_i32_ty],
0584 [llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
0585 [IntrNoMem]>;
0586 def int_ppc_altivec_vcmpgtsh_p : ClangBuiltin<"__builtin_altivec_vcmpgtsh_p">,
0587 DefaultAttrsIntrinsic<[llvm_i32_ty],
0588 [llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
0589 [IntrNoMem]>;
0590 def int_ppc_altivec_vcmpgtuh_p : ClangBuiltin<"__builtin_altivec_vcmpgtuh_p">,
0591 DefaultAttrsIntrinsic<[llvm_i32_ty],
0592 [llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
0593 [IntrNoMem]>;
0594 def int_ppc_altivec_vcmpneh_p : ClangBuiltin<"__builtin_altivec_vcmpneh_p">,
0595 DefaultAttrsIntrinsic<[llvm_i32_ty],
0596 [llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
0597 [IntrNoMem]>;
0598 def int_ppc_altivec_vcmpnezh_p : ClangBuiltin<"__builtin_altivec_vcmpnezh_p">,
0599 DefaultAttrsIntrinsic<[llvm_i32_ty],
0600 [llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty],
0601 [IntrNoMem]>;
0602
0603 def int_ppc_altivec_vcmpequb_p : ClangBuiltin<"__builtin_altivec_vcmpequb_p">,
0604 DefaultAttrsIntrinsic<[llvm_i32_ty],
0605 [llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
0606 [IntrNoMem]>;
0607 def int_ppc_altivec_vcmpgtsb_p : ClangBuiltin<"__builtin_altivec_vcmpgtsb_p">,
0608 DefaultAttrsIntrinsic<[llvm_i32_ty],
0609 [llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
0610 [IntrNoMem]>;
0611 def int_ppc_altivec_vcmpgtub_p : ClangBuiltin<"__builtin_altivec_vcmpgtub_p">,
0612 DefaultAttrsIntrinsic<[llvm_i32_ty],
0613 [llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
0614 [IntrNoMem]>;
0615 def int_ppc_altivec_vcmpneb_p : ClangBuiltin<"__builtin_altivec_vcmpneb_p">,
0616 DefaultAttrsIntrinsic<[llvm_i32_ty],
0617 [llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
0618 [IntrNoMem]>;
0619 def int_ppc_altivec_vcmpnezb_p : ClangBuiltin<"__builtin_altivec_vcmpnezb_p">,
0620 DefaultAttrsIntrinsic<[llvm_i32_ty],
0621 [llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty],
0622 [IntrNoMem]>;
0623 def int_ppc_altivec_vclzlsbb : ClangBuiltin<"__builtin_altivec_vclzlsbb">,
0624 DefaultAttrsIntrinsic<[llvm_i32_ty],[llvm_v16i8_ty],[IntrNoMem]>;
0625 def int_ppc_altivec_vctzlsbb : ClangBuiltin<"__builtin_altivec_vctzlsbb">,
0626 DefaultAttrsIntrinsic<[llvm_i32_ty],[llvm_v16i8_ty],[IntrNoMem]>;
0627 def int_ppc_altivec_vprtybw : ClangBuiltin<"__builtin_altivec_vprtybw">,
0628 DefaultAttrsIntrinsic<[llvm_v4i32_ty],[llvm_v4i32_ty],[IntrNoMem]>;
0629 def int_ppc_altivec_vprtybd : ClangBuiltin<"__builtin_altivec_vprtybd">,
0630 DefaultAttrsIntrinsic<[llvm_v2i64_ty],[llvm_v2i64_ty],[IntrNoMem]>;
0631 def int_ppc_altivec_vprtybq : ClangBuiltin<"__builtin_altivec_vprtybq">,
0632 DefaultAttrsIntrinsic<[llvm_v1i128_ty],[llvm_v1i128_ty],[IntrNoMem]>;
0633
0634 // BCD intrinsics.
0635 def int_ppc_cdtbcdd : ClangBuiltin<"__builtin_ppc_cdtbcd">,
0636 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem]>;
0637 def int_ppc_cbcdtdd: ClangBuiltin<"__builtin_ppc_cbcdtd">,
0638 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem]>;
0639 def int_ppc_addg6sd: ClangBuiltin<"__builtin_ppc_addg6s">,
0640 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
0641 def int_ppc_cdtbcd : ClangBuiltin<"__builtin_cdtbcd">,
0642 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
0643 def int_ppc_cbcdtd: ClangBuiltin<"__builtin_cbcdtd">,
0644 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
0645 def int_ppc_addg6s: ClangBuiltin<"__builtin_addg6s">,
0646 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
0647
0648 def int_ppc_bcdadd : ClangBuiltin<"__builtin_ppc_bcdadd">,
0649 DefaultAttrsIntrinsic<
0650 [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
0651 [IntrNoMem, ImmArg<ArgIndex<2>>]>;
0652 def int_ppc_bcdadd_p : ClangBuiltin<"__builtin_ppc_bcdadd_p">,
0653 DefaultAttrsIntrinsic<
0654 [llvm_i32_ty], [llvm_i32_ty, llvm_v16i8_ty, llvm_v16i8_ty],
0655 [IntrNoMem, ImmArg<ArgIndex<0>>]>;
0656 def int_ppc_bcdsub : ClangBuiltin<"__builtin_ppc_bcdsub">,
0657 DefaultAttrsIntrinsic<
0658 [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
0659 [IntrNoMem, ImmArg<ArgIndex<2>>]>;
0660 def int_ppc_bcdsub_p : ClangBuiltin<"__builtin_ppc_bcdsub_p">,
0661 DefaultAttrsIntrinsic<
0662 [llvm_i32_ty], [llvm_i32_ty, llvm_v16i8_ty, llvm_v16i8_ty],
0663 [IntrNoMem, ImmArg<ArgIndex<0>>]>;
0664
0665 // P10 Vector Extract with Mask
0666 def int_ppc_altivec_vextractbm : ClangBuiltin<"__builtin_altivec_vextractbm">,
0667 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
0668 def int_ppc_altivec_vextracthm : ClangBuiltin<"__builtin_altivec_vextracthm">,
0669 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
0670 def int_ppc_altivec_vextractwm : ClangBuiltin<"__builtin_altivec_vextractwm">,
0671 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
0672 def int_ppc_altivec_vextractdm : ClangBuiltin<"__builtin_altivec_vextractdm">,
0673 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_v2i64_ty], [IntrNoMem]>;
0674 def int_ppc_altivec_vextractqm : ClangBuiltin<"__builtin_altivec_vextractqm">,
0675 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_v1i128_ty], [IntrNoMem]>;
0676
0677 // P10 Vector Expand with Mask
0678 def int_ppc_altivec_vexpandbm : ClangBuiltin<"__builtin_altivec_vexpandbm">,
0679 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
0680 def int_ppc_altivec_vexpandhm : ClangBuiltin<"__builtin_altivec_vexpandhm">,
0681 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
0682 def int_ppc_altivec_vexpandwm : ClangBuiltin<"__builtin_altivec_vexpandwm">,
0683 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty], [IntrNoMem]>;
0684 def int_ppc_altivec_vexpanddm : ClangBuiltin<"__builtin_altivec_vexpanddm">,
0685 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
0686 def int_ppc_altivec_vexpandqm : ClangBuiltin<"__builtin_altivec_vexpandqm">,
0687 DefaultAttrsIntrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty], [IntrNoMem]>;
0688
0689 // P10 Vector Count with Mask intrinsics.
0690 def int_ppc_altivec_vcntmbb : ClangBuiltin<"__builtin_altivec_vcntmbb">,
0691 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_v16i8_ty, llvm_i32_ty],
0692 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
0693 def int_ppc_altivec_vcntmbh : ClangBuiltin<"__builtin_altivec_vcntmbh">,
0694 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_v8i16_ty, llvm_i32_ty],
0695 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
0696 def int_ppc_altivec_vcntmbw : ClangBuiltin<"__builtin_altivec_vcntmbw">,
0697 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_v4i32_ty, llvm_i32_ty],
0698 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
0699 def int_ppc_altivec_vcntmbd : ClangBuiltin<"__builtin_altivec_vcntmbd">,
0700 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_v2i64_ty, llvm_i32_ty],
0701 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
0702
0703 // P10 Move to VSR with Mask Intrinsics.
0704 def int_ppc_altivec_mtvsrbm : ClangBuiltin<"__builtin_altivec_mtvsrbm">,
0705 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_i64_ty], [IntrNoMem]>;
0706 def int_ppc_altivec_mtvsrhm : ClangBuiltin<"__builtin_altivec_mtvsrhm">,
0707 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_i64_ty], [IntrNoMem]>;
0708 def int_ppc_altivec_mtvsrwm : ClangBuiltin<"__builtin_altivec_mtvsrwm">,
0709 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_i64_ty], [IntrNoMem]>;
0710 def int_ppc_altivec_mtvsrdm : ClangBuiltin<"__builtin_altivec_mtvsrdm">,
0711 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_i64_ty], [IntrNoMem]>;
0712 def int_ppc_altivec_mtvsrqm : ClangBuiltin<"__builtin_altivec_mtvsrqm">,
0713 DefaultAttrsIntrinsic<[llvm_v1i128_ty], [llvm_i64_ty], [IntrNoMem]>;
0714
0715 // P10 Vector Parallel Bits Deposit/Extract Doubleword Builtins.
0716 def int_ppc_altivec_vpdepd : ClangBuiltin<"__builtin_altivec_vpdepd">,
0717 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0718 [IntrNoMem]>;
0719 def int_ppc_altivec_vpextd : ClangBuiltin<"__builtin_altivec_vpextd">,
0720 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0721 [IntrNoMem]>;
0722
0723 // P10 Vector String Isolate Intrinsics.
0724 def int_ppc_altivec_vstribr : ClangBuiltin<"__builtin_altivec_vstribr">,
0725 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
0726 def int_ppc_altivec_vstribl : ClangBuiltin<"__builtin_altivec_vstribl">,
0727 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
0728 def int_ppc_altivec_vstrihr : ClangBuiltin<"__builtin_altivec_vstrihr">,
0729 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
0730 def int_ppc_altivec_vstrihl : ClangBuiltin<"__builtin_altivec_vstrihl">,
0731 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty], [IntrNoMem]>;
0732 // Predicate Intrinsics: The first operand specifies interpretation of CR6.
0733 def int_ppc_altivec_vstribr_p : ClangBuiltin<"__builtin_altivec_vstribr_p">,
0734 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v16i8_ty],
0735 [IntrNoMem]>;
0736 def int_ppc_altivec_vstribl_p : ClangBuiltin<"__builtin_altivec_vstribl_p">,
0737 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v16i8_ty],
0738 [IntrNoMem]>;
0739 def int_ppc_altivec_vstrihr_p : ClangBuiltin<"__builtin_altivec_vstrihr_p">,
0740 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v8i16_ty],
0741 [IntrNoMem]>;
0742 def int_ppc_altivec_vstrihl_p : ClangBuiltin<"__builtin_altivec_vstrihl_p">,
0743 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_v8i16_ty],
0744 [IntrNoMem]>;
0745
0746 // P10 Vector Centrifuge Builtin.
0747 def int_ppc_altivec_vcfuged : ClangBuiltin<"__builtin_altivec_vcfuged">,
0748 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
0749 [IntrNoMem]>;
0750
0751 // P10 Vector Gather Every Nth Bit Builtin.
0752 def int_ppc_altivec_vgnb : ClangBuiltin<"__builtin_altivec_vgnb">,
0753 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_v1i128_ty, llvm_i32_ty],
0754 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
0755
0756 // P10 Vector Clear Bytes
0757 def int_ppc_altivec_vclrlb : ClangBuiltin<"__builtin_altivec_vclrlb">,
0758 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty],
0759 [IntrNoMem]>;
0760 def int_ppc_altivec_vclrrb : ClangBuiltin<"__builtin_altivec_vclrrb">,
0761 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty],
0762 [IntrNoMem]>;
0763
0764 // P10 Vector Shift Double Bit Immediate.
0765 def int_ppc_altivec_vsldbi : ClangBuiltin<"__builtin_altivec_vsldbi">,
0766 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
0767 [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
0768 [IntrNoMem, ImmArg<ArgIndex<2>>]>;
0769 def int_ppc_altivec_vsrdbi : ClangBuiltin<"__builtin_altivec_vsrdbi">,
0770 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
0771 [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
0772 [IntrNoMem, ImmArg<ArgIndex<2>>]>;
0773
0774 // P10 Vector Insert.
0775 def int_ppc_altivec_vinsblx : ClangBuiltin<"__builtin_altivec_vinsblx">,
0776 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
0777 [llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty],
0778 [IntrNoMem]>;
0779 def int_ppc_altivec_vinsbrx : ClangBuiltin<"__builtin_altivec_vinsbrx">,
0780 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
0781 [llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty],
0782 [IntrNoMem]>;
0783 def int_ppc_altivec_vinshlx : ClangBuiltin<"__builtin_altivec_vinshlx">,
0784 DefaultAttrsIntrinsic<[llvm_v8i16_ty],
0785 [llvm_v8i16_ty, llvm_i32_ty, llvm_i32_ty],
0786 [IntrNoMem]>;
0787 def int_ppc_altivec_vinshrx : ClangBuiltin<"__builtin_altivec_vinshrx">,
0788 DefaultAttrsIntrinsic<[llvm_v8i16_ty],
0789 [llvm_v8i16_ty, llvm_i32_ty, llvm_i32_ty],
0790 [IntrNoMem]>;
0791 def int_ppc_altivec_vinswlx : ClangBuiltin<"__builtin_altivec_vinswlx">,
0792 DefaultAttrsIntrinsic<[llvm_v4i32_ty],
0793 [llvm_v4i32_ty, llvm_i32_ty, llvm_i32_ty],
0794 [IntrNoMem]>;
0795 def int_ppc_altivec_vinswrx : ClangBuiltin<"__builtin_altivec_vinswrx">,
0796 DefaultAttrsIntrinsic<[llvm_v4i32_ty],
0797 [llvm_v4i32_ty, llvm_i32_ty, llvm_i32_ty],
0798 [IntrNoMem]>;
0799 def int_ppc_altivec_vinsdlx : ClangBuiltin<"__builtin_altivec_vinsdlx">,
0800 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0801 [llvm_v2i64_ty, llvm_i64_ty, llvm_i64_ty],
0802 [IntrNoMem]>;
0803 def int_ppc_altivec_vinsdrx : ClangBuiltin<"__builtin_altivec_vinsdrx">,
0804 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0805 [llvm_v2i64_ty, llvm_i64_ty, llvm_i64_ty],
0806 [IntrNoMem]>;
0807 def int_ppc_altivec_vinsbvlx : ClangBuiltin<"__builtin_altivec_vinsbvlx">,
0808 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
0809 [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty],
0810 [IntrNoMem]>;
0811 def int_ppc_altivec_vinsbvrx : ClangBuiltin<"__builtin_altivec_vinsbvrx">,
0812 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
0813 [llvm_v16i8_ty, llvm_i32_ty, llvm_v16i8_ty],
0814 [IntrNoMem]>;
0815 def int_ppc_altivec_vinshvlx : ClangBuiltin<"__builtin_altivec_vinshvlx">,
0816 DefaultAttrsIntrinsic<[llvm_v8i16_ty],
0817 [llvm_v8i16_ty, llvm_i32_ty, llvm_v8i16_ty],
0818 [IntrNoMem]>;
0819 def int_ppc_altivec_vinshvrx : ClangBuiltin<"__builtin_altivec_vinshvrx">,
0820 DefaultAttrsIntrinsic<[llvm_v8i16_ty],
0821 [llvm_v8i16_ty, llvm_i32_ty, llvm_v8i16_ty],
0822 [IntrNoMem]>;
0823 def int_ppc_altivec_vinswvlx : ClangBuiltin<"__builtin_altivec_vinswvlx">,
0824 DefaultAttrsIntrinsic<[llvm_v4i32_ty],
0825 [llvm_v4i32_ty, llvm_i32_ty, llvm_v4i32_ty],
0826 [IntrNoMem]>;
0827 def int_ppc_altivec_vinswvrx : ClangBuiltin<"__builtin_altivec_vinswvrx">,
0828 DefaultAttrsIntrinsic<[llvm_v4i32_ty],
0829 [llvm_v4i32_ty, llvm_i32_ty, llvm_v4i32_ty],
0830 [IntrNoMem]>;
0831 // P10 Vector Insert with immediate.
0832 def int_ppc_altivec_vinsw :
0833 DefaultAttrsIntrinsic<[llvm_v4i32_ty],
0834 [llvm_v4i32_ty, llvm_i32_ty, llvm_i32_ty],
0835 [IntrNoMem, ImmArg<ArgIndex<2>>]>;
0836 def int_ppc_altivec_vinsd :
0837 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0838 [llvm_v2i64_ty, llvm_i64_ty, llvm_i32_ty],
0839 [IntrNoMem, ImmArg<ArgIndex<2>>]>;
0840 // P10 Vector Extract.
0841 def int_ppc_altivec_vextdubvlx : ClangBuiltin<"__builtin_altivec_vextdubvlx">,
0842 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0843 [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
0844 [IntrNoMem]>;
0845 def int_ppc_altivec_vextdubvrx : ClangBuiltin<"__builtin_altivec_vextdubvrx">,
0846 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0847 [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
0848 [IntrNoMem]>;
0849 def int_ppc_altivec_vextduhvlx : ClangBuiltin<"__builtin_altivec_vextduhvlx">,
0850 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0851 [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty],
0852 [IntrNoMem]>;
0853 def int_ppc_altivec_vextduhvrx : ClangBuiltin<"__builtin_altivec_vextduhvrx">,
0854 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0855 [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty],
0856 [IntrNoMem]>;
0857 def int_ppc_altivec_vextduwvlx : ClangBuiltin<"__builtin_altivec_vextduwvlx">,
0858 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0859 [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty],
0860 [IntrNoMem]>;
0861 def int_ppc_altivec_vextduwvrx : ClangBuiltin<"__builtin_altivec_vextduwvrx">,
0862 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0863 [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty],
0864 [IntrNoMem]>;
0865 def int_ppc_altivec_vextddvlx : ClangBuiltin<"__builtin_altivec_vextddvlx">,
0866 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0867 [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty],
0868 [IntrNoMem]>;
0869 def int_ppc_altivec_vextddvrx : ClangBuiltin<"__builtin_altivec_vextddvrx">,
0870 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
0871 [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty],
0872 [IntrNoMem]>;
0873 }
0874
0875 // Vector average.
0876 def int_ppc_altivec_vavgsb : PowerPC_Vec_BBB_Intrinsic<"vavgsb">;
0877 def int_ppc_altivec_vavgsh : PowerPC_Vec_HHH_Intrinsic<"vavgsh">;
0878 def int_ppc_altivec_vavgsw : PowerPC_Vec_WWW_Intrinsic<"vavgsw">;
0879 def int_ppc_altivec_vavgub : PowerPC_Vec_BBB_Intrinsic<"vavgub">;
0880 def int_ppc_altivec_vavguh : PowerPC_Vec_HHH_Intrinsic<"vavguh">;
0881 def int_ppc_altivec_vavguw : PowerPC_Vec_WWW_Intrinsic<"vavguw">;
0882
0883 // Vector maximum.
0884 def int_ppc_altivec_vmaxfp : PowerPC_Vec_FFF_Intrinsic<"vmaxfp">;
0885 def int_ppc_altivec_vmaxsb : PowerPC_Vec_BBB_Intrinsic<"vmaxsb">;
0886 def int_ppc_altivec_vmaxsh : PowerPC_Vec_HHH_Intrinsic<"vmaxsh">;
0887 def int_ppc_altivec_vmaxsw : PowerPC_Vec_WWW_Intrinsic<"vmaxsw">;
0888 def int_ppc_altivec_vmaxsd : PowerPC_Vec_DDD_Intrinsic<"vmaxsd">;
0889 def int_ppc_altivec_vmaxub : PowerPC_Vec_BBB_Intrinsic<"vmaxub">;
0890 def int_ppc_altivec_vmaxuh : PowerPC_Vec_HHH_Intrinsic<"vmaxuh">;
0891 def int_ppc_altivec_vmaxuw : PowerPC_Vec_WWW_Intrinsic<"vmaxuw">;
0892 def int_ppc_altivec_vmaxud : PowerPC_Vec_DDD_Intrinsic<"vmaxud">;
0893
0894 // Vector minimum.
0895 def int_ppc_altivec_vminfp : PowerPC_Vec_FFF_Intrinsic<"vminfp">;
0896 def int_ppc_altivec_vminsb : PowerPC_Vec_BBB_Intrinsic<"vminsb">;
0897 def int_ppc_altivec_vminsh : PowerPC_Vec_HHH_Intrinsic<"vminsh">;
0898 def int_ppc_altivec_vminsw : PowerPC_Vec_WWW_Intrinsic<"vminsw">;
0899 def int_ppc_altivec_vminsd : PowerPC_Vec_DDD_Intrinsic<"vminsd">;
0900 def int_ppc_altivec_vminub : PowerPC_Vec_BBB_Intrinsic<"vminub">;
0901 def int_ppc_altivec_vminuh : PowerPC_Vec_HHH_Intrinsic<"vminuh">;
0902 def int_ppc_altivec_vminuw : PowerPC_Vec_WWW_Intrinsic<"vminuw">;
0903 def int_ppc_altivec_vminud : PowerPC_Vec_DDD_Intrinsic<"vminud">;
0904
0905 // Saturating adds.
0906 def int_ppc_altivec_vaddubs : PowerPC_Vec_BBB_Intrinsic<"vaddubs">;
0907 def int_ppc_altivec_vaddsbs : PowerPC_Vec_BBB_Intrinsic<"vaddsbs">;
0908 def int_ppc_altivec_vadduhs : PowerPC_Vec_HHH_Intrinsic<"vadduhs">;
0909 def int_ppc_altivec_vaddshs : PowerPC_Vec_HHH_Intrinsic<"vaddshs">;
0910 def int_ppc_altivec_vadduws : PowerPC_Vec_WWW_Intrinsic<"vadduws">;
0911 def int_ppc_altivec_vaddsws : PowerPC_Vec_WWW_Intrinsic<"vaddsws">;
0912 def int_ppc_altivec_vaddcuw : PowerPC_Vec_WWW_Intrinsic<"vaddcuw">;
0913 def int_ppc_altivec_vaddcuq : PowerPC_Vec_QQQ_Intrinsic<"vaddcuq">;
0914
0915 // Saturating subs.
0916 def int_ppc_altivec_vsububs : PowerPC_Vec_BBB_Intrinsic<"vsububs">;
0917 def int_ppc_altivec_vsubsbs : PowerPC_Vec_BBB_Intrinsic<"vsubsbs">;
0918 def int_ppc_altivec_vsubuhs : PowerPC_Vec_HHH_Intrinsic<"vsubuhs">;
0919 def int_ppc_altivec_vsubshs : PowerPC_Vec_HHH_Intrinsic<"vsubshs">;
0920 def int_ppc_altivec_vsubuws : PowerPC_Vec_WWW_Intrinsic<"vsubuws">;
0921 def int_ppc_altivec_vsubsws : PowerPC_Vec_WWW_Intrinsic<"vsubsws">;
0922 def int_ppc_altivec_vsubcuw : PowerPC_Vec_WWW_Intrinsic<"vsubcuw">;
0923 def int_ppc_altivec_vsubcuq : PowerPC_Vec_QQQ_Intrinsic<"vsubcuq">;
0924
0925 let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.".
0926 // Saturating multiply-adds.
0927 def int_ppc_altivec_vmhaddshs : ClangBuiltin<"__builtin_altivec_vmhaddshs">,
0928 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
0929 llvm_v8i16_ty, llvm_v8i16_ty],
0930 [IntrNoMem, IntrHasSideEffects]>;
0931 def int_ppc_altivec_vmhraddshs : ClangBuiltin<"__builtin_altivec_vmhraddshs">,
0932 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty,
0933 llvm_v8i16_ty, llvm_v8i16_ty],
0934 [IntrNoMem, IntrHasSideEffects]>;
0935
0936 def int_ppc_altivec_vmaddfp : ClangBuiltin<"__builtin_altivec_vmaddfp">,
0937 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
0938 llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
0939 def int_ppc_altivec_vnmsubfp : ClangBuiltin<"__builtin_altivec_vnmsubfp">,
0940 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty,
0941 llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
0942
0943 // Vector Multiply Sum Instructions.
0944 def int_ppc_altivec_vmsummbm : ClangBuiltin<"__builtin_altivec_vmsummbm">,
0945 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
0946 llvm_v4i32_ty], [IntrNoMem]>;
0947 def int_ppc_altivec_vmsumshm : ClangBuiltin<"__builtin_altivec_vmsumshm">,
0948 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
0949 llvm_v4i32_ty], [IntrNoMem]>;
0950 def int_ppc_altivec_vmsumshs : ClangBuiltin<"__builtin_altivec_vmsumshs">,
0951 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
0952 llvm_v4i32_ty], [IntrNoMem, IntrHasSideEffects]>;
0953 def int_ppc_altivec_vmsumubm : ClangBuiltin<"__builtin_altivec_vmsumubm">,
0954 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
0955 llvm_v4i32_ty], [IntrNoMem]>;
0956 def int_ppc_altivec_vmsumuhm : ClangBuiltin<"__builtin_altivec_vmsumuhm">,
0957 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
0958 llvm_v4i32_ty], [IntrNoMem]>;
0959 def int_ppc_altivec_vmsumudm : ClangBuiltin<"__builtin_altivec_vmsumudm">,
0960 DefaultAttrsIntrinsic<[llvm_v1i128_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
0961 llvm_v1i128_ty], [IntrNoMem]>;
0962 def int_ppc_altivec_vmsumuhs : ClangBuiltin<"__builtin_altivec_vmsumuhs">,
0963 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
0964 llvm_v4i32_ty], [IntrNoMem, IntrHasSideEffects]>;
0965 def int_ppc_altivec_vmsumcud : ClangBuiltin<"__builtin_altivec_vmsumcud">,
0966 DefaultAttrsIntrinsic<[llvm_v1i128_ty],
0967 [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v1i128_ty],
0968 [IntrNoMem]>;
0969
0970 // Vector Multiply Instructions.
0971 def int_ppc_altivec_vmulesb : ClangBuiltin<"__builtin_altivec_vmulesb">,
0972 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0973 [IntrNoMem]>;
0974 def int_ppc_altivec_vmulesh : ClangBuiltin<"__builtin_altivec_vmulesh">,
0975 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0976 [IntrNoMem]>;
0977 def int_ppc_altivec_vmulesw : ClangBuiltin<"__builtin_altivec_vmulesw">,
0978 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0979 [IntrNoMem]>;
0980 def int_ppc_altivec_vmulesd : PowerPC_Vec_QDD_Intrinsic<"vmulesd">;
0981 def int_ppc_altivec_vmuleub : ClangBuiltin<"__builtin_altivec_vmuleub">,
0982 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0983 [IntrNoMem]>;
0984 def int_ppc_altivec_vmuleuh : ClangBuiltin<"__builtin_altivec_vmuleuh">,
0985 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0986 [IntrNoMem]>;
0987 def int_ppc_altivec_vmuleuw : ClangBuiltin<"__builtin_altivec_vmuleuw">,
0988 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
0989 [IntrNoMem]>;
0990 def int_ppc_altivec_vmuleud : PowerPC_Vec_QDD_Intrinsic<"vmuleud">;
0991
0992 def int_ppc_altivec_vmulosb : ClangBuiltin<"__builtin_altivec_vmulosb">,
0993 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
0994 [IntrNoMem]>;
0995 def int_ppc_altivec_vmulosh : ClangBuiltin<"__builtin_altivec_vmulosh">,
0996 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
0997 [IntrNoMem]>;
0998 def int_ppc_altivec_vmulosw : ClangBuiltin<"__builtin_altivec_vmulosw">,
0999 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1000 [IntrNoMem]>;
1001 def int_ppc_altivec_vmulosd : PowerPC_Vec_QDD_Intrinsic<"vmulosd">;
1002 def int_ppc_altivec_vmuloub : ClangBuiltin<"__builtin_altivec_vmuloub">,
1003 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
1004 [IntrNoMem]>;
1005 def int_ppc_altivec_vmulouh : ClangBuiltin<"__builtin_altivec_vmulouh">,
1006 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
1007 [IntrNoMem]>;
1008 def int_ppc_altivec_vmulouw : ClangBuiltin<"__builtin_altivec_vmulouw">,
1009 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1010 [IntrNoMem]>;
1011 def int_ppc_altivec_vmuloud : PowerPC_Vec_QDD_Intrinsic<"vmuloud">;
1012
1013 // Vector Sum Instructions.
1014 def int_ppc_altivec_vsumsws : ClangBuiltin<"__builtin_altivec_vsumsws">,
1015 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1016 [IntrNoMem, IntrHasSideEffects]>;
1017 def int_ppc_altivec_vsum2sws : ClangBuiltin<"__builtin_altivec_vsum2sws">,
1018 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1019 [IntrNoMem, IntrHasSideEffects]>;
1020 def int_ppc_altivec_vsum4sbs : ClangBuiltin<"__builtin_altivec_vsum4sbs">,
1021 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
1022 [IntrNoMem, IntrHasSideEffects]>;
1023 def int_ppc_altivec_vsum4shs : ClangBuiltin<"__builtin_altivec_vsum4shs">,
1024 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v4i32_ty],
1025 [IntrNoMem, IntrHasSideEffects]>;
1026 def int_ppc_altivec_vsum4ubs : ClangBuiltin<"__builtin_altivec_vsum4ubs">,
1027 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty],
1028 [IntrNoMem, IntrHasSideEffects]>;
1029
1030 // Vector Sign Extension Instructions
1031 def int_ppc_altivec_vextsb2w : ClangBuiltin<"__builtin_altivec_vextsb2w">,
1032 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1033 def int_ppc_altivec_vextsb2d : ClangBuiltin<"__builtin_altivec_vextsb2d">,
1034 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1035 def int_ppc_altivec_vextsh2w : ClangBuiltin<"__builtin_altivec_vextsh2w">,
1036 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1037 def int_ppc_altivec_vextsh2d : ClangBuiltin<"__builtin_altivec_vextsh2d">,
1038 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1039 def int_ppc_altivec_vextsw2d : ClangBuiltin<"__builtin_altivec_vextsw2d">,
1040 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
1041 def int_ppc_altivec_vextsd2q : ClangBuiltin<"__builtin_altivec_vextsd2q">,
1042 DefaultAttrsIntrinsic<[llvm_v1i128_ty], [llvm_v2i64_ty], [IntrNoMem]>;
1043
1044 // Other multiplies.
1045 def int_ppc_altivec_vmladduhm : ClangBuiltin<"__builtin_altivec_vmladduhm">,
1046 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
1047 llvm_v8i16_ty], [IntrNoMem]>;
1048
1049 // Packs.
1050 def int_ppc_altivec_vpkpx : ClangBuiltin<"__builtin_altivec_vpkpx">,
1051 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1052 [IntrNoMem]>;
1053 def int_ppc_altivec_vpkshss : ClangBuiltin<"__builtin_altivec_vpkshss">,
1054 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
1055 [IntrNoMem, IntrHasSideEffects]>;
1056 def int_ppc_altivec_vpkshus : ClangBuiltin<"__builtin_altivec_vpkshus">,
1057 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
1058 [IntrNoMem, IntrHasSideEffects]>;
1059 def int_ppc_altivec_vpkswss : ClangBuiltin<"__builtin_altivec_vpkswss">,
1060 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1061 [IntrNoMem, IntrHasSideEffects]>;
1062 def int_ppc_altivec_vpkswus : ClangBuiltin<"__builtin_altivec_vpkswus">,
1063 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1064 [IntrNoMem, IntrHasSideEffects]>;
1065 def int_ppc_altivec_vpksdss : ClangBuiltin<"__builtin_altivec_vpksdss">,
1066 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1067 [IntrNoMem, IntrHasSideEffects]>;
1068 def int_ppc_altivec_vpksdus : ClangBuiltin<"__builtin_altivec_vpksdus">,
1069 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1070 [IntrNoMem, IntrHasSideEffects]>;
1071 // vpkuhum is lowered to a shuffle.
1072 def int_ppc_altivec_vpkuhus : ClangBuiltin<"__builtin_altivec_vpkuhus">,
1073 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
1074 [IntrNoMem, IntrHasSideEffects]>;
1075 // vpkuwum is lowered to a shuffle.
1076 def int_ppc_altivec_vpkuwus : ClangBuiltin<"__builtin_altivec_vpkuwus">,
1077 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
1078 [IntrNoMem, IntrHasSideEffects]>;
1079 // vpkudum is lowered to a shuffle.
1080 def int_ppc_altivec_vpkudus : ClangBuiltin<"__builtin_altivec_vpkudus">,
1081 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1082 [IntrNoMem, IntrHasSideEffects]>;
1083
1084 // Unpacks.
1085 def int_ppc_altivec_vupkhpx : ClangBuiltin<"__builtin_altivec_vupkhpx">,
1086 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1087 def int_ppc_altivec_vupkhsb : ClangBuiltin<"__builtin_altivec_vupkhsb">,
1088 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1089 def int_ppc_altivec_vupkhsh : ClangBuiltin<"__builtin_altivec_vupkhsh">,
1090 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1091 def int_ppc_altivec_vupkhsw : ClangBuiltin<"__builtin_altivec_vupkhsw">,
1092 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
1093 def int_ppc_altivec_vupklpx : ClangBuiltin<"__builtin_altivec_vupklpx">,
1094 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1095 def int_ppc_altivec_vupklsb : ClangBuiltin<"__builtin_altivec_vupklsb">,
1096 DefaultAttrsIntrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1097 def int_ppc_altivec_vupklsh : ClangBuiltin<"__builtin_altivec_vupklsh">,
1098 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>;
1099 def int_ppc_altivec_vupklsw : ClangBuiltin<"__builtin_altivec_vupklsw">,
1100 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v4i32_ty], [IntrNoMem]>;
1101
1102
1103 // FP <-> integer conversion.
1104 def int_ppc_altivec_vcfsx : ClangBuiltin<"__builtin_altivec_vcfsx">,
1105 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
1106 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1107 def int_ppc_altivec_vcfux : ClangBuiltin<"__builtin_altivec_vcfux">,
1108 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty],
1109 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1110 def int_ppc_altivec_vctsxs : ClangBuiltin<"__builtin_altivec_vctsxs">,
1111 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
1112 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1113 def int_ppc_altivec_vctuxs : ClangBuiltin<"__builtin_altivec_vctuxs">,
1114 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty],
1115 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1116
1117 def int_ppc_altivec_vrfim : ClangBuiltin<"__builtin_altivec_vrfim">,
1118 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1119 def int_ppc_altivec_vrfin : ClangBuiltin<"__builtin_altivec_vrfin">,
1120 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1121 def int_ppc_altivec_vrfip : ClangBuiltin<"__builtin_altivec_vrfip">,
1122 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1123 def int_ppc_altivec_vrfiz : ClangBuiltin<"__builtin_altivec_vrfiz">,
1124 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1125
1126 // Add Extended Quadword
1127 def int_ppc_altivec_vaddeuqm : ClangBuiltin<"__builtin_altivec_vaddeuqm">,
1128 DefaultAttrsIntrinsic<[llvm_v1i128_ty],
1129 [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
1130 [IntrNoMem]>;
1131 def int_ppc_altivec_vaddecuq : ClangBuiltin<"__builtin_altivec_vaddecuq">,
1132 DefaultAttrsIntrinsic<[llvm_v1i128_ty],
1133 [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
1134 [IntrNoMem]>;
1135
1136 // Sub Extended Quadword
1137 def int_ppc_altivec_vsubeuqm : ClangBuiltin<"__builtin_altivec_vsubeuqm">,
1138 DefaultAttrsIntrinsic<[llvm_v1i128_ty],
1139 [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
1140 [IntrNoMem]>;
1141 def int_ppc_altivec_vsubecuq : ClangBuiltin<"__builtin_altivec_vsubecuq">,
1142 DefaultAttrsIntrinsic<[llvm_v1i128_ty],
1143 [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
1144 [IntrNoMem]>;
1145
1146 // P10 Vector Count Leading / Trailing Zeroes under bit Mask Builtins.
1147 def int_ppc_altivec_vclzdm : ClangBuiltin<"__builtin_altivec_vclzdm">,
1148 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1149 [IntrNoMem]>;
1150 def int_ppc_altivec_vctzdm : ClangBuiltin<"__builtin_altivec_vctzdm">,
1151 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
1152 [IntrNoMem]>;
1153 }
1154
1155 def int_ppc_altivec_vsl : PowerPC_Vec_WWW_Intrinsic<"vsl">;
1156 def int_ppc_altivec_vslo : PowerPC_Vec_WWW_Intrinsic<"vslo">;
1157
1158 def int_ppc_altivec_vslb : PowerPC_Vec_BBB_Intrinsic<"vslb">;
1159 def int_ppc_altivec_vslv : PowerPC_Vec_BBB_Intrinsic<"vslv">;
1160 def int_ppc_altivec_vsrv : PowerPC_Vec_BBB_Intrinsic<"vsrv">;
1161 def int_ppc_altivec_vslh : PowerPC_Vec_HHH_Intrinsic<"vslh">;
1162 def int_ppc_altivec_vslw : PowerPC_Vec_WWW_Intrinsic<"vslw">;
1163
1164 // Right Shifts.
1165 def int_ppc_altivec_vsr : PowerPC_Vec_WWW_Intrinsic<"vsr">;
1166 def int_ppc_altivec_vsro : PowerPC_Vec_WWW_Intrinsic<"vsro">;
1167
1168 def int_ppc_altivec_vsrb : PowerPC_Vec_BBB_Intrinsic<"vsrb">;
1169 def int_ppc_altivec_vsrh : PowerPC_Vec_HHH_Intrinsic<"vsrh">;
1170 def int_ppc_altivec_vsrw : PowerPC_Vec_WWW_Intrinsic<"vsrw">;
1171 def int_ppc_altivec_vsrab : PowerPC_Vec_BBB_Intrinsic<"vsrab">;
1172 def int_ppc_altivec_vsrah : PowerPC_Vec_HHH_Intrinsic<"vsrah">;
1173 def int_ppc_altivec_vsraw : PowerPC_Vec_WWW_Intrinsic<"vsraw">;
1174
1175 // Rotates.
1176 def int_ppc_altivec_vrlb : PowerPC_Vec_BBB_Intrinsic<"vrlb">;
1177 def int_ppc_altivec_vrlh : PowerPC_Vec_HHH_Intrinsic<"vrlh">;
1178 def int_ppc_altivec_vrlw : PowerPC_Vec_WWW_Intrinsic<"vrlw">;
1179 def int_ppc_altivec_vrld : PowerPC_Vec_DDD_Intrinsic<"vrld">;
1180
1181 let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.".
1182 // Miscellaneous.
1183 def int_ppc_altivec_lvsl :
1184 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
1185 def int_ppc_altivec_lvsr :
1186 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>;
1187
1188 def int_ppc_altivec_vperm : ClangBuiltin<"__builtin_altivec_vperm_4si">,
1189 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1190 llvm_v4i32_ty, llvm_v16i8_ty], [IntrNoMem]>;
1191 def int_ppc_altivec_vsel : ClangBuiltin<"__builtin_altivec_vsel_4si">,
1192 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty,
1193 llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1194 def int_ppc_altivec_vgbbd : ClangBuiltin<"__builtin_altivec_vgbbd">,
1195 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
1196 def int_ppc_altivec_vbpermq : ClangBuiltin<"__builtin_altivec_vbpermq">,
1197 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
1198 [IntrNoMem]>;
1199 def int_ppc_altivec_vbpermd : ClangBuiltin<"__builtin_altivec_vbpermd">,
1200 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v16i8_ty],
1201 [IntrNoMem]>;
1202 }
1203
1204 def int_ppc_altivec_vexptefp : PowerPC_Vec_FF_Intrinsic<"vexptefp">;
1205 def int_ppc_altivec_vlogefp : PowerPC_Vec_FF_Intrinsic<"vlogefp">;
1206 def int_ppc_altivec_vrefp : PowerPC_Vec_FF_Intrinsic<"vrefp">;
1207 def int_ppc_altivec_vrsqrtefp : PowerPC_Vec_FF_Intrinsic<"vrsqrtefp">;
1208
1209 // Power8 Intrinsics
1210 // Crypto
1211 let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.".
1212 def int_ppc_altivec_crypto_vsbox :
1213 ClangBuiltin<"__builtin_altivec_crypto_vsbox">,
1214 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty], [IntrNoMem]>;
1215 def int_ppc_altivec_crypto_vpermxor :
1216 ClangBuiltin<"__builtin_altivec_crypto_vpermxor">,
1217 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
1218 llvm_v16i8_ty], [IntrNoMem]>;
1219 def int_ppc_altivec_crypto_vpermxor_be :
1220 ClangBuiltin<"__builtin_altivec_crypto_vpermxor_be">,
1221 DefaultAttrsIntrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
1222 llvm_v16i8_ty], [IntrNoMem]>;
1223
1224 def int_ppc_altivec_crypto_vshasigmad :
1225 ClangBuiltin<"__builtin_altivec_crypto_vshasigmad">,
1226 DefaultAttrsIntrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i32_ty,
1227 llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>,
1228 ImmArg<ArgIndex<2>>]>;
1229 def int_ppc_altivec_crypto_vshasigmaw :
1230 ClangBuiltin<"__builtin_altivec_crypto_vshasigmaw">,
1231 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i32_ty,
1232 llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>,
1233 ImmArg<ArgIndex<2>>]>;
1234 }
1235 def int_ppc_altivec_crypto_vcipher :
1236 PowerPC_Vec_DDD_Intrinsic<"crypto_vcipher">;
1237 def int_ppc_altivec_crypto_vcipherlast :
1238 PowerPC_Vec_DDD_Intrinsic<"crypto_vcipherlast">;
1239 def int_ppc_altivec_crypto_vncipher :
1240 PowerPC_Vec_DDD_Intrinsic<"crypto_vncipher">;
1241 def int_ppc_altivec_crypto_vncipherlast :
1242 PowerPC_Vec_DDD_Intrinsic<"crypto_vncipherlast">;
1243 def int_ppc_altivec_crypto_vpmsumb :
1244 PowerPC_Vec_BBB_Intrinsic<"crypto_vpmsumb">;
1245 def int_ppc_altivec_crypto_vpmsumh :
1246 PowerPC_Vec_HHH_Intrinsic<"crypto_vpmsumh">;
1247 def int_ppc_altivec_crypto_vpmsumw :
1248 PowerPC_Vec_WWW_Intrinsic<"crypto_vpmsumw">;
1249 def int_ppc_altivec_crypto_vpmsumd :
1250 PowerPC_Vec_DDD_Intrinsic<"crypto_vpmsumd">;
1251
1252 // Absolute Difference intrinsics
1253 def int_ppc_altivec_vabsdub : PowerPC_Vec_BBB_Intrinsic<"vabsdub">;
1254 def int_ppc_altivec_vabsduh : PowerPC_Vec_HHH_Intrinsic<"vabsduh">;
1255 def int_ppc_altivec_vabsduw : PowerPC_Vec_WWW_Intrinsic<"vabsduw">;
1256
1257 // Vector rotates
1258 def int_ppc_altivec_vrlwnm :
1259 PowerPC_Vec_Intrinsic<"vrlwnm", [llvm_v4i32_ty],
1260 [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1261 def int_ppc_altivec_vrlwmi :
1262 PowerPC_Vec_Intrinsic<"vrlwmi", [llvm_v4i32_ty],
1263 [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
1264 [IntrNoMem]>;
1265 def int_ppc_altivec_vrldnm :
1266 PowerPC_Vec_Intrinsic<"vrldnm", [llvm_v2i64_ty],
1267 [llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem]>;
1268 def int_ppc_altivec_vrldmi :
1269 PowerPC_Vec_Intrinsic<"vrldmi", [llvm_v2i64_ty],
1270 [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
1271 [IntrNoMem]>;
1272
1273 def int_ppc_altivec_vrlqnm :
1274 PowerPC_Vec_Intrinsic<"vrlqnm", [llvm_v1i128_ty],
1275 [llvm_v1i128_ty, llvm_v1i128_ty],
1276 [IntrNoMem]>;
1277 def int_ppc_altivec_vrlqmi :
1278 PowerPC_Vec_Intrinsic<"vrlqmi", [llvm_v1i128_ty],
1279 [llvm_v1i128_ty, llvm_v1i128_ty, llvm_v1i128_ty],
1280 [IntrNoMem]>;
1281
1282 // Vector Divide Extended Intrinsics.
1283 def int_ppc_altivec_vdivesw : PowerPC_Vec_WWW_Intrinsic<"vdivesw">;
1284 def int_ppc_altivec_vdiveuw : PowerPC_Vec_WWW_Intrinsic<"vdiveuw">;
1285 def int_ppc_altivec_vdivesd : PowerPC_Vec_DDD_Intrinsic<"vdivesd">;
1286 def int_ppc_altivec_vdiveud : PowerPC_Vec_DDD_Intrinsic<"vdiveud">;
1287 def int_ppc_altivec_vdivesq : PowerPC_Vec_QQQ_Intrinsic<"vdivesq">;
1288 def int_ppc_altivec_vdiveuq : PowerPC_Vec_QQQ_Intrinsic<"vdiveuq">;
1289
1290 // Vector Multiply High Intrinsics.
1291 def int_ppc_altivec_vmulhsw : PowerPC_Vec_WWW_Intrinsic<"vmulhsw">;
1292 def int_ppc_altivec_vmulhuw : PowerPC_Vec_WWW_Intrinsic<"vmulhuw">;
1293 def int_ppc_altivec_vmulhsd : PowerPC_Vec_DDD_Intrinsic<"vmulhsd">;
1294 def int_ppc_altivec_vmulhud : PowerPC_Vec_DDD_Intrinsic<"vmulhud">;
1295
1296 //===----------------------------------------------------------------------===//
1297 // PowerPC VSX Intrinsic Definitions.
1298
1299 let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.".
1300
1301 // Vector load.
1302 def int_ppc_vsx_lxvw4x :
1303 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty],
1304 [IntrReadMem, IntrArgMemOnly]>;
1305 def int_ppc_vsx_lxvd2x :
1306 DefaultAttrsIntrinsic<[llvm_v2f64_ty], [llvm_ptr_ty],
1307 [IntrReadMem, IntrArgMemOnly]>;
1308 def int_ppc_vsx_lxvw4x_be :
1309 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty],
1310 [IntrReadMem, IntrArgMemOnly]>;
1311 def int_ppc_vsx_lxvd2x_be :
1312 DefaultAttrsIntrinsic<[llvm_v2f64_ty], [llvm_ptr_ty],
1313 [IntrReadMem, IntrArgMemOnly]>;
1314 def int_ppc_vsx_lxvl :
1315 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty],
1316 [IntrReadMem, IntrArgMemOnly]>;
1317 def int_ppc_vsx_lxvll :
1318 DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty],
1319 [IntrReadMem, IntrArgMemOnly]>;
1320 def int_ppc_vsx_lxvp :
1321 DefaultAttrsIntrinsic<[llvm_v256i1_ty], [llvm_ptr_ty],
1322 [IntrReadMem, IntrArgMemOnly]>;
1323
1324 // Vector store.
1325 def int_ppc_vsx_stxvw4x : Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
1326 [IntrWriteMem, IntrArgMemOnly]>;
1327 def int_ppc_vsx_stxvd2x : Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty],
1328 [IntrWriteMem, IntrArgMemOnly]>;
1329 def int_ppc_vsx_stxvw4x_be : Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
1330 [IntrWriteMem, IntrArgMemOnly]>;
1331 def int_ppc_vsx_stxvd2x_be : Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty],
1332 [IntrWriteMem, IntrArgMemOnly]>;
1333 def int_ppc_vsx_stxvl :
1334 Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
1335 [IntrWriteMem, IntrArgMemOnly]>;
1336 def int_ppc_vsx_stxvll :
1337 Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
1338 [IntrWriteMem, IntrArgMemOnly]>;
1339 def int_ppc_vsx_stxvp :
1340 Intrinsic<[], [llvm_v256i1_ty, llvm_ptr_ty], [IntrWriteMem,
1341 IntrArgMemOnly]>;
1342 // Vector and scalar maximum.
1343 def int_ppc_vsx_xvmaxdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmaxdp">;
1344 def int_ppc_vsx_xvmaxsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvmaxsp">;
1345 def int_ppc_vsx_xsmaxdp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmaxdp">;
1346
1347 // Vector and scalar minimum.
1348 def int_ppc_vsx_xvmindp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmindp">;
1349 def int_ppc_vsx_xvminsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvminsp">;
1350 def int_ppc_vsx_xsmindp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmindp">;
1351
1352 // Vector divide.
1353 def int_ppc_vsx_xvdivdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvdivdp">;
1354 def int_ppc_vsx_xvdivsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvdivsp">;
1355
1356 // Vector round-to-infinity (ceil)
1357 def int_ppc_vsx_xvrspip :
1358 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1359 def int_ppc_vsx_xvrdpip :
1360 DefaultAttrsIntrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1361
1362 // Vector reciprocal estimate
1363 def int_ppc_vsx_xvresp : ClangBuiltin<"__builtin_vsx_xvresp">,
1364 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1365 def int_ppc_vsx_xvredp : ClangBuiltin<"__builtin_vsx_xvredp">,
1366 DefaultAttrsIntrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1367
1368 // Vector rsqrte
1369 def int_ppc_vsx_xvrsqrtesp : ClangBuiltin<"__builtin_vsx_xvrsqrtesp">,
1370 DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1371 def int_ppc_vsx_xvrsqrtedp : ClangBuiltin<"__builtin_vsx_xvrsqrtedp">,
1372 DefaultAttrsIntrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1373
1374 // Vector compare
1375 def int_ppc_vsx_xvcmpeqdp :
1376 PowerPC_VSX_Intrinsic<"xvcmpeqdp", [llvm_v2i64_ty],
1377 [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1378 def int_ppc_vsx_xvcmpeqdp_p : ClangBuiltin<"__builtin_vsx_xvcmpeqdp_p">,
1379 DefaultAttrsIntrinsic<[llvm_i32_ty],
1380 [llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
1381 [IntrNoMem]>;
1382 def int_ppc_vsx_xvcmpeqsp :
1383 PowerPC_VSX_Intrinsic<"xvcmpeqsp", [llvm_v4i32_ty],
1384 [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1385 def int_ppc_vsx_xvcmpeqsp_p : ClangBuiltin<"__builtin_vsx_xvcmpeqsp_p">,
1386 DefaultAttrsIntrinsic<[llvm_i32_ty],
1387 [llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
1388 [IntrNoMem]>;
1389 def int_ppc_vsx_xvcmpgedp :
1390 PowerPC_VSX_Intrinsic<"xvcmpgedp", [llvm_v2i64_ty],
1391 [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1392 def int_ppc_vsx_xvcmpgedp_p : ClangBuiltin<"__builtin_vsx_xvcmpgedp_p">,
1393 DefaultAttrsIntrinsic<[llvm_i32_ty],
1394 [llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
1395 [IntrNoMem]>;
1396 def int_ppc_vsx_xvcmpgesp :
1397 PowerPC_VSX_Intrinsic<"xvcmpgesp", [llvm_v4i32_ty],
1398 [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1399 def int_ppc_vsx_xvcmpgesp_p : ClangBuiltin<"__builtin_vsx_xvcmpgesp_p">,
1400 DefaultAttrsIntrinsic<[llvm_i32_ty],
1401 [llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
1402 [IntrNoMem]>;
1403 def int_ppc_vsx_xvcmpgtdp :
1404 PowerPC_VSX_Intrinsic<"xvcmpgtdp", [llvm_v2i64_ty],
1405 [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1406 def int_ppc_vsx_xvcmpgtdp_p : ClangBuiltin<"__builtin_vsx_xvcmpgtdp_p">,
1407 DefaultAttrsIntrinsic<[llvm_i32_ty],
1408 [llvm_i32_ty,llvm_v2f64_ty,llvm_v2f64_ty],
1409 [IntrNoMem]>;
1410 def int_ppc_vsx_xvcmpgtsp :
1411 PowerPC_VSX_Intrinsic<"xvcmpgtsp", [llvm_v4i32_ty],
1412 [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1413 def int_ppc_vsx_xvcmpgtsp_p : ClangBuiltin<"__builtin_vsx_xvcmpgtsp_p">,
1414 DefaultAttrsIntrinsic<[llvm_i32_ty],
1415 [llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty],
1416 [IntrNoMem]>;
1417 def int_ppc_vsx_xxleqv :
1418 PowerPC_VSX_Intrinsic<"xxleqv", [llvm_v4i32_ty],
1419 [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
1420 def int_ppc_vsx_xviexpdp :
1421 PowerPC_VSX_Intrinsic<"xviexpdp",[llvm_v2f64_ty],
1422 [llvm_v2i64_ty, llvm_v2i64_ty],[IntrNoMem]>;
1423 def int_ppc_vsx_xviexpsp :
1424 PowerPC_VSX_Intrinsic<"xviexpsp",[llvm_v4f32_ty],
1425 [llvm_v4i32_ty, llvm_v4i32_ty],[IntrNoMem]>;
1426 def int_ppc_vsx_xvcvdpsxws :
1427 PowerPC_VSX_Intrinsic<"xvcvdpsxws", [llvm_v4i32_ty],
1428 [llvm_v2f64_ty], [IntrNoMem]>;
1429 def int_ppc_vsx_xvcvdpuxws :
1430 PowerPC_VSX_Intrinsic<"xvcvdpuxws", [llvm_v4i32_ty],
1431 [llvm_v2f64_ty], [IntrNoMem]>;
1432 def int_ppc_vsx_xvcvspsxds :
1433 PowerPC_VSX_Intrinsic<"xvcvspsxds", [llvm_v2i64_ty],
1434 [llvm_v4f32_ty], [IntrNoMem]>;
1435 def int_ppc_vsx_xvcvspuxds :
1436 PowerPC_VSX_Intrinsic<"xvcvspuxds", [llvm_v2i64_ty],
1437 [llvm_v4f32_ty], [IntrNoMem]>;
1438 def int_ppc_vsx_xvcvsxwdp :
1439 PowerPC_VSX_Intrinsic<"xvcvsxwdp", [llvm_v2f64_ty],
1440 [llvm_v4i32_ty], [IntrNoMem]>;
1441 def int_ppc_vsx_xvcvuxwdp :
1442 PowerPC_VSX_Intrinsic<"xvcvuxwdp", [llvm_v2f64_ty],
1443 [llvm_v4i32_ty], [IntrNoMem]>;
1444 def int_ppc_vsx_xvcvspdp :
1445 PowerPC_VSX_Intrinsic<"xvcvspdp", [llvm_v2f64_ty],
1446 [llvm_v4f32_ty], [IntrNoMem]>;
1447 def int_ppc_vsx_xvcvsxdsp :
1448 PowerPC_VSX_Intrinsic<"xvcvsxdsp", [llvm_v4f32_ty],
1449 [llvm_v2i64_ty], [IntrNoMem]>;
1450 def int_ppc_vsx_xvcvuxdsp :
1451 PowerPC_VSX_Intrinsic<"xvcvuxdsp", [llvm_v4f32_ty],
1452 [llvm_v2i64_ty], [IntrNoMem]>;
1453 def int_ppc_vsx_xvcvdpsp :
1454 PowerPC_VSX_Intrinsic<"xvcvdpsp", [llvm_v4f32_ty],
1455 [llvm_v2f64_ty], [IntrNoMem]>;
1456 def int_ppc_vsx_xvcvsphp :
1457 PowerPC_VSX_Intrinsic<"xvcvsphp", [llvm_v4f32_ty],
1458 [llvm_v4f32_ty], [IntrNoMem]>;
1459 def int_ppc_vsx_xvxexpdp :
1460 PowerPC_VSX_Intrinsic<"xvxexpdp", [llvm_v2i64_ty],
1461 [llvm_v2f64_ty], [IntrNoMem]>;
1462 def int_ppc_vsx_xvxexpsp :
1463 PowerPC_VSX_Intrinsic<"xvxexpsp", [llvm_v4i32_ty],
1464 [llvm_v4f32_ty], [IntrNoMem]>;
1465 def int_ppc_vsx_xvxsigdp :
1466 PowerPC_VSX_Intrinsic<"xvxsigdp", [llvm_v2i64_ty],
1467 [llvm_v2f64_ty], [IntrNoMem]>;
1468 def int_ppc_vsx_xvxsigsp :
1469 PowerPC_VSX_Intrinsic<"xvxsigsp", [llvm_v4i32_ty],
1470 [llvm_v4f32_ty], [IntrNoMem]>;
1471 def int_ppc_vsx_xvtstdcdp :
1472 PowerPC_VSX_Intrinsic<"xvtstdcdp", [llvm_v2i64_ty],
1473 [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1474 def int_ppc_vsx_xvtstdcsp :
1475 PowerPC_VSX_Intrinsic<"xvtstdcsp", [llvm_v4i32_ty],
1476 [llvm_v4f32_ty,llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1477 def int_ppc_vsx_xvcvhpsp :
1478 PowerPC_VSX_Intrinsic<"xvcvhpsp", [llvm_v4f32_ty],
1479 [llvm_v8i16_ty],[IntrNoMem]>;
1480 def int_ppc_vsx_xvcvspbf16 :
1481 PowerPC_VSX_Intrinsic<"xvcvspbf16", [llvm_v16i8_ty],
1482 [llvm_v16i8_ty], [IntrNoMem]>;
1483 def int_ppc_vsx_xvcvbf16spn :
1484 PowerPC_VSX_Intrinsic<"xvcvbf16spn", [llvm_v16i8_ty],
1485 [llvm_v16i8_ty], [IntrNoMem]>;
1486 def int_ppc_vsx_xxextractuw :
1487 PowerPC_VSX_Intrinsic<"xxextractuw",[llvm_v2i64_ty],
1488 [llvm_v2i64_ty,llvm_i32_ty], [IntrNoMem]>;
1489 def int_ppc_vsx_xxinsertw :
1490 PowerPC_VSX_Intrinsic<"xxinsertw",[llvm_v4i32_ty],
1491 [llvm_v4i32_ty,llvm_v2i64_ty,llvm_i32_ty],
1492 [IntrNoMem]>;
1493 def int_ppc_vsx_xvtlsbb :
1494 PowerPC_VSX_Intrinsic<"xvtlsbb", [llvm_i32_ty],
1495 [llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
1496 def int_ppc_vsx_xvtdivdp :
1497 PowerPC_VSX_Intrinsic<"xvtdivdp", [llvm_i32_ty],
1498 [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
1499 def int_ppc_vsx_xvtdivsp :
1500 PowerPC_VSX_Intrinsic<"xvtdivsp", [llvm_i32_ty],
1501 [llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
1502 def int_ppc_vsx_xvtsqrtdp :
1503 PowerPC_VSX_Intrinsic<"xvtsqrtdp", [llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
1504 def int_ppc_vsx_xvtsqrtsp :
1505 PowerPC_VSX_Intrinsic<"xvtsqrtsp", [llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
1506 def int_ppc_vsx_xxeval :
1507 PowerPC_VSX_Intrinsic<"xxeval", [llvm_v2i64_ty],
1508 [llvm_v2i64_ty, llvm_v2i64_ty,
1509 llvm_v2i64_ty, llvm_i32_ty],
1510 [IntrNoMem, ImmArg<ArgIndex<3>>]>;
1511 def int_ppc_vsx_xxgenpcvbm :
1512 PowerPC_VSX_Intrinsic<"xxgenpcvbm", [llvm_v16i8_ty],
1513 [llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
1514 def int_ppc_vsx_xxgenpcvhm :
1515 PowerPC_VSX_Intrinsic<"xxgenpcvhm", [llvm_v8i16_ty],
1516 [llvm_v8i16_ty, llvm_i32_ty], [IntrNoMem]>;
1517 def int_ppc_vsx_xxgenpcvwm :
1518 PowerPC_VSX_Intrinsic<"xxgenpcvwm", [llvm_v4i32_ty],
1519 [llvm_v4i32_ty, llvm_i32_ty], [IntrNoMem]>;
1520 def int_ppc_vsx_xxgenpcvdm :
1521 PowerPC_VSX_Intrinsic<"xxgenpcvdm", [llvm_v2i64_ty],
1522 [llvm_v2i64_ty, llvm_i32_ty], [IntrNoMem]>;
1523
1524 // P10 VSX Vector permute extended.
1525 def int_ppc_vsx_xxpermx :
1526 ClangBuiltin<"__builtin_vsx_xxpermx">,
1527 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
1528 [llvm_v16i8_ty,llvm_v16i8_ty,llvm_v16i8_ty,
1529 llvm_i32_ty],
1530 [IntrNoMem, ImmArg<ArgIndex<3>>]>;
1531 // P10 VSX Vector Blend Variable.
1532 def int_ppc_vsx_xxblendvb: ClangBuiltin<"__builtin_vsx_xxblendvb">,
1533 DefaultAttrsIntrinsic<[llvm_v16i8_ty],
1534 [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
1535 [IntrNoMem]>;
1536 def int_ppc_vsx_xxblendvh: ClangBuiltin<"__builtin_vsx_xxblendvh">,
1537 DefaultAttrsIntrinsic<[llvm_v8i16_ty],
1538 [llvm_v8i16_ty, llvm_v8i16_ty,llvm_v8i16_ty],
1539 [IntrNoMem]>;
1540 def int_ppc_vsx_xxblendvw: ClangBuiltin<"__builtin_vsx_xxblendvw">,
1541 DefaultAttrsIntrinsic<[llvm_v4i32_ty],
1542 [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
1543 [IntrNoMem]>;
1544 def int_ppc_vsx_xxblendvd: ClangBuiltin<"__builtin_vsx_xxblendvd">,
1545 DefaultAttrsIntrinsic<[llvm_v2i64_ty],
1546 [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
1547 [IntrNoMem]>;
1548 }
1549
1550 //===----------------------------------------------------------------------===//
1551 // PowerPC HTM Intrinsic Definitions.
1552
1553 let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.".
1554
1555 def int_ppc_tbegin : ClangBuiltin<"__builtin_tbegin">,
1556 Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
1557 def int_ppc_tend : ClangBuiltin<"__builtin_tend">,
1558 Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
1559
1560 def int_ppc_tabort : ClangBuiltin<"__builtin_tabort">,
1561 Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1562 def int_ppc_tabortwc : ClangBuiltin<"__builtin_tabortwc">,
1563 Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1564 def int_ppc_tabortwci : ClangBuiltin<"__builtin_tabortwci">,
1565 Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1566 def int_ppc_tabortdc : ClangBuiltin<"__builtin_tabortdc">,
1567 Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1568 def int_ppc_tabortdci : ClangBuiltin<"__builtin_tabortdci">,
1569 Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
1570
1571 def int_ppc_tcheck : ClangBuiltin<"__builtin_tcheck">,
1572 Intrinsic<[llvm_i32_ty], [], []>;
1573 def int_ppc_treclaim : ClangBuiltin<"__builtin_treclaim">,
1574 Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1575 def int_ppc_trechkpt : ClangBuiltin<"__builtin_trechkpt">,
1576 Intrinsic<[llvm_i32_ty], [], []>;
1577 def int_ppc_tsr : ClangBuiltin<"__builtin_tsr">,
1578 Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
1579
1580 def int_ppc_get_texasr : ClangBuiltin<"__builtin_get_texasr">,
1581 Intrinsic<[llvm_i64_ty], [], []>;
1582 def int_ppc_get_texasru : ClangBuiltin<"__builtin_get_texasru">,
1583 Intrinsic<[llvm_i64_ty], [], []>;
1584 def int_ppc_get_tfhar : ClangBuiltin<"__builtin_get_tfhar">,
1585 Intrinsic<[llvm_i64_ty], [], []>;
1586 def int_ppc_get_tfiar : ClangBuiltin<"__builtin_get_tfiar">,
1587 Intrinsic<[llvm_i64_ty], [], []>;
1588
1589 def int_ppc_set_texasr : ClangBuiltin<"__builtin_set_texasr">,
1590 Intrinsic<[], [llvm_i64_ty], []>;
1591 def int_ppc_set_texasru : ClangBuiltin<"__builtin_set_texasru">,
1592 Intrinsic<[], [llvm_i64_ty], []>;
1593 def int_ppc_set_tfhar : ClangBuiltin<"__builtin_set_tfhar">,
1594 Intrinsic<[], [llvm_i64_ty], []>;
1595 def int_ppc_set_tfiar : ClangBuiltin<"__builtin_set_tfiar">,
1596 Intrinsic<[], [llvm_i64_ty], []>;
1597
1598 // Extended mnemonics
1599 def int_ppc_tendall : ClangBuiltin<"__builtin_tendall">,
1600 Intrinsic<[llvm_i32_ty], [], []>;
1601 def int_ppc_tresume : ClangBuiltin<"__builtin_tresume">,
1602 Intrinsic<[llvm_i32_ty], [], []>;
1603 def int_ppc_tsuspend : ClangBuiltin<"__builtin_tsuspend">,
1604 Intrinsic<[llvm_i32_ty], [], []>;
1605
1606 def int_ppc_ttest : ClangBuiltin<"__builtin_ttest">,
1607 Intrinsic<[llvm_i64_ty], [], []>;
1608
1609 // We currently use llvm.ppc.cfence in the context of atomic load which
1610 // in LLVM IR requires its type to be one of integer, pointer and
1611 // float point type. So llvm_any_ty here refers to type mentioned above.
1612 // Backend is supposed to lower these types to appropriate MVTs.
1613 def int_ppc_cfence : Intrinsic<[], [llvm_any_ty], []>;
1614
1615 // PowerPC set FPSCR Intrinsic Definitions.
1616 def int_ppc_setrnd : ClangBuiltin<"__builtin_setrnd">,
1617 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrHasSideEffects]>;
1618 }
1619
1620 let TargetPrefix = "ppc" in {
1621 def int_ppc_vsx_assemble_pair :
1622 DefaultAttrsIntrinsic<[llvm_v256i1_ty],
1623 [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
1624
1625 def int_ppc_vsx_disassemble_pair :
1626 DefaultAttrsIntrinsic<[llvm_v16i8_ty, llvm_v16i8_ty],
1627 [llvm_v256i1_ty], [IntrNoMem]>;
1628
1629 def int_ppc_mma_assemble_acc :
1630 DefaultAttrsIntrinsic<[llvm_v512i1_ty],
1631 [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty,
1632 llvm_v16i8_ty], [IntrNoMem]>;
1633
1634 def int_ppc_mma_disassemble_acc :
1635 DefaultAttrsIntrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty,
1636 llvm_v16i8_ty], [llvm_v512i1_ty], [IntrNoMem]>;
1637
1638 def int_ppc_mma_xxmtacc :
1639 DefaultAttrsIntrinsic<[llvm_v512i1_ty], [llvm_v512i1_ty], [IntrNoMem]>;
1640
1641 def int_ppc_mma_xxmfacc :
1642 DefaultAttrsIntrinsic<[llvm_v512i1_ty], [llvm_v512i1_ty], [IntrNoMem]>;
1643
1644 def int_ppc_mma_xxsetaccz :
1645 DefaultAttrsIntrinsic<[llvm_v512i1_ty], [], [IntrNoMem]>;
1646
1647 // MMA Reduced-Precision: Outer Product Intrinsic Definitions.
1648 defm int_ppc_mma_xvi4ger8 :
1649 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1650 defm int_ppc_mma_pmxvi4ger8 :
1651 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1652 llvm_i32_ty, llvm_i32_ty]>;
1653
1654 defm int_ppc_mma_xvi8ger4 :
1655 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1656 defm int_ppc_mma_pmxvi8ger4 :
1657 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1658 llvm_i32_ty, llvm_i32_ty]>;
1659
1660 defm int_ppc_mma_xvi16ger2s :
1661 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1662 defm int_ppc_mma_pmxvi16ger2s :
1663 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1664 llvm_i32_ty, llvm_i32_ty]>;
1665
1666 defm int_ppc_mma_xvf16ger2 :
1667 PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1668 defm int_ppc_mma_pmxvf16ger2 :
1669 PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1670 llvm_i32_ty, llvm_i32_ty]>;
1671 defm int_ppc_mma_xvf32ger :
1672 PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1673 defm int_ppc_mma_pmxvf32ger :
1674 PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1675 llvm_i32_ty]>;
1676 defm int_ppc_mma_xvf64ger :
1677 PowerPC_MMA_ACC_Intrinsic<[llvm_v256i1_ty, llvm_v16i8_ty]>;
1678 defm int_ppc_mma_pmxvf64ger :
1679 PowerPC_MMA_ACC_Intrinsic<[llvm_v256i1_ty, llvm_v16i8_ty, llvm_i32_ty,
1680 llvm_i32_ty]>;
1681
1682 // MMA Reduced-Precision: bfloat16 Outer Product Intrinsic Definitions.
1683 defm int_ppc_mma_xvbf16ger2 :
1684 PowerPC_MMA_ACC_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1685 defm int_ppc_mma_pmxvbf16ger2 :
1686 PowerPC_MMA_ACC_Intrinsic<
1687 [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty]>;
1688
1689 // MMA Reduced-Precision: Missing Integer-based Outer Product Operations.
1690 defm int_ppc_mma_xvi16ger2 :
1691 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1692 defm int_ppc_mma_pmxvi16ger2 :
1693 PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
1694 llvm_i32_ty, llvm_i32_ty]>;
1695 def int_ppc_mma_xvi8ger4spp :
1696 DefaultAttrsIntrinsic<[llvm_v512i1_ty],
1697 [llvm_v512i1_ty, llvm_v16i8_ty, llvm_v16i8_ty],
1698 [IntrNoMem]>;
1699 def int_ppc_mma_pmxvi8ger4spp :
1700 DefaultAttrsIntrinsic<[llvm_v512i1_ty],
1701 [llvm_v512i1_ty, llvm_v16i8_ty, llvm_v16i8_ty,
1702 llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
1703 [IntrNoMem]>;
1704 }
1705
1706 // XL Compat intrinsics.
1707 let TargetPrefix = "ppc" in {
1708 def int_ppc_dcbfl : ClangBuiltin<"__builtin_ppc_dcbfl">,
1709 Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
1710 def int_ppc_dcbflp : ClangBuiltin<"__builtin_ppc_dcbflp">,
1711 Intrinsic<[], [llvm_ptr_ty], [IntrArgMemOnly]>;
1712 def int_ppc_dcbst : ClangBuiltin<"__builtin_ppc_dcbst">,
1713 Intrinsic<[], [llvm_ptr_ty], []>;
1714 def int_ppc_dcbt : ClangBuiltin<"__builtin_ppc_dcbt">,
1715 Intrinsic<[], [llvm_ptr_ty],
1716 [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
1717 def int_ppc_dcbtst : ClangBuiltin<"__builtin_ppc_dcbtst">,
1718 Intrinsic<[], [llvm_ptr_ty],
1719 [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
1720 def int_ppc_dcbz : ClangBuiltin<"__builtin_ppc_dcbz">,
1721 Intrinsic<[], [llvm_ptr_ty], []>;
1722 def int_ppc_icbt : ClangBuiltin<"__builtin_ppc_icbt">,
1723 Intrinsic<[], [llvm_ptr_ty], []>;
1724
1725 // Population Count in each Byte.
1726 def int_ppc_popcntb :
1727 DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyint_ty], [IntrNoMem]>;
1728
1729 // sync instruction (i.e. sync 0, a.k.a hwsync)
1730 def int_ppc_sync : ClangBuiltin<"__builtin_ppc_sync">,
1731 Intrinsic<[], [], []>;
1732 def int_ppc_iospace_sync : ClangBuiltin<"__builtin_ppc_iospace_sync">,
1733 Intrinsic<[], [], []>;
1734 // isync instruction
1735 def int_ppc_isync : ClangBuiltin<"__builtin_ppc_isync">,
1736 Intrinsic<[], [], []>;
1737 // lwsync is sync 1
1738 def int_ppc_lwsync : ClangBuiltin<"__builtin_ppc_lwsync">,
1739 Intrinsic<[], [], []>;
1740 def int_ppc_iospace_lwsync : ClangBuiltin<"__builtin_ppc_iospace_lwsync">,
1741 Intrinsic<[], [], []>;
1742 // eieio instruction
1743 def int_ppc_eieio : ClangBuiltin<"__builtin_ppc_eieio">,
1744 Intrinsic<[],[],[]>;
1745 def int_ppc_iospace_eieio : ClangBuiltin<"__builtin_ppc_iospace_eieio">,
1746 Intrinsic<[],[],[]>;
1747 def int_ppc_stdcx :
1748 ClangBuiltin<"__builtin_ppc_stdcx">,
1749 Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i64_ty],
1750 [IntrWriteMem, IntrArgMemOnly, IntrNoDuplicate]>;
1751 def int_ppc_stwcx :
1752 ClangBuiltin<"__builtin_ppc_stwcx">,
1753 Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty],
1754 [IntrWriteMem, IntrArgMemOnly]>;
1755 def int_ppc_sthcx :
1756 Intrinsic<[llvm_i32_ty], [ llvm_ptr_ty, llvm_i32_ty ],
1757 [IntrWriteMem, IntrArgMemOnly, IntrNoDuplicate]>;
1758 def int_ppc_stbcx :
1759 ClangBuiltin<"__builtin_ppc_stbcx">,
1760 Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty],
1761 [IntrWriteMem, IntrArgMemOnly, IntrNoDuplicate]>;
1762 def int_ppc_dcbtstt : ClangBuiltin<"__builtin_ppc_dcbtstt">,
1763 Intrinsic<[], [llvm_ptr_ty],
1764 [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
1765 def int_ppc_dcbtt : ClangBuiltin<"__builtin_ppc_dcbtt">,
1766 Intrinsic<[], [llvm_ptr_ty],
1767 [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
1768 def int_ppc_mftbu : ClangBuiltin<"__builtin_ppc_mftbu">,
1769 DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem]>;
1770 def int_ppc_mfmsr : ClangBuiltin<"__builtin_ppc_mfmsr">,
1771 DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem]>;
1772 def int_ppc_mfspr
1773 : DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
1774 def int_ppc_mtmsr
1775 : ClangBuiltin<"__builtin_ppc_mtmsr">, Intrinsic<[], [llvm_i32_ty], []>;
1776 def int_ppc_mtspr
1777 : DefaultAttrsIntrinsic<[], [llvm_i32_ty, llvm_anyint_ty], [ImmArg<ArgIndex<0>>]>;
1778 def int_ppc_stfiw : ClangBuiltin<"__builtin_ppc_stfiw">,
1779 DefaultAttrsIntrinsic<[], [llvm_ptr_ty, llvm_double_ty],
1780 [IntrWriteMem]>;
1781 // compare
1782 def int_ppc_cmpeqb
1783 : ClangBuiltin<"__builtin_ppc_cmpeqb">,
1784 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
1785 [IntrNoMem]>;
1786 def int_ppc_cmprb
1787 : ClangBuiltin<"__builtin_ppc_cmprb">,
1788 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
1789 llvm_i32_ty], [IntrNoMem, ImmArg<ArgIndex<0>>]>;
1790 def int_ppc_setb
1791 : ClangBuiltin<"__builtin_ppc_setb">,
1792 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
1793 [IntrNoMem]>;
1794 def int_ppc_cmpb
1795 : DefaultAttrsIntrinsic<[llvm_anyint_ty],
1796 [llvm_anyint_ty, llvm_anyint_ty], [IntrNoMem]>;
1797 // multiply
1798 def int_ppc_mulhd
1799 : ClangBuiltin<"__builtin_ppc_mulhd">,
1800 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
1801 [IntrNoMem]>;
1802 def int_ppc_mulhdu
1803 : ClangBuiltin<"__builtin_ppc_mulhdu">,
1804 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
1805 [IntrNoMem]>;
1806 def int_ppc_mulhw
1807 : ClangBuiltin<"__builtin_ppc_mulhw">,
1808 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
1809 [IntrNoMem]>;
1810 def int_ppc_mulhwu
1811 : ClangBuiltin<"__builtin_ppc_mulhwu">,
1812 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
1813 [IntrNoMem]>;
1814 def int_ppc_maddhd
1815 : ClangBuiltin<"__builtin_ppc_maddhd">,
1816 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty,
1817 llvm_i64_ty], [IntrNoMem]>;
1818 def int_ppc_maddhdu
1819 : ClangBuiltin<"__builtin_ppc_maddhdu">,
1820 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty,
1821 llvm_i64_ty], [IntrNoMem]>;
1822 def int_ppc_maddld
1823 : ClangBuiltin<"__builtin_ppc_maddld">,
1824 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty,
1825 llvm_i64_ty], [IntrNoMem]>;
1826 // load
1827 def int_ppc_load2r
1828 : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_ptr_ty],
1829 [IntrReadMem, IntrArgMemOnly]>;
1830 def int_ppc_load4r
1831 : ClangBuiltin<"__builtin_ppc_load4r">,
1832 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_ptr_ty],
1833 [IntrReadMem, IntrArgMemOnly]>;
1834 def int_ppc_load8r
1835 : ClangBuiltin<"__builtin_ppc_load8r">,
1836 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_ptr_ty],
1837 [IntrReadMem, IntrArgMemOnly]>;
1838 // store
1839 def int_ppc_store2r
1840 : ClangBuiltin<"__builtin_ppc_store2r">,
1841 Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty], [IntrWriteMem]>;
1842 def int_ppc_store4r
1843 : ClangBuiltin<"__builtin_ppc_store4r">,
1844 Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty], [IntrWriteMem]>;
1845 def int_ppc_store8r
1846 : ClangBuiltin<"__builtin_ppc_store8r">,
1847 Intrinsic<[], [llvm_i64_ty, llvm_ptr_ty], [IntrWriteMem]>;
1848 def int_ppc_insert_exp
1849 : ClangBuiltin<"__builtin_ppc_insert_exp">,
1850 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty, llvm_i64_ty],
1851 [IntrNoMem]>;
1852 def int_ppc_extract_exp
1853 : ClangBuiltin<"__builtin_ppc_extract_exp">,
1854 DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
1855 def int_ppc_extract_sig
1856 : ClangBuiltin<"__builtin_ppc_extract_sig">,
1857 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
1858 def int_ppc_mtfsb0
1859 : ClangBuiltin<"__builtin_ppc_mtfsb0">,
1860 DefaultAttrsIntrinsic<[], [llvm_i32_ty],
1861 [IntrNoMem, IntrHasSideEffects,
1862 ImmArg<ArgIndex<0>>]>;
1863 def int_ppc_mtfsb1
1864 : ClangBuiltin<"__builtin_ppc_mtfsb1">,
1865 DefaultAttrsIntrinsic<[], [llvm_i32_ty],
1866 [IntrNoMem, IntrHasSideEffects,
1867 ImmArg<ArgIndex<0>>]>;
1868 def int_ppc_mtfsf :
1869 DefaultAttrsIntrinsic<[], [llvm_i32_ty, llvm_double_ty],
1870 [IntrNoMem, IntrHasSideEffects,
1871 ImmArg<ArgIndex<0>>]>;
1872 def int_ppc_mtfsfi
1873 : ClangBuiltin<"__builtin_ppc_mtfsfi">,
1874 DefaultAttrsIntrinsic<[], [llvm_i32_ty, llvm_i32_ty],
1875 [IntrNoMem, IntrHasSideEffects,
1876 ImmArg<ArgIndex<0>>,ImmArg<ArgIndex<1>>]>;
1877 def int_ppc_fmsub
1878 : ClangBuiltin<"__builtin_ppc_fmsub">,
1879 DefaultAttrsIntrinsic<[llvm_double_ty],
1880 [llvm_double_ty, llvm_double_ty, llvm_double_ty],
1881 [IntrNoMem]>;
1882 def int_ppc_fmsubs
1883 : ClangBuiltin<"__builtin_ppc_fmsubs">,
1884 DefaultAttrsIntrinsic<[llvm_float_ty],
1885 [llvm_float_ty, llvm_float_ty, llvm_float_ty],
1886 [IntrNoMem]>;
1887 def int_ppc_fnmadd
1888 : ClangBuiltin<"__builtin_ppc_fnmadd">,
1889 DefaultAttrsIntrinsic<[llvm_double_ty],
1890 [llvm_double_ty, llvm_double_ty, llvm_double_ty],
1891 [IntrNoMem]>;
1892 def int_ppc_fnmadds
1893 : ClangBuiltin<"__builtin_ppc_fnmadds">,
1894 DefaultAttrsIntrinsic<[llvm_float_ty],
1895 [llvm_float_ty, llvm_float_ty, llvm_float_ty],
1896 [IntrNoMem]>;
1897 def int_ppc_fnmsub
1898 : DefaultAttrsIntrinsic<[llvm_anyfloat_ty],
1899 [LLVMMatchType<0>, LLVMMatchType<0>,
1900 LLVMMatchType<0>],
1901 [IntrNoMem]>;
1902 def int_ppc_fre
1903 : ClangBuiltin<"__builtin_ppc_fre">,
1904 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
1905 def int_ppc_fres
1906 : ClangBuiltin<"__builtin_ppc_fres">,
1907 DefaultAttrsIntrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
1908 def int_ppc_addex
1909 : ClangBuiltin<"__builtin_ppc_addex">,
1910 DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty, llvm_i32_ty],
1911 [IntrNoMem, IntrHasSideEffects, ImmArg<ArgIndex<2>>]>;
1912 def int_ppc_fsel : ClangBuiltin<"__builtin_ppc_fsel">,
1913 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty,
1914 llvm_double_ty], [IntrNoMem]>;
1915 def int_ppc_fsels : ClangBuiltin<"__builtin_ppc_fsels">,
1916 DefaultAttrsIntrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty,
1917 llvm_float_ty], [IntrNoMem]>;
1918 def int_ppc_frsqrte : ClangBuiltin<"__builtin_ppc_frsqrte">,
1919 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
1920 def int_ppc_frsqrtes : ClangBuiltin<"__builtin_ppc_frsqrtes">,
1921 DefaultAttrsIntrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
1922 def int_ppc_compare_exp_uo : ClangBuiltin<"__builtin_ppc_compare_exp_uo">,
1923 DefaultAttrsIntrinsic<[llvm_i32_ty],
1924 [llvm_double_ty, llvm_double_ty],
1925 [IntrNoMem]>;
1926 def int_ppc_compare_exp_lt : ClangBuiltin<"__builtin_ppc_compare_exp_lt">,
1927 DefaultAttrsIntrinsic<[llvm_i32_ty],
1928 [llvm_double_ty, llvm_double_ty],
1929 [IntrNoMem]>;
1930 def int_ppc_compare_exp_gt : ClangBuiltin<"__builtin_ppc_compare_exp_gt">,
1931 DefaultAttrsIntrinsic<[llvm_i32_ty],
1932 [llvm_double_ty, llvm_double_ty],
1933 [IntrNoMem]>;
1934 def int_ppc_compare_exp_eq : ClangBuiltin<"__builtin_ppc_compare_exp_eq">,
1935 DefaultAttrsIntrinsic<[llvm_i32_ty],
1936 [llvm_double_ty, llvm_double_ty],
1937 [IntrNoMem]>;
1938 def int_ppc_test_data_class
1939 : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_anyfloat_ty, llvm_i32_ty],
1940 [IntrNoMem, ImmArg<ArgIndex<1>>]>;
1941 def int_ppc_fnabs
1942 : ClangBuiltin<"__builtin_ppc_fnabs">,
1943 DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
1944 def int_ppc_fnabss
1945 : ClangBuiltin<"__builtin_ppc_fnabss">,
1946 DefaultAttrsIntrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
1947
1948 def int_ppc_convert_f128_to_ppcf128
1949 : DefaultAttrsIntrinsic<[llvm_ppcf128_ty], [llvm_f128_ty], [IntrNoMem]>;
1950 def int_ppc_convert_ppcf128_to_f128
1951 : DefaultAttrsIntrinsic<[llvm_f128_ty], [llvm_ppcf128_ty], [IntrNoMem]>;
1952 }
1953
1954 //===----------------------------------------------------------------------===//
1955 // PowerPC Atomic Intrinsic Definitions.
1956 let TargetPrefix = "ppc" in {
1957 class AtomicRMW128Intrinsic
1958 : Intrinsic<[llvm_i64_ty, llvm_i64_ty],
1959 [llvm_ptr_ty, llvm_i64_ty, llvm_i64_ty],
1960 [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
1961 def int_ppc_atomicrmw_xchg_i128 : AtomicRMW128Intrinsic;
1962 def int_ppc_atomicrmw_add_i128 : AtomicRMW128Intrinsic;
1963 def int_ppc_atomicrmw_sub_i128 : AtomicRMW128Intrinsic;
1964 def int_ppc_atomicrmw_and_i128 : AtomicRMW128Intrinsic;
1965 def int_ppc_atomicrmw_or_i128 : AtomicRMW128Intrinsic;
1966 def int_ppc_atomicrmw_xor_i128 : AtomicRMW128Intrinsic;
1967 def int_ppc_atomicrmw_nand_i128 : AtomicRMW128Intrinsic;
1968 def int_ppc_cmpxchg_i128 : Intrinsic<[llvm_i64_ty, llvm_i64_ty],
1969 [llvm_ptr_ty,
1970 llvm_i64_ty, llvm_i64_ty,
1971 llvm_i64_ty, llvm_i64_ty],
1972 [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
1973 def int_ppc_atomic_load_i128 :
1974 Intrinsic<[llvm_i64_ty, llvm_i64_ty],
1975 [llvm_ptr_ty],
1976 [IntrArgMemOnly, IntrReadMem, NoCapture<ArgIndex<0>>]>;
1977 def int_ppc_atomic_store_i128 :
1978 Intrinsic<[], [llvm_i64_ty, llvm_i64_ty, llvm_ptr_ty],
1979 [IntrArgMemOnly, IntrWriteMem, NoCapture<ArgIndex<2>>]>;
1980 }