Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/llvm/IR/IntrinsicsARM.td is written in an unsupported language. File is not indexed.

0001 //===- IntrinsicsARM.td - Defines ARM 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 ARM-specific intrinsics.
0010 //
0011 //===----------------------------------------------------------------------===//
0012 
0013 
0014 //===----------------------------------------------------------------------===//
0015 // TLS
0016 
0017 let TargetPrefix = "arm" in {  // All intrinsics start with "llvm.arm.".
0018 
0019 // A space-consuming intrinsic primarily for testing ARMConstantIslands. The
0020 // first argument is the number of bytes this "instruction" takes up, the second
0021 // and return value are essentially chains, used to force ordering during ISel.
0022 def int_arm_space : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
0023 
0024 // 16-bit multiplications
0025 def int_arm_smulbb : ClangBuiltin<"__builtin_arm_smulbb">,
0026     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0027                           [IntrNoMem]>;
0028 def int_arm_smulbt : ClangBuiltin<"__builtin_arm_smulbt">,
0029     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0030                           [IntrNoMem]>;
0031 def int_arm_smultb : ClangBuiltin<"__builtin_arm_smultb">,
0032     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0033                           [IntrNoMem]>;
0034 def int_arm_smultt : ClangBuiltin<"__builtin_arm_smultt">,
0035     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0036                           [IntrNoMem]>;
0037 def int_arm_smulwb : ClangBuiltin<"__builtin_arm_smulwb">,
0038     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0039                           [IntrNoMem]>;
0040 def int_arm_smulwt : ClangBuiltin<"__builtin_arm_smulwt">,
0041     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0042                           [IntrNoMem]>;
0043 
0044 //===----------------------------------------------------------------------===//
0045 // Saturating Arithmetic
0046 
0047 def int_arm_qadd : ClangBuiltin<"__builtin_arm_qadd">,
0048     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0049                           [Commutative, IntrNoMem]>;
0050 def int_arm_qsub : ClangBuiltin<"__builtin_arm_qsub">,
0051     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0052                           [IntrNoMem]>;
0053 def int_arm_ssat : ClangBuiltin<"__builtin_arm_ssat">,
0054     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0055                           [IntrNoMem]>;
0056 def int_arm_usat : ClangBuiltin<"__builtin_arm_usat">,
0057     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0058                           [IntrNoMem]>;
0059 
0060 // Accumulating multiplications
0061 def int_arm_smlabb : ClangBuiltin<"__builtin_arm_smlabb">,
0062     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0063                            llvm_i32_ty],
0064                           [IntrNoMem]>;
0065 def int_arm_smlabt : ClangBuiltin<"__builtin_arm_smlabt">,
0066     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0067                            llvm_i32_ty],
0068                           [IntrNoMem]>;
0069 def int_arm_smlatb : ClangBuiltin<"__builtin_arm_smlatb">,
0070     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0071                            llvm_i32_ty],
0072                           [IntrNoMem]>;
0073 def int_arm_smlatt : ClangBuiltin<"__builtin_arm_smlatt">,
0074     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0075                            llvm_i32_ty],
0076                           [IntrNoMem]>;
0077 def int_arm_smlawb : ClangBuiltin<"__builtin_arm_smlawb">,
0078     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0079                            llvm_i32_ty],
0080                           [IntrNoMem]>;
0081 def int_arm_smlawt : ClangBuiltin<"__builtin_arm_smlawt">,
0082     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0083                            llvm_i32_ty],
0084                           [IntrNoMem]>;
0085 
0086 // Parallel 16-bit saturation
0087 def int_arm_ssat16 : ClangBuiltin<"__builtin_arm_ssat16">,
0088     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0089                           [IntrNoMem]>;
0090 def int_arm_usat16 : ClangBuiltin<"__builtin_arm_usat16">,
0091     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0092                           [IntrNoMem]>;
0093 
0094 // Packing and unpacking
0095 def int_arm_sxtab16 : ClangBuiltin<"__builtin_arm_sxtab16">,
0096     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0097                           [IntrNoMem]>;
0098 def int_arm_sxtb16 : ClangBuiltin<"__builtin_arm_sxtb16">,
0099     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
0100 def int_arm_uxtab16 : ClangBuiltin<"__builtin_arm_uxtab16">,
0101     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0102                           [IntrNoMem]>;
0103 def int_arm_uxtb16 : ClangBuiltin<"__builtin_arm_uxtb16">,
0104     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
0105 
0106 // Parallel selection, reads the GE flags.
0107 def int_arm_sel : ClangBuiltin<"__builtin_arm_sel">,
0108     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0109                           [IntrReadMem]>;
0110 
0111 // Parallel 8-bit addition and subtraction
0112 def int_arm_qadd8  : ClangBuiltin<"__builtin_arm_qadd8">,
0113     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0114                           [IntrNoMem]>;
0115 def int_arm_qsub8  : ClangBuiltin<"__builtin_arm_qsub8">,
0116     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0117                           [IntrNoMem]>;
0118 // Writes to the GE bits.
0119 def int_arm_sadd8  : ClangBuiltin<"__builtin_arm_sadd8">,
0120     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0121 def int_arm_shadd8  : ClangBuiltin<"__builtin_arm_shadd8">,
0122     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0123                           [IntrNoMem]>;
0124 def int_arm_shsub8  : ClangBuiltin<"__builtin_arm_shsub8">,
0125     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0126                           [IntrNoMem]>;
0127 // Writes to the GE bits.
0128 def int_arm_ssub8  : ClangBuiltin<"__builtin_arm_ssub8">,
0129     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0130 // Writes to the GE bits.
0131 def int_arm_uadd8  : ClangBuiltin<"__builtin_arm_uadd8">,
0132     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0133 def int_arm_uhadd8  : ClangBuiltin<"__builtin_arm_uhadd8">,
0134     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0135                           [IntrNoMem]>;
0136 def int_arm_uhsub8  : ClangBuiltin<"__builtin_arm_uhsub8">,
0137     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0138                           [IntrNoMem]>;
0139 def int_arm_uqadd8  : ClangBuiltin<"__builtin_arm_uqadd8">,
0140     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0141                           [IntrNoMem]>;
0142 def int_arm_uqsub8  : ClangBuiltin<"__builtin_arm_uqsub8">,
0143     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0144                           [IntrNoMem]>;
0145 // Writes to the GE bits.
0146 def int_arm_usub8  : ClangBuiltin<"__builtin_arm_usub8">,
0147     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0148 
0149 // Sum of 8-bit absolute differences
0150 def int_arm_usad8  : ClangBuiltin<"__builtin_arm_usad8">,
0151     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0152                           [IntrNoMem]>;
0153 def int_arm_usada8  : ClangBuiltin<"__builtin_arm_usada8">,
0154     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0155                            llvm_i32_ty],
0156                           [IntrNoMem]>;
0157 
0158 // Parallel 16-bit addition and subtraction
0159 def int_arm_qadd16  : ClangBuiltin<"__builtin_arm_qadd16">,
0160     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0161                           [IntrNoMem]>;
0162 def int_arm_qasx  : ClangBuiltin<"__builtin_arm_qasx">,
0163     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0164                           [IntrNoMem]>;
0165 def int_arm_qsax  : ClangBuiltin<"__builtin_arm_qsax">,
0166     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0167                           [IntrNoMem]>;
0168 def int_arm_qsub16  : ClangBuiltin<"__builtin_arm_qsub16">,
0169     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0170                           [IntrNoMem]>;
0171 // Writes to the GE bits.
0172 def int_arm_sadd16  : ClangBuiltin<"__builtin_arm_sadd16">,
0173     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0174 // Writes to the GE bits.
0175 def int_arm_sasx  : ClangBuiltin<"__builtin_arm_sasx">,
0176     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0177 def int_arm_shadd16  : ClangBuiltin<"__builtin_arm_shadd16">,
0178     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0179                           [IntrNoMem]>;
0180 def int_arm_shasx  : ClangBuiltin<"__builtin_arm_shasx">,
0181     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0182                           [IntrNoMem]>;
0183 def int_arm_shsax  : ClangBuiltin<"__builtin_arm_shsax">,
0184     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0185                           [IntrNoMem]>;
0186 def int_arm_shsub16  : ClangBuiltin<"__builtin_arm_shsub16">,
0187     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0188                           [IntrNoMem]>;
0189 // Writes to the GE bits.
0190 def int_arm_ssax  : ClangBuiltin<"__builtin_arm_ssax">,
0191     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0192 // Writes to the GE bits.
0193 def int_arm_ssub16  : ClangBuiltin<"__builtin_arm_ssub16">,
0194     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0195 // Writes to the GE bits.
0196 def int_arm_uadd16  : ClangBuiltin<"__builtin_arm_uadd16">,
0197     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0198 // Writes to the GE bits.
0199 def int_arm_uasx  : ClangBuiltin<"__builtin_arm_uasx">,
0200     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0201 def int_arm_uhadd16  : ClangBuiltin<"__builtin_arm_uhadd16">,
0202     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0203                           [IntrNoMem]>;
0204 def int_arm_uhasx  : ClangBuiltin<"__builtin_arm_uhasx">,
0205     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0206                           [IntrNoMem]>;
0207 def int_arm_uhsax  : ClangBuiltin<"__builtin_arm_uhsax">,
0208     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0209                           [IntrNoMem]>;
0210 def int_arm_uhsub16  : ClangBuiltin<"__builtin_arm_uhsub16">,
0211     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0212                           [IntrNoMem]>;
0213 def int_arm_uqadd16  : ClangBuiltin<"__builtin_arm_uqadd16">,
0214     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0215                           [IntrNoMem]>;
0216 def int_arm_uqasx  : ClangBuiltin<"__builtin_arm_uqasx">,
0217     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0218                           [IntrNoMem]>;
0219 def int_arm_uqsax  : ClangBuiltin<"__builtin_arm_uqsax">,
0220     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0221                           [IntrNoMem]>;
0222 def int_arm_uqsub16  : ClangBuiltin<"__builtin_arm_uqsub16">,
0223     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0224                           [IntrNoMem]>;
0225 // Writes to the GE bits.
0226 def int_arm_usax  : ClangBuiltin<"__builtin_arm_usax">,
0227     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0228 // Writes to the GE bits.
0229 def int_arm_usub16  : ClangBuiltin<"__builtin_arm_usub16">,
0230     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
0231 
0232 // Parallel 16-bit multiplication
0233 def int_arm_smlad : ClangBuiltin<"__builtin_arm_smlad">,
0234     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0235                            llvm_i32_ty],
0236                           [IntrNoMem]>;
0237 def int_arm_smladx : ClangBuiltin<"__builtin_arm_smladx">,
0238     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0239                            llvm_i32_ty],
0240                           [IntrNoMem]>;
0241 def int_arm_smlald : ClangBuiltin<"__builtin_arm_smlald">,
0242     DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty,
0243                            llvm_i64_ty],
0244                           [IntrNoMem]>;
0245 def int_arm_smlaldx : ClangBuiltin<"__builtin_arm_smlaldx">,
0246     DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty,
0247                            llvm_i64_ty],
0248                           [IntrNoMem]>;
0249 def int_arm_smlsd : ClangBuiltin<"__builtin_arm_smlsd">,
0250     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0251                            llvm_i32_ty],
0252                           [IntrNoMem]>;
0253 def int_arm_smlsdx : ClangBuiltin<"__builtin_arm_smlsdx">,
0254     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0255                            llvm_i32_ty],
0256                           [IntrNoMem]>;
0257 def int_arm_smlsld : ClangBuiltin<"__builtin_arm_smlsld">,
0258     DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty,
0259                            llvm_i64_ty],
0260                           [IntrNoMem]>;
0261 def int_arm_smlsldx : ClangBuiltin<"__builtin_arm_smlsldx">,
0262     DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty,
0263                            llvm_i64_ty],
0264                           [IntrNoMem]>;
0265 def int_arm_smuad : ClangBuiltin<"__builtin_arm_smuad">,
0266     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0267                           [IntrNoMem]>;
0268 def int_arm_smuadx : ClangBuiltin<"__builtin_arm_smuadx">,
0269     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0270                           [IntrNoMem]>;
0271 def int_arm_smusd : ClangBuiltin<"__builtin_arm_smusd">,
0272     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0273                           [IntrNoMem]>;
0274 def int_arm_smusdx : ClangBuiltin<"__builtin_arm_smusdx">,
0275     DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
0276                           [IntrNoMem]>;
0277 
0278 
0279 //===----------------------------------------------------------------------===//
0280 // Load, Store and Clear exclusive
0281 
0282 // TODO: Add applicable default attributes.
0283 def int_arm_ldrex : Intrinsic<[llvm_i32_ty], [llvm_anyptr_ty]>;
0284 def int_arm_strex : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_anyptr_ty]>;
0285 
0286 def int_arm_ldaex : Intrinsic<[llvm_i32_ty], [llvm_anyptr_ty]>;
0287 def int_arm_stlex : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_anyptr_ty]>;
0288 
0289 def int_arm_clrex : Intrinsic<[]>;
0290 
0291 def int_arm_strexd : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty,
0292     llvm_ptr_ty]>;
0293 def int_arm_ldrexd : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [llvm_ptr_ty]>;
0294 
0295 def int_arm_stlexd : Intrinsic<[llvm_i32_ty],
0296                                [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty]>;
0297 def int_arm_ldaexd : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [llvm_ptr_ty]>;
0298 
0299 //===----------------------------------------------------------------------===//
0300 // Data barrier instructions
0301 
0302 // TODO: Add applicable default attributes.
0303 def int_arm_dmb : ClangBuiltin<"__builtin_arm_dmb">, MSBuiltin<"__dmb">,
0304                   Intrinsic<[], [llvm_i32_ty]>;
0305 def int_arm_dsb : ClangBuiltin<"__builtin_arm_dsb">, MSBuiltin<"__dsb">,
0306                   Intrinsic<[], [llvm_i32_ty]>;
0307 def int_arm_isb : ClangBuiltin<"__builtin_arm_isb">, MSBuiltin<"__isb">,
0308                   Intrinsic<[], [llvm_i32_ty]>;
0309 
0310 //===----------------------------------------------------------------------===//
0311 // VFP
0312 
0313 def int_arm_get_fpscr : ClangBuiltin<"__builtin_arm_get_fpscr">,
0314                        DefaultAttrsIntrinsic<[llvm_i32_ty], [], []>;
0315 def int_arm_set_fpscr : ClangBuiltin<"__builtin_arm_set_fpscr">,
0316                        DefaultAttrsIntrinsic<[], [llvm_i32_ty], []>;
0317 def int_arm_vcvtr : DefaultAttrsIntrinsic<[llvm_float_ty],
0318                                           [llvm_anyfloat_ty], [IntrNoMem]>;
0319 def int_arm_vcvtru : DefaultAttrsIntrinsic<[llvm_float_ty], [llvm_anyfloat_ty],
0320                                            [IntrNoMem]>;
0321 
0322 //===----------------------------------------------------------------------===//
0323 // Coprocessor
0324 
0325 // TODO: Add applicable default attributes.
0326 def int_arm_ldc : ClangBuiltin<"__builtin_arm_ldc">,
0327    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0328 def int_arm_ldcl : ClangBuiltin<"__builtin_arm_ldcl">,
0329    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0330 def int_arm_ldc2 : ClangBuiltin<"__builtin_arm_ldc2">,
0331    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0332 def int_arm_ldc2l : ClangBuiltin<"__builtin_arm_ldc2l">,
0333    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0334 
0335 def int_arm_stc : ClangBuiltin<"__builtin_arm_stc">,
0336    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0337 def int_arm_stcl : ClangBuiltin<"__builtin_arm_stcl">,
0338    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0339 def int_arm_stc2 : ClangBuiltin<"__builtin_arm_stc2">,
0340    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0341 def int_arm_stc2l : ClangBuiltin<"__builtin_arm_stc2l">,
0342    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>]>;
0343 
0344 // Move to coprocessor
0345 def int_arm_mcr : ClangBuiltin<"__builtin_arm_mcr">,
0346    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0347                   llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>, ImmArg<ArgIndex<5>>]>;
0348 def int_arm_mcr2 : ClangBuiltin<"__builtin_arm_mcr2">,
0349    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0350                   llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>, ImmArg<ArgIndex<5>>]>;
0351 
0352 // Move from coprocessor
0353 def int_arm_mrc : ClangBuiltin<"__builtin_arm_mrc">,
0354                   MSBuiltin<"_MoveFromCoprocessor">,
0355    Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0356                              llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>]>;
0357 def int_arm_mrc2 : ClangBuiltin<"__builtin_arm_mrc2">,
0358                    MSBuiltin<"_MoveFromCoprocessor2">,
0359    Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0360                              llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>]>;
0361 
0362 // Coprocessor data processing
0363 def int_arm_cdp : ClangBuiltin<"__builtin_arm_cdp">,
0364    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0365                   llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>, ImmArg<ArgIndex<5>>]>;
0366 def int_arm_cdp2 : ClangBuiltin<"__builtin_arm_cdp2">,
0367    Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0368                   llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>, ImmArg<ArgIndex<5>>]>;
0369 
0370 // Move from two registers to coprocessor
0371 def int_arm_mcrr : Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0372                                   llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<4>>]>;
0373 def int_arm_mcrr2 : Intrinsic<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
0374                                    llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<4>>]>;
0375 
0376 def int_arm_mrrc : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [llvm_i32_ty,
0377                               llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
0378 def int_arm_mrrc2 : Intrinsic<[llvm_i32_ty, llvm_i32_ty], [llvm_i32_ty,
0379                                llvm_i32_ty, llvm_i32_ty], [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
0380 
0381 //===----------------------------------------------------------------------===//
0382 // CRC32
0383 
0384 def int_arm_crc32b : DefaultAttrsIntrinsic<
0385     [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
0386 def int_arm_crc32cb : DefaultAttrsIntrinsic<
0387     [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
0388 def int_arm_crc32h  : DefaultAttrsIntrinsic<
0389     [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
0390 def int_arm_crc32ch : DefaultAttrsIntrinsic<
0391     [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
0392 def int_arm_crc32w  : DefaultAttrsIntrinsic<
0393     [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
0394 def int_arm_crc32cw : DefaultAttrsIntrinsic<
0395     [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
0396 
0397 //===----------------------------------------------------------------------===//
0398 // CMSE
0399 
0400 // TODO: Add applicable default attributes.
0401 def int_arm_cmse_tt : ClangBuiltin<"__builtin_arm_cmse_TT">,
0402     Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrNoMem]>;
0403 def int_arm_cmse_ttt : ClangBuiltin<"__builtin_arm_cmse_TTT">,
0404     Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrNoMem]>;
0405 def int_arm_cmse_tta : ClangBuiltin<"__builtin_arm_cmse_TTA">,
0406     Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrNoMem]>;
0407 def int_arm_cmse_ttat : ClangBuiltin<"__builtin_arm_cmse_TTAT">,
0408     Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrNoMem]>;
0409 
0410 //===----------------------------------------------------------------------===//
0411 // HINT
0412 
0413 // TODO: Add applicable default attributes.
0414 def int_arm_hint : Intrinsic<[], [llvm_i32_ty]>;
0415 def int_arm_dbg : Intrinsic<[], [llvm_i32_ty]>;
0416 
0417 //===----------------------------------------------------------------------===//
0418 // UND (reserved undefined sequence)
0419 
0420 // TODO: Add applicable default attributes.
0421 def int_arm_undefined : Intrinsic<[], [llvm_i32_ty]>;
0422 
0423 //===----------------------------------------------------------------------===//
0424 // Advanced SIMD (NEON)
0425 
0426 // The following classes do not correspond directly to GCC builtins.
0427 class Neon_1Arg_Intrinsic
0428   : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>], [IntrNoMem]>;
0429 class Neon_1Arg_Narrow_Intrinsic
0430   : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMExtendedType<0>],
0431                           [IntrNoMem]>;
0432 class Neon_2Arg_Intrinsic
0433   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0434                           [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
0435 class Neon_2Arg_Narrow_Intrinsic
0436   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0437                           [LLVMExtendedType<0>, LLVMExtendedType<0>],
0438                           [IntrNoMem]>;
0439 class Neon_2Arg_Long_Intrinsic
0440   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0441                           [LLVMTruncatedType<0>, LLVMTruncatedType<0>],
0442                           [IntrNoMem]>;
0443 class Neon_3Arg_Intrinsic
0444   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0445                           [LLVMMatchType<0>, LLVMMatchType<0>,
0446                            LLVMMatchType<0>],
0447                           [IntrNoMem]>;
0448 class Neon_3Arg_Long_Intrinsic
0449   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0450                           [LLVMMatchType<0>, LLVMTruncatedType<0>,
0451                            LLVMTruncatedType<0>],
0452                           [IntrNoMem]>;
0453 
0454 class Neon_1FloatArg_Intrinsic
0455   : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
0456 
0457 class Neon_CvtFxToFP_Intrinsic
0458   : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [llvm_anyint_ty, llvm_i32_ty],
0459                           [IntrNoMem]>;
0460 class Neon_CvtFPToFx_Intrinsic
0461   : DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty, llvm_i32_ty],
0462                           [IntrNoMem]>;
0463 class Neon_CvtFPtoInt_1Arg_Intrinsic
0464   : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty],
0465                           [IntrNoMem]>;
0466 
0467 class Neon_Compare_Intrinsic
0468   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0469                           [llvm_anyvector_ty, LLVMMatchType<1>], [IntrNoMem]>;
0470 
0471 // The table operands for VTBL and VTBX consist of 1 to 4 v8i8 vectors.
0472 // Besides the table, VTBL has one other v8i8 argument and VTBX has two.
0473 // Overall, the classes range from 2 to 6 v8i8 arguments.
0474 class Neon_Tbl2Arg_Intrinsic
0475   : DefaultAttrsIntrinsic<[llvm_v8i8_ty],
0476                           [llvm_v8i8_ty, llvm_v8i8_ty], [IntrNoMem]>;
0477 class Neon_Tbl3Arg_Intrinsic
0478   : DefaultAttrsIntrinsic<[llvm_v8i8_ty],
0479                           [llvm_v8i8_ty, llvm_v8i8_ty, llvm_v8i8_ty],
0480                           [IntrNoMem]>;
0481 class Neon_Tbl4Arg_Intrinsic
0482   : DefaultAttrsIntrinsic<[llvm_v8i8_ty],
0483                           [llvm_v8i8_ty, llvm_v8i8_ty, llvm_v8i8_ty,
0484                            llvm_v8i8_ty],
0485                           [IntrNoMem]>;
0486 class Neon_Tbl5Arg_Intrinsic
0487   : DefaultAttrsIntrinsic<[llvm_v8i8_ty],
0488                           [llvm_v8i8_ty, llvm_v8i8_ty, llvm_v8i8_ty,
0489                            llvm_v8i8_ty, llvm_v8i8_ty],
0490                           [IntrNoMem]>;
0491 class Neon_Tbl6Arg_Intrinsic
0492   : DefaultAttrsIntrinsic<[llvm_v8i8_ty],
0493                           [llvm_v8i8_ty, llvm_v8i8_ty, llvm_v8i8_ty,
0494                            llvm_v8i8_ty, llvm_v8i8_ty, llvm_v8i8_ty],
0495                           [IntrNoMem]>;
0496 
0497 // Arithmetic ops
0498 
0499 let IntrProperties = [IntrNoMem, Commutative] in {
0500 
0501   // Vector Add.
0502   def int_arm_neon_vhadds : Neon_2Arg_Intrinsic;
0503   def int_arm_neon_vhaddu : Neon_2Arg_Intrinsic;
0504   def int_arm_neon_vrhadds : Neon_2Arg_Intrinsic;
0505   def int_arm_neon_vrhaddu : Neon_2Arg_Intrinsic;
0506   def int_arm_neon_vraddhn : Neon_2Arg_Narrow_Intrinsic;
0507 
0508   // Vector Multiply.
0509   def int_arm_neon_vmulp : Neon_2Arg_Intrinsic;
0510   def int_arm_neon_vqdmulh : Neon_2Arg_Intrinsic;
0511   def int_arm_neon_vqrdmulh : Neon_2Arg_Intrinsic;
0512   def int_arm_neon_vmulls : Neon_2Arg_Long_Intrinsic;
0513   def int_arm_neon_vmullu : Neon_2Arg_Long_Intrinsic;
0514   def int_arm_neon_vmullp : Neon_2Arg_Long_Intrinsic;
0515   def int_arm_neon_vqdmull : Neon_2Arg_Long_Intrinsic;
0516 
0517   // Vector Maximum.
0518   def int_arm_neon_vmaxs : Neon_2Arg_Intrinsic;
0519   def int_arm_neon_vmaxu : Neon_2Arg_Intrinsic;
0520   def int_arm_neon_vmaxnm : Neon_2Arg_Intrinsic;
0521 
0522   // Vector Minimum.
0523   def int_arm_neon_vmins : Neon_2Arg_Intrinsic;
0524   def int_arm_neon_vminu : Neon_2Arg_Intrinsic;
0525   def int_arm_neon_vminnm : Neon_2Arg_Intrinsic;
0526 
0527   // Vector Reciprocal Step.
0528   def int_arm_neon_vrecps : Neon_2Arg_Intrinsic;
0529 
0530   // Vector Reciprocal Square Root Step.
0531   def int_arm_neon_vrsqrts : Neon_2Arg_Intrinsic;
0532 }
0533 
0534 // Vector Subtract.
0535 def int_arm_neon_vhsubs : Neon_2Arg_Intrinsic;
0536 def int_arm_neon_vhsubu : Neon_2Arg_Intrinsic;
0537 def int_arm_neon_vrsubhn : Neon_2Arg_Narrow_Intrinsic;
0538 
0539 // Vector Absolute Compare.
0540 def int_arm_neon_vacge : Neon_Compare_Intrinsic;
0541 def int_arm_neon_vacgt : Neon_Compare_Intrinsic;
0542 
0543 // Vector Absolute Differences.
0544 def int_arm_neon_vabds : Neon_2Arg_Intrinsic;
0545 def int_arm_neon_vabdu : Neon_2Arg_Intrinsic;
0546 
0547 // Vector Pairwise Add.
0548 def int_arm_neon_vpadd : Neon_2Arg_Intrinsic;
0549 
0550 // Vector Pairwise Add Long.
0551 // Note: This is different than the other "long" NEON intrinsics because
0552 // the result vector has half as many elements as the source vector.
0553 // The source and destination vector types must be specified separately.
0554 def int_arm_neon_vpaddls : DefaultAttrsIntrinsic<
0555     [llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>;
0556 def int_arm_neon_vpaddlu : DefaultAttrsIntrinsic<
0557     [llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>;
0558 
0559 // Vector Pairwise Add and Accumulate Long.
0560 // Note: This is similar to vpaddl but the destination vector also appears
0561 // as the first argument.
0562 def int_arm_neon_vpadals : DefaultAttrsIntrinsic<
0563     [llvm_anyvector_ty], [LLVMMatchType<0>, llvm_anyvector_ty], [IntrNoMem]>;
0564 def int_arm_neon_vpadalu : DefaultAttrsIntrinsic<
0565     [llvm_anyvector_ty], [LLVMMatchType<0>, llvm_anyvector_ty], [IntrNoMem]>;
0566 
0567 // Vector Pairwise Maximum and Minimum.
0568 def int_arm_neon_vpmaxs : Neon_2Arg_Intrinsic;
0569 def int_arm_neon_vpmaxu : Neon_2Arg_Intrinsic;
0570 def int_arm_neon_vpmins : Neon_2Arg_Intrinsic;
0571 def int_arm_neon_vpminu : Neon_2Arg_Intrinsic;
0572 
0573 // Vector Shifts:
0574 //
0575 // The various saturating and rounding vector shift operations need to be
0576 // represented by intrinsics in LLVM, and even the basic VSHL variable shift
0577 // operation cannot be safely translated to LLVM's shift operators.  VSHL can
0578 // be used for both left and right shifts, or even combinations of the two,
0579 // depending on the signs of the shift amounts.  It also has well-defined
0580 // behavior for shift amounts that LLVM leaves undefined.  Only basic shifts
0581 // by constants can be represented with LLVM's shift operators.
0582 //
0583 // The shift counts for these intrinsics are always vectors, even for constant
0584 // shifts, where the constant is replicated.  For consistency with VSHL (and
0585 // other variable shift instructions), left shifts have positive shift counts
0586 // and right shifts have negative shift counts.  This convention is also used
0587 // for constant right shift intrinsics, and to help preserve sanity, the
0588 // intrinsic names use "shift" instead of either "shl" or "shr".  Where
0589 // applicable, signed and unsigned versions of the intrinsics are
0590 // distinguished with "s" and "u" suffixes.  A few NEON shift instructions,
0591 // such as VQSHLU, take signed operands but produce unsigned results; these
0592 // use a "su" suffix.
0593 
0594 // Vector Shift.
0595 def int_arm_neon_vshifts : Neon_2Arg_Intrinsic;
0596 def int_arm_neon_vshiftu : Neon_2Arg_Intrinsic;
0597 
0598 // Vector Rounding Shift.
0599 def int_arm_neon_vrshifts : Neon_2Arg_Intrinsic;
0600 def int_arm_neon_vrshiftu : Neon_2Arg_Intrinsic;
0601 def int_arm_neon_vrshiftn : Neon_2Arg_Narrow_Intrinsic;
0602 
0603 // Vector Saturating Shift.
0604 def int_arm_neon_vqshifts : Neon_2Arg_Intrinsic;
0605 def int_arm_neon_vqshiftu : Neon_2Arg_Intrinsic;
0606 def int_arm_neon_vqshiftsu : Neon_2Arg_Intrinsic;
0607 def int_arm_neon_vqshiftns : Neon_2Arg_Narrow_Intrinsic;
0608 def int_arm_neon_vqshiftnu : Neon_2Arg_Narrow_Intrinsic;
0609 def int_arm_neon_vqshiftnsu : Neon_2Arg_Narrow_Intrinsic;
0610 
0611 // Vector Saturating Rounding Shift.
0612 def int_arm_neon_vqrshifts : Neon_2Arg_Intrinsic;
0613 def int_arm_neon_vqrshiftu : Neon_2Arg_Intrinsic;
0614 def int_arm_neon_vqrshiftns : Neon_2Arg_Narrow_Intrinsic;
0615 def int_arm_neon_vqrshiftnu : Neon_2Arg_Narrow_Intrinsic;
0616 def int_arm_neon_vqrshiftnsu : Neon_2Arg_Narrow_Intrinsic;
0617 
0618 // Vector Shift and Insert.
0619 def int_arm_neon_vshiftins : Neon_3Arg_Intrinsic;
0620 
0621 // Vector Absolute Value and Saturating Absolute Value.
0622 def int_arm_neon_vabs : Neon_1Arg_Intrinsic;
0623 def int_arm_neon_vqabs : Neon_1Arg_Intrinsic;
0624 
0625 // Vector Saturating Negate.
0626 def int_arm_neon_vqneg : Neon_1Arg_Intrinsic;
0627 
0628 // Vector Count Leading Sign/Zero Bits.
0629 def int_arm_neon_vcls : Neon_1Arg_Intrinsic;
0630 
0631 // Vector Reciprocal Estimate.
0632 def int_arm_neon_vrecpe : Neon_1Arg_Intrinsic;
0633 
0634 // Vector Reciprocal Square Root Estimate.
0635 def int_arm_neon_vrsqrte : Neon_1Arg_Intrinsic;
0636 
0637 // Vector Conversions Between Floating-point and Integer
0638 def int_arm_neon_vcvtau : Neon_CvtFPtoInt_1Arg_Intrinsic;
0639 def int_arm_neon_vcvtas : Neon_CvtFPtoInt_1Arg_Intrinsic;
0640 def int_arm_neon_vcvtnu : Neon_CvtFPtoInt_1Arg_Intrinsic;
0641 def int_arm_neon_vcvtns : Neon_CvtFPtoInt_1Arg_Intrinsic;
0642 def int_arm_neon_vcvtpu : Neon_CvtFPtoInt_1Arg_Intrinsic;
0643 def int_arm_neon_vcvtps : Neon_CvtFPtoInt_1Arg_Intrinsic;
0644 def int_arm_neon_vcvtmu : Neon_CvtFPtoInt_1Arg_Intrinsic;
0645 def int_arm_neon_vcvtms : Neon_CvtFPtoInt_1Arg_Intrinsic;
0646 
0647 // Vector Conversions Between Floating-point and Fixed-point.
0648 def int_arm_neon_vcvtfp2fxs : Neon_CvtFPToFx_Intrinsic;
0649 def int_arm_neon_vcvtfp2fxu : Neon_CvtFPToFx_Intrinsic;
0650 def int_arm_neon_vcvtfxs2fp : Neon_CvtFxToFP_Intrinsic;
0651 def int_arm_neon_vcvtfxu2fp : Neon_CvtFxToFP_Intrinsic;
0652 
0653 // Vector Conversions Between Half-Precision and Single-Precision.
0654 def int_arm_neon_vcvtfp2hf
0655     : DefaultAttrsIntrinsic<[llvm_v4i16_ty], [llvm_v4f32_ty], [IntrNoMem]>;
0656 def int_arm_neon_vcvthf2fp
0657     : DefaultAttrsIntrinsic<[llvm_v4f32_ty], [llvm_v4i16_ty], [IntrNoMem]>;
0658 
0659 // Narrowing Saturating Vector Moves.
0660 def int_arm_neon_vqmovns : Neon_1Arg_Narrow_Intrinsic;
0661 def int_arm_neon_vqmovnu : Neon_1Arg_Narrow_Intrinsic;
0662 def int_arm_neon_vqmovnsu : Neon_1Arg_Narrow_Intrinsic;
0663 
0664 // Vector Table Lookup.
0665 // The first 1-4 arguments are the table.
0666 def int_arm_neon_vtbl1 : Neon_Tbl2Arg_Intrinsic;
0667 def int_arm_neon_vtbl2 : Neon_Tbl3Arg_Intrinsic;
0668 def int_arm_neon_vtbl3 : Neon_Tbl4Arg_Intrinsic;
0669 def int_arm_neon_vtbl4 : Neon_Tbl5Arg_Intrinsic;
0670 
0671 // Vector Table Extension.
0672 // Some elements of the destination vector may not be updated, so the original
0673 // value of that vector is passed as the first argument.  The next 1-4
0674 // arguments after that are the table.
0675 def int_arm_neon_vtbx1 : Neon_Tbl3Arg_Intrinsic;
0676 def int_arm_neon_vtbx2 : Neon_Tbl4Arg_Intrinsic;
0677 def int_arm_neon_vtbx3 : Neon_Tbl5Arg_Intrinsic;
0678 def int_arm_neon_vtbx4 : Neon_Tbl6Arg_Intrinsic;
0679 
0680 // Vector and Scalar Rounding.
0681 def int_arm_neon_vrintn : Neon_1FloatArg_Intrinsic;
0682 def int_arm_neon_vrintx : Neon_1Arg_Intrinsic;
0683 def int_arm_neon_vrinta : Neon_1Arg_Intrinsic;
0684 def int_arm_neon_vrintz : Neon_1Arg_Intrinsic;
0685 def int_arm_neon_vrintm : Neon_1Arg_Intrinsic;
0686 def int_arm_neon_vrintp : Neon_1Arg_Intrinsic;
0687 
0688 // De-interleaving vector loads from N-element structures.
0689 // Source operands are the address and alignment.
0690 def int_arm_neon_vld1 : DefaultAttrsIntrinsic<
0691     [llvm_anyvector_ty], [llvm_anyptr_ty, llvm_i32_ty],
0692     [IntrReadMem, IntrArgMemOnly]>;
0693 def int_arm_neon_vld2 : DefaultAttrsIntrinsic<
0694     [llvm_anyvector_ty, LLVMMatchType<0>], [llvm_anyptr_ty, llvm_i32_ty],
0695     [IntrReadMem, IntrArgMemOnly]>;
0696 def int_arm_neon_vld3 : DefaultAttrsIntrinsic<
0697     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>],
0698     [llvm_anyptr_ty, llvm_i32_ty], [IntrReadMem, IntrArgMemOnly]>;
0699 def int_arm_neon_vld4 : DefaultAttrsIntrinsic<
0700     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
0701     [llvm_anyptr_ty, llvm_i32_ty], [IntrReadMem, IntrArgMemOnly]>;
0702 
0703 def int_arm_neon_vld1x2 : DefaultAttrsIntrinsic<
0704     [llvm_anyvector_ty, LLVMMatchType<0>],
0705     [llvm_anyptr_ty], [IntrReadMem, IntrArgMemOnly]>;
0706 def int_arm_neon_vld1x3 : DefaultAttrsIntrinsic<
0707     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>],
0708     [llvm_anyptr_ty], [IntrReadMem, IntrArgMemOnly]>;
0709 def int_arm_neon_vld1x4 : DefaultAttrsIntrinsic<
0710     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
0711     [llvm_anyptr_ty], [IntrReadMem, IntrArgMemOnly]>;
0712 
0713 // Vector load N-element structure to one lane.
0714 // Source operands are: the address, the N input vectors (since only one
0715 // lane is assigned), the lane number, and the alignment.
0716 def int_arm_neon_vld2lane : DefaultAttrsIntrinsic<
0717     [llvm_anyvector_ty, LLVMMatchType<0>],
0718     [llvm_anyptr_ty, LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty,
0719      llvm_i32_ty],
0720     [IntrReadMem, IntrArgMemOnly]>;
0721 def int_arm_neon_vld3lane : DefaultAttrsIntrinsic<
0722     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>],
0723     [llvm_anyptr_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>,
0724      llvm_i32_ty, llvm_i32_ty],
0725     [IntrReadMem, IntrArgMemOnly]>;
0726 def int_arm_neon_vld4lane : DefaultAttrsIntrinsic<
0727     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
0728     [llvm_anyptr_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>,
0729      LLVMMatchType<0>, llvm_i32_ty, llvm_i32_ty],
0730     [IntrReadMem, IntrArgMemOnly]>;
0731 
0732 // Vector load N-element structure to all lanes.
0733 // Source operands are the address and alignment.
0734 def int_arm_neon_vld2dup : DefaultAttrsIntrinsic<
0735     [llvm_anyvector_ty, LLVMMatchType<0>], [llvm_anyptr_ty, llvm_i32_ty],
0736     [IntrReadMem, IntrArgMemOnly]>;
0737 def int_arm_neon_vld3dup : DefaultAttrsIntrinsic<
0738     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>],
0739     [llvm_anyptr_ty, llvm_i32_ty], [IntrReadMem, IntrArgMemOnly]>;
0740 def int_arm_neon_vld4dup : DefaultAttrsIntrinsic<
0741     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
0742     [llvm_anyptr_ty, llvm_i32_ty], [IntrReadMem, IntrArgMemOnly]>;
0743 
0744 // Interleaving vector stores from N-element structures.
0745 // Source operands are: the address, the N vectors, and the alignment.
0746 def int_arm_neon_vst1 : DefaultAttrsIntrinsic<
0747     [], [llvm_anyptr_ty, llvm_anyvector_ty, llvm_i32_ty], [IntrArgMemOnly]>;
0748 def int_arm_neon_vst2 : DefaultAttrsIntrinsic<
0749     [], [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty],
0750     [IntrArgMemOnly]>;
0751 def int_arm_neon_vst3 : DefaultAttrsIntrinsic<
0752     [],
0753     [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
0754      llvm_i32_ty],
0755     [IntrArgMemOnly]>;
0756 def int_arm_neon_vst4 : DefaultAttrsIntrinsic<
0757     [],
0758     [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
0759      LLVMMatchType<1>, llvm_i32_ty],
0760     [IntrArgMemOnly]>;
0761 
0762 def int_arm_neon_vst1x2 : DefaultAttrsIntrinsic<
0763     [], [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>],
0764     [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
0765 def int_arm_neon_vst1x3 : DefaultAttrsIntrinsic<
0766     [], [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>],
0767     [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
0768 def int_arm_neon_vst1x4 : DefaultAttrsIntrinsic<
0769     [],
0770     [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
0771      LLVMMatchType<1>],
0772     [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>;
0773 
0774 // Vector store N-element structure from one lane.
0775 // Source operands are: the address, the N vectors, the lane number, and
0776 // the alignment.
0777 def int_arm_neon_vst2lane : DefaultAttrsIntrinsic<
0778     [],
0779     [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty,
0780      llvm_i32_ty],
0781     [IntrArgMemOnly]>;
0782 def int_arm_neon_vst3lane : DefaultAttrsIntrinsic<
0783     [],
0784     [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
0785      llvm_i32_ty, llvm_i32_ty],
0786     [IntrArgMemOnly]>;
0787 def int_arm_neon_vst4lane : DefaultAttrsIntrinsic<
0788     [],
0789     [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
0790      LLVMMatchType<1>, llvm_i32_ty, llvm_i32_ty],
0791     [IntrArgMemOnly]>;
0792 
0793 // Vector bitwise select.
0794 def int_arm_neon_vbsl : DefaultAttrsIntrinsic<
0795     [llvm_anyvector_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
0796     [IntrNoMem]>;
0797 
0798 
0799 // Crypto instructions
0800 class AES_1Arg_Intrinsic : DefaultAttrsIntrinsic<
0801     [llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem]>;
0802 class AES_2Arg_Intrinsic : DefaultAttrsIntrinsic<
0803     [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
0804 
0805 class SHA_1Arg_Intrinsic : DefaultAttrsIntrinsic<
0806     [llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
0807 class SHA_2Arg_Intrinsic : DefaultAttrsIntrinsic<
0808     [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
0809 class SHA_3Arg_i32_Intrinsic : DefaultAttrsIntrinsic<
0810     [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i32_ty, llvm_v4i32_ty], [IntrNoMem]>;
0811 class SHA_3Arg_v4i32_Intrinsic : DefaultAttrsIntrinsic<
0812     [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,llvm_v4i32_ty], [IntrNoMem]>;
0813 
0814 def int_arm_neon_aesd : AES_2Arg_Intrinsic;
0815 def int_arm_neon_aese : AES_2Arg_Intrinsic;
0816 def int_arm_neon_aesimc : AES_1Arg_Intrinsic;
0817 def int_arm_neon_aesmc : AES_1Arg_Intrinsic;
0818 def int_arm_neon_sha1h : SHA_1Arg_Intrinsic;
0819 def int_arm_neon_sha1su1 : SHA_2Arg_Intrinsic;
0820 def int_arm_neon_sha256su0 : SHA_2Arg_Intrinsic;
0821 def int_arm_neon_sha1c : SHA_3Arg_i32_Intrinsic;
0822 def int_arm_neon_sha1m : SHA_3Arg_i32_Intrinsic;
0823 def int_arm_neon_sha1p : SHA_3Arg_i32_Intrinsic;
0824 def int_arm_neon_sha1su0: SHA_3Arg_v4i32_Intrinsic;
0825 def int_arm_neon_sha256h: SHA_3Arg_v4i32_Intrinsic;
0826 def int_arm_neon_sha256h2: SHA_3Arg_v4i32_Intrinsic;
0827 def int_arm_neon_sha256su1: SHA_3Arg_v4i32_Intrinsic;
0828 
0829 def int_arm_neon_vqrdmlah : Neon_3Arg_Intrinsic;
0830 def int_arm_neon_vqrdmlsh : Neon_3Arg_Intrinsic;
0831 
0832 // Armv8.2-A dot product instructions
0833 class Neon_Dot_Intrinsic
0834   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0835                           [LLVMMatchType<0>, llvm_anyvector_ty,
0836                            LLVMMatchType<1>],
0837                           [IntrNoMem]>;
0838 def int_arm_neon_udot : Neon_Dot_Intrinsic;
0839 def int_arm_neon_sdot : Neon_Dot_Intrinsic;
0840 
0841 // v8.6-A Matrix Multiply Intrinsics
0842 class Neon_MatMul_Intrinsic
0843   : DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0844                           [LLVMMatchType<0>, llvm_anyvector_ty,
0845                            LLVMMatchType<1>],
0846                           [IntrNoMem]>;
0847 def int_arm_neon_ummla  : Neon_MatMul_Intrinsic;
0848 def int_arm_neon_smmla  : Neon_MatMul_Intrinsic;
0849 def int_arm_neon_usmmla : Neon_MatMul_Intrinsic;
0850 def int_arm_neon_usdot  : Neon_Dot_Intrinsic;
0851 
0852 // v8.6-A Bfloat Intrinsics
0853 def int_arm_neon_vcvtfp2bf
0854     : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [llvm_v4f32_ty], [IntrNoMem]>;
0855 def int_arm_neon_vcvtbfp2bf
0856     : DefaultAttrsIntrinsic<[llvm_bfloat_ty], [llvm_float_ty], [IntrNoMem]>;
0857 
0858 def int_arm_neon_bfdot : Neon_Dot_Intrinsic;
0859 def int_arm_neon_bfmmla
0860     : DefaultAttrsIntrinsic<[llvm_v4f32_ty],
0861                             [llvm_v4f32_ty, llvm_v8bf16_ty, llvm_v8bf16_ty],
0862                             [IntrNoMem]>;
0863 
0864 class Neon_BF16FML_Intrinsic
0865     : DefaultAttrsIntrinsic<[llvm_v4f32_ty],
0866                             [llvm_v4f32_ty, llvm_v8bf16_ty, llvm_v8bf16_ty],
0867                             [IntrNoMem]>;
0868 def int_arm_neon_bfmlalb : Neon_BF16FML_Intrinsic;
0869 def int_arm_neon_bfmlalt : Neon_BF16FML_Intrinsic;
0870 
0871 def int_arm_cls: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty],
0872                                        [IntrNoMem]>;
0873 def int_arm_cls64: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i64_ty],
0874                                          [IntrNoMem]>;
0875 
0876 def int_arm_mve_vctp8  : DefaultAttrsIntrinsic<[llvm_v16i1_ty], [llvm_i32_ty],
0877                                                [IntrNoMem]>;
0878 def int_arm_mve_vctp16 : DefaultAttrsIntrinsic<[llvm_v8i1_ty], [llvm_i32_ty],
0879                                                [IntrNoMem]>;
0880 def int_arm_mve_vctp32 : DefaultAttrsIntrinsic<[llvm_v4i1_ty], [llvm_i32_ty],
0881                                                [IntrNoMem]>;
0882 def int_arm_mve_vctp64 : DefaultAttrsIntrinsic<[llvm_v2i1_ty], [llvm_i32_ty],
0883                                                [IntrNoMem]>;
0884 
0885 // v8.3-A Floating-point complex add
0886 def int_arm_neon_vcadd_rot90  : Neon_2Arg_Intrinsic;
0887 def int_arm_neon_vcadd_rot270 : Neon_2Arg_Intrinsic;
0888 
0889 // GNU eabi mcount
0890 // TODO: Add applicable default attributes.
0891 def int_arm_gnu_eabi_mcount : Intrinsic<[], [], []>;
0892 
0893 def int_arm_mve_pred_i2v : DefaultAttrsIntrinsic<
0894   [llvm_anyvector_ty], [llvm_i32_ty], [IntrNoMem]>;
0895 def int_arm_mve_pred_v2i : DefaultAttrsIntrinsic<
0896   [llvm_i32_ty], [llvm_anyvector_ty], [IntrNoMem]>;
0897 def int_arm_mve_vreinterpretq : DefaultAttrsIntrinsic<
0898   [llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>;
0899 
0900 def int_arm_mve_min_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0901    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0902     llvm_anyvector_ty, LLVMMatchType<0>],
0903    [IntrNoMem]>;
0904 def int_arm_mve_max_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0905    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0906     llvm_anyvector_ty, LLVMMatchType<0>],
0907    [IntrNoMem]>;
0908 def int_arm_mve_abd_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0909    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0910     llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
0911 def int_arm_mve_add_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0912    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0913    [IntrNoMem]>;
0914 def int_arm_mve_and_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0915    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0916    [IntrNoMem]>;
0917 def int_arm_mve_bic_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0918    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0919    [IntrNoMem]>;
0920 def int_arm_mve_eor_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0921    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0922    [IntrNoMem]>;
0923 def int_arm_mve_orn_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0924    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0925    [IntrNoMem]>;
0926 def int_arm_mve_orr_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0927    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0928    [IntrNoMem]>;
0929 def int_arm_mve_sub_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0930    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0931    [IntrNoMem]>;
0932 def int_arm_mve_mul_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0933    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0934    [IntrNoMem]>;
0935 def int_arm_mve_mulh_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0936    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0937     llvm_anyvector_ty, LLVMMatchType<0>],
0938    [IntrNoMem]>;
0939 def int_arm_mve_qdmulh_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0940    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0941    [IntrNoMem]>;
0942 def int_arm_mve_rmulh_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0943    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0944     llvm_anyvector_ty, LLVMMatchType<0>],
0945    [IntrNoMem]>;
0946 def int_arm_mve_qrdmulh_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0947    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
0948    [IntrNoMem]>;
0949 def int_arm_mve_mull_int_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0950    [llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty /* unsigned */,
0951     llvm_i32_ty /* top */, llvm_anyvector_ty, LLVMMatchType<0>],
0952    [IntrNoMem]>;
0953 def int_arm_mve_mull_poly_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0954    [llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty, llvm_anyvector_ty,
0955     LLVMMatchType<0>],
0956    [IntrNoMem]>;
0957 def int_arm_mve_qadd_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0958    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0959     llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
0960 def int_arm_mve_hadd_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0961    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0962     llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
0963 def int_arm_mve_rhadd_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0964    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0965     llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
0966 def int_arm_mve_qsub_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0967    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0968     llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
0969 def int_arm_mve_hsub_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0970    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */,
0971     llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
0972 def int_arm_mve_vmina_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0973    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty],
0974     [IntrNoMem]>;
0975 def int_arm_mve_vmaxa_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0976    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty],
0977     [IntrNoMem]>;
0978 def int_arm_mve_vminnma_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0979    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty],
0980     [IntrNoMem]>;
0981 def int_arm_mve_vmaxnma_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
0982    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyvector_ty],
0983     [IntrNoMem]>;
0984 
0985 multiclass MVEPredicated<list<LLVMType> rets, list<LLVMType> params,
0986                          LLVMType pred = llvm_anyvector_ty,
0987                          list<IntrinsicProperty> props = [IntrNoMem],
0988                          list<SDNodeProperty> sdprops = []> {
0989   def "": DefaultAttrsIntrinsic<rets, params, props, "", sdprops>;
0990   def _predicated: DefaultAttrsIntrinsic<rets, params # [pred], props, "",
0991                                          sdprops>;
0992 }
0993 multiclass MVEPredicatedM<list<LLVMType> rets, list<LLVMType> params,
0994                           LLVMType pred = llvm_anyvector_ty,
0995                           list<IntrinsicProperty> props = [IntrNoMem]> {
0996   def "": DefaultAttrsIntrinsic<rets, params, props>;
0997   def _predicated: DefaultAttrsIntrinsic<rets, params # [pred,
0998       !if(!eq(rets[0], llvm_anyvector_ty),
0999           LLVMMatchType<0>, rets[0])], props>;
1000 }
1001 
1002 multiclass MVE_minmaxv {
1003   defm v: MVEPredicated<[llvm_i32_ty],
1004      [llvm_i32_ty, llvm_anyvector_ty, llvm_i32_ty /* unsigned */]>;
1005   defm av: MVEPredicated<[llvm_i32_ty],
1006      [llvm_i32_ty, llvm_anyvector_ty]>;
1007   defm nmv: MVEPredicated<[llvm_anyfloat_ty],
1008      [LLVMMatchType<0>, llvm_anyvector_ty]>;
1009   defm nmav: MVEPredicated<[llvm_anyfloat_ty],
1010      [LLVMMatchType<0>, llvm_anyvector_ty]>;
1011 }
1012 defm int_arm_mve_min: MVE_minmaxv;
1013 defm int_arm_mve_max: MVE_minmaxv;
1014 
1015 defm int_arm_mve_addv: MVEPredicated<[llvm_i32_ty],
1016    [llvm_anyvector_ty, llvm_i32_ty /* unsigned */]>;
1017 defm int_arm_mve_addlv: MVEPredicated<[llvm_i64_ty],
1018    [llvm_anyvector_ty, llvm_i32_ty /* unsigned */]>;
1019 
1020 // Intrinsic with a predicated and a non-predicated case. The predicated case
1021 // has two additional parameters: inactive (the value for inactive lanes, can
1022 // be undef) and predicate.
1023 multiclass MVEMXPredicated<list<LLVMType> rets, list<LLVMType> flags,
1024                            list<LLVMType> params, LLVMType inactive,
1025                            LLVMType predicate,
1026                            list<IntrinsicProperty> props = [IntrNoMem]> {
1027   def "":          DefaultAttrsIntrinsic<rets, flags # params, props>;
1028   def _predicated: DefaultAttrsIntrinsic<
1029       rets, flags # [inactive] # params # [predicate], props>;
1030 }
1031 
1032 defm int_arm_mve_vcvt_narrow: MVEPredicated<[llvm_v8f16_ty],
1033    [llvm_v8f16_ty, llvm_v4f32_ty, llvm_i32_ty], llvm_v4i1_ty>;
1034 defm int_arm_mve_vcvt_widen: MVEMXPredicated<[llvm_v4f32_ty], [],
1035    [llvm_v8f16_ty, llvm_i32_ty], llvm_v4f32_ty, llvm_v4i1_ty>;
1036 
1037 defm int_arm_mve_vldr_gather_base: MVEPredicated<
1038    [llvm_anyvector_ty], [llvm_anyvector_ty, llvm_i32_ty],
1039    llvm_anyvector_ty, [IntrReadMem], [SDNPMemOperand]>;
1040 defm int_arm_mve_vldr_gather_base_wb: MVEPredicated<
1041    [llvm_anyvector_ty, llvm_anyvector_ty],
1042    [LLVMMatchType<1>, llvm_i32_ty], llvm_anyvector_ty, [IntrReadMem],
1043    [SDNPMemOperand]>;
1044 defm int_arm_mve_vstr_scatter_base: MVEPredicated<
1045    [], [llvm_anyvector_ty, llvm_i32_ty, llvm_anyvector_ty],
1046    llvm_anyvector_ty, [IntrWriteMem], [SDNPMemOperand]>;
1047 defm int_arm_mve_vstr_scatter_base_wb: MVEPredicated<
1048    [llvm_anyvector_ty], [LLVMMatchType<0>, llvm_i32_ty, llvm_anyvector_ty],
1049    llvm_anyvector_ty, [IntrWriteMem], [SDNPMemOperand]>;
1050 
1051 // gather_offset takes three i32 parameters. The first is the size of
1052 // memory element loaded, in bits. The second is a left bit shift to
1053 // apply to each offset in the vector parameter (must be either 0, or
1054 // correspond to the element size of the destination vector type). The
1055 // last is 1 to indicate zero extension (if the load is widening), or
1056 // 0 for sign extension.
1057 //
1058 // scatter_offset has the first two of those parameters, but since it
1059 // narrows rather than widening, it doesn't have the last one.
1060 defm int_arm_mve_vldr_gather_offset: MVEPredicated<
1061    [llvm_anyvector_ty], [llvm_anyptr_ty, llvm_anyvector_ty,
1062    llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], llvm_anyvector_ty, [IntrReadMem],
1063    [SDNPMemOperand]>;
1064 defm int_arm_mve_vstr_scatter_offset: MVEPredicated<
1065    [], [llvm_anyptr_ty, llvm_anyvector_ty, llvm_anyvector_ty,
1066    llvm_i32_ty, llvm_i32_ty], llvm_anyvector_ty, [IntrWriteMem],
1067    [SDNPMemOperand]>;
1068 
1069 def int_arm_mve_shl_imm_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1070    [LLVMMatchType<0>, llvm_i32_ty, llvm_anyvector_ty, LLVMMatchType<0>],
1071    [IntrNoMem]>;
1072 def int_arm_mve_shr_imm_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1073    [LLVMMatchType<0>, llvm_i32_ty, llvm_i32_ty, // extra i32 is unsigned flag
1074     llvm_anyvector_ty, LLVMMatchType<0>],
1075    [IntrNoMem]>;
1076 
1077 defm int_arm_mve_vqshl_imm: MVEPredicatedM<[llvm_anyvector_ty],
1078    [LLVMMatchType<0>, llvm_i32_ty /*shiftcount*/, llvm_i32_ty /*unsigned*/]>;
1079 defm int_arm_mve_vrshr_imm: MVEPredicatedM<[llvm_anyvector_ty],
1080    [LLVMMatchType<0>, llvm_i32_ty /*shiftcount*/, llvm_i32_ty /*unsigned*/]>;
1081 defm int_arm_mve_vqshlu_imm: MVEPredicatedM<[llvm_anyvector_ty],
1082    [LLVMMatchType<0>, llvm_i32_ty /*shiftcount*/]>;
1083 defm int_arm_mve_vshll_imm: MVEPredicatedM<[llvm_anyvector_ty],
1084    [llvm_anyvector_ty, llvm_i32_ty /*shiftcount*/, llvm_i32_ty /*unsigned*/,
1085                        llvm_i32_ty /*top-half*/]>;
1086 
1087 defm int_arm_mve_vsli: MVEPredicated<
1088    [llvm_anyvector_ty], [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty]>;
1089 defm int_arm_mve_vsri: MVEPredicated<
1090    [llvm_anyvector_ty], [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty]>;
1091 
1092 defm int_arm_mve_vshrn: MVEPredicated<
1093    [llvm_anyvector_ty], [LLVMMatchType<0>, llvm_anyvector_ty,
1094     llvm_i32_ty /*shiftcount*/, llvm_i32_ty /*saturate*/, llvm_i32_ty /*round*/,
1095     llvm_i32_ty /*unsigned-out*/, llvm_i32_ty /*unsigned-in*/,
1096     llvm_i32_ty /*top-half*/]>;
1097 
1098 defm int_arm_mve_vshl_scalar: MVEPredicated<
1099    [llvm_anyvector_ty], [LLVMMatchType<0>, llvm_i32_ty /*shiftcount*/,
1100     llvm_i32_ty /*saturate*/, llvm_i32_ty /*round*/, llvm_i32_ty /*unsigned*/]>;
1101 defm int_arm_mve_vshl_vector: MVEPredicatedM<
1102    [llvm_anyvector_ty], [LLVMMatchType<0>, llvm_anyvector_ty /*shiftcounts*/,
1103     llvm_i32_ty /*saturate*/, llvm_i32_ty /*round*/, llvm_i32_ty /*unsigned*/]>;
1104 
1105 // MVE scalar shifts.
1106 class ARM_MVE_qrshift_single<list<LLVMType> value,
1107                              list<LLVMType> saturate = []> :
1108   DefaultAttrsIntrinsic<value, value # [llvm_i32_ty] # saturate, [IntrNoMem]>;
1109 multiclass ARM_MVE_qrshift<list<LLVMType> saturate = []> {
1110   // Most of these shifts come in 32- and 64-bit versions. But only
1111   // the 64-bit ones have the extra saturation argument (if any).
1112   def "": ARM_MVE_qrshift_single<[llvm_i32_ty]>;
1113   def l:  ARM_MVE_qrshift_single<[llvm_i32_ty, llvm_i32_ty], saturate>;
1114 }
1115 defm int_arm_mve_urshr: ARM_MVE_qrshift;
1116 defm int_arm_mve_uqshl: ARM_MVE_qrshift;
1117 defm int_arm_mve_srshr: ARM_MVE_qrshift;
1118 defm int_arm_mve_sqshl: ARM_MVE_qrshift;
1119 defm int_arm_mve_uqrshl: ARM_MVE_qrshift<[llvm_i32_ty]>;
1120 defm int_arm_mve_sqrshr: ARM_MVE_qrshift<[llvm_i32_ty]>;
1121 // LSLL and ASRL only have 64-bit versions, not 32.
1122 def int_arm_mve_lsll: ARM_MVE_qrshift_single<[llvm_i32_ty, llvm_i32_ty]>;
1123 def int_arm_mve_asrl: ARM_MVE_qrshift_single<[llvm_i32_ty, llvm_i32_ty]>;
1124 
1125 def int_arm_mve_vabd: DefaultAttrsIntrinsic<
1126    [llvm_anyvector_ty],
1127    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */],
1128    [IntrNoMem]>;
1129 def int_arm_mve_vadc: DefaultAttrsIntrinsic<
1130    [llvm_anyvector_ty, llvm_i32_ty],
1131    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty], [IntrNoMem]>;
1132 def int_arm_mve_vsbc: DefaultAttrsIntrinsic<
1133    [llvm_anyvector_ty, llvm_i32_ty],
1134    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty], [IntrNoMem]>;
1135 def int_arm_mve_vadc_predicated: DefaultAttrsIntrinsic<
1136    [llvm_anyvector_ty, llvm_i32_ty],
1137    [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>,
1138     llvm_i32_ty, llvm_anyvector_ty], [IntrNoMem]>;
1139 def int_arm_mve_vsbc_predicated: DefaultAttrsIntrinsic<
1140    [llvm_anyvector_ty, llvm_i32_ty],
1141    [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>,
1142     llvm_i32_ty, llvm_anyvector_ty], [IntrNoMem]>;
1143 def int_arm_mve_vshlc: DefaultAttrsIntrinsic<
1144    [llvm_i32_ty /* bits shifted out */, llvm_anyvector_ty],
1145    [LLVMMatchType<0>, llvm_i32_ty /* bits shifted in */,
1146     llvm_i32_ty /* shift count */], [IntrNoMem]>;
1147 def int_arm_mve_vshlc_predicated: DefaultAttrsIntrinsic<
1148    [llvm_i32_ty /* bits shifted out */, llvm_anyvector_ty],
1149    [LLVMMatchType<0>, llvm_i32_ty /* bits shifted in */,
1150     llvm_i32_ty /* shift count */, llvm_anyvector_ty], [IntrNoMem]>;
1151 def int_arm_mve_vmulh: DefaultAttrsIntrinsic<
1152    [llvm_anyvector_ty],
1153    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */],
1154    [IntrNoMem]>;
1155 def int_arm_mve_vqdmulh: DefaultAttrsIntrinsic<
1156    [llvm_anyvector_ty],
1157    [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
1158 def int_arm_mve_vhadd: DefaultAttrsIntrinsic<
1159    [llvm_anyvector_ty],
1160    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */],
1161    [IntrNoMem]>;
1162 def int_arm_mve_vrhadd: DefaultAttrsIntrinsic<
1163    [llvm_anyvector_ty],
1164    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */],
1165    [IntrNoMem]>;
1166 def int_arm_mve_vhsub: DefaultAttrsIntrinsic<
1167    [llvm_anyvector_ty],
1168    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */],
1169    [IntrNoMem]>;
1170 def int_arm_mve_vrmulh: DefaultAttrsIntrinsic<
1171    [llvm_anyvector_ty],
1172    [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty /* unsigned */],
1173    [IntrNoMem]>;
1174 def int_arm_mve_vqrdmulh: DefaultAttrsIntrinsic<
1175    [llvm_anyvector_ty],
1176    [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
1177 def int_arm_mve_vmull: DefaultAttrsIntrinsic<
1178    [llvm_anyvector_ty],
1179    [llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty /* unsigned */,
1180     llvm_i32_ty /* top */], [IntrNoMem]>;
1181 def int_arm_mve_vmull_poly: DefaultAttrsIntrinsic<
1182    [llvm_anyvector_ty],
1183    [llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty], [IntrNoMem]>;
1184 
1185 // The first two parameters are compile-time constants:
1186 // * Halving: 0 means  halving (vhcaddq), 1 means non-halving (vcaddq) 
1187 //            instruction. Note: the flag is inverted to match the corresponding
1188 //            bit in the instruction encoding
1189 // * Rotation angle: 0 mean 90 deg, 1 means 180 deg
1190 defm int_arm_mve_vcaddq : MVEMXPredicated<
1191   [llvm_anyvector_ty],
1192   [llvm_i32_ty, llvm_i32_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
1193    LLVMMatchType<0>, llvm_anyvector_ty>;
1194 
1195 // The first operand of the following two intrinsics is the rotation angle
1196 // (must be a compile-time constant):
1197 // 0 - 0 deg
1198 // 1 - 90 deg
1199 // 2 - 180 deg
1200 // 3 - 270 deg
1201 defm int_arm_mve_vcmulq : MVEMXPredicated<
1202   [llvm_anyvector_ty],
1203   [llvm_i32_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
1204    LLVMMatchType<0>, llvm_anyvector_ty>;
1205 
1206 defm int_arm_mve_vcmlaq : MVEPredicated<
1207   [llvm_anyvector_ty],
1208   [llvm_i32_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
1209    llvm_anyvector_ty>;
1210 
1211 def int_arm_mve_vld2q: DefaultAttrsIntrinsic<
1212     [llvm_anyvector_ty, LLVMMatchType<0>], [llvm_anyptr_ty],
1213     [IntrReadMem, IntrArgMemOnly]>;
1214 def int_arm_mve_vld4q: DefaultAttrsIntrinsic<
1215     [llvm_anyvector_ty, LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
1216     [llvm_anyptr_ty], [IntrReadMem, IntrArgMemOnly]>;
1217 
1218 def int_arm_mve_vst2q: DefaultAttrsIntrinsic<
1219     [], [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty],
1220     [IntrWriteMem, IntrArgMemOnly], "", [SDNPMemOperand]>;
1221 def int_arm_mve_vst4q: DefaultAttrsIntrinsic<
1222     [],
1223     [llvm_anyptr_ty, llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
1224      LLVMMatchType<1>, llvm_i32_ty],
1225     [IntrWriteMem, IntrArgMemOnly], "", [SDNPMemOperand]>;
1226 
1227 // MVE vector absolute difference and accumulate across vector
1228 // The first operand is an 'unsigned' flag. The remaining operands are:
1229 // * accumulator
1230 // * first vector operand
1231 // * second vector operand
1232 // * mask (only in predicated versions)
1233 defm int_arm_mve_vabav: MVEPredicated<
1234   [llvm_i32_ty],
1235   [llvm_i32_ty, llvm_i32_ty, llvm_anyvector_ty, LLVMMatchType<0>], llvm_anyvector_ty>;
1236 
1237 // The following 3 intrinsics are MVE vector reductions with two vector
1238 // operands.
1239 // The first 3 operands are boolean flags (must be compile-time constants):
1240 // * unsigned - the instruction operates on vectors of unsigned values and
1241 //              unsigned scalars
1242 // * subtract - the instruction performs subtraction after multiplication of
1243 //              lane pairs (e.g., vmlsdav vs vmladav)
1244 // * exchange - the instruction exchanges successive even and odd lanes of
1245 //              the first operands before multiplication of lane pairs
1246 //              (e.g., vmladavx vs vmladav)
1247 // The remaining operands are:
1248 // * accumulator
1249 // * first vector operand
1250 // * second vector operand
1251 // * mask (only in predicated versions)
1252 
1253 // Version with 32-bit result, vml{a,s}dav[a][x]
1254 defm int_arm_mve_vmldava: MVEPredicated<
1255   [llvm_i32_ty],
1256   [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
1257    llvm_i32_ty, llvm_anyvector_ty, LLVMMatchType<0>],
1258   llvm_anyvector_ty>;
1259 
1260 // Version with 64-bit result, vml{a,s}ldav[a][x]
1261 defm int_arm_mve_vmlldava: MVEPredicated<
1262   [llvm_i32_ty, llvm_i32_ty],
1263   [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
1264    llvm_i32_ty, llvm_i32_ty, llvm_anyvector_ty, LLVMMatchType<0>],
1265   llvm_anyvector_ty>;
1266 
1267 // Version with 72-bit rounded result, vrml{a,s}ldavh[a][x]
1268 defm int_arm_mve_vrmlldavha: MVEPredicated<
1269   [llvm_i32_ty, llvm_i32_ty],
1270   [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
1271    llvm_i32_ty, llvm_i32_ty, llvm_anyvector_ty, LLVMMatchType<0>],
1272   llvm_anyvector_ty>;
1273 
1274 defm int_arm_mve_vidup: MVEMXPredicated<
1275    [llvm_anyvector_ty /* output */, llvm_i32_ty /* written-back base */], [],
1276    [llvm_i32_ty /* base */, llvm_i32_ty /* step */],
1277    LLVMMatchType<0>, llvm_anyvector_ty>;
1278 defm int_arm_mve_vddup: MVEMXPredicated<
1279    [llvm_anyvector_ty /* output */, llvm_i32_ty /* written-back base */], [],
1280    [llvm_i32_ty /* base */, llvm_i32_ty /* step */],
1281    LLVMMatchType<0>, llvm_anyvector_ty>;
1282 defm int_arm_mve_viwdup: MVEMXPredicated<
1283    [llvm_anyvector_ty /* output */, llvm_i32_ty /* written-back base */], [],
1284    [llvm_i32_ty /* base */, llvm_i32_ty /* limit */, llvm_i32_ty /* step */],
1285    LLVMMatchType<0>, llvm_anyvector_ty>;
1286 defm int_arm_mve_vdwdup: MVEMXPredicated<
1287    [llvm_anyvector_ty /* output */, llvm_i32_ty /* written-back base */], [],
1288    [llvm_i32_ty /* base */, llvm_i32_ty /* limit */, llvm_i32_ty /* step */],
1289    LLVMMatchType<0>, llvm_anyvector_ty>;
1290 
1291 // Flags:
1292 // * unsigned
1293 defm int_arm_mve_vcvt_fix: MVEMXPredicated<
1294   [llvm_anyvector_ty /* output */], [llvm_i32_ty],
1295   [llvm_anyvector_ty /* input vector */, llvm_i32_ty /* scale */],
1296   LLVMMatchType<0>, llvm_anyvector_ty>;
1297 
1298 def int_arm_mve_vcvt_fp_int_predicated: DefaultAttrsIntrinsic<
1299   [llvm_anyvector_ty], [llvm_anyvector_ty, llvm_i32_ty /* unsigned */,
1300    llvm_anyvector_ty /* predicate */, LLVMMatchType<0> /* inactive */],
1301   [IntrNoMem]>;
1302 
1303 foreach suffix = ["a","n","p","m"] in {
1304   defm "int_arm_mve_vcvt"#suffix: MVEMXPredicated<
1305     [llvm_anyvector_ty /* output */], [llvm_i32_ty /* unsigned */],
1306     [llvm_anyvector_ty /* input */], LLVMMatchType<0>, llvm_anyvector_ty>;
1307 }
1308 
1309 def int_arm_mve_vrintn: DefaultAttrsIntrinsic<
1310   [llvm_anyvector_ty], [LLVMMatchType<0>], [IntrNoMem]>;
1311 def int_arm_mve_vcls: DefaultAttrsIntrinsic<
1312   [llvm_anyvector_ty], [LLVMMatchType<0>], [IntrNoMem]>;
1313 
1314 defm int_arm_mve_vbrsr: MVEMXPredicated<
1315   [llvm_anyvector_ty], [],
1316   [LLVMMatchType<0>, llvm_i32_ty], LLVMMatchType<0>, llvm_anyvector_ty>;
1317 
1318 def int_arm_mve_vqdmull: DefaultAttrsIntrinsic<
1319   [llvm_anyvector_ty],
1320   [llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty],
1321   [IntrNoMem]>;
1322 def int_arm_mve_vqdmull_predicated: DefaultAttrsIntrinsic<
1323   [llvm_anyvector_ty],
1324   [llvm_anyvector_ty, LLVMMatchType<1>, llvm_i32_ty, llvm_anyvector_ty,
1325    LLVMMatchType<0>],
1326   [IntrNoMem]>;
1327 
1328 class MVESimpleUnaryPredicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1329    [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
1330 
1331 def int_arm_mve_mvn_predicated: MVESimpleUnaryPredicated;
1332 def int_arm_mve_abs_predicated: MVESimpleUnaryPredicated;
1333 def int_arm_mve_neg_predicated: MVESimpleUnaryPredicated;
1334 def int_arm_mve_qabs_predicated: MVESimpleUnaryPredicated;
1335 def int_arm_mve_qneg_predicated: MVESimpleUnaryPredicated;
1336 def int_arm_mve_clz_predicated: MVESimpleUnaryPredicated;
1337 def int_arm_mve_cls_predicated: MVESimpleUnaryPredicated;
1338 def int_arm_mve_vrintz_predicated: MVESimpleUnaryPredicated;
1339 def int_arm_mve_vrintm_predicated: MVESimpleUnaryPredicated;
1340 def int_arm_mve_vrintp_predicated: MVESimpleUnaryPredicated;
1341 def int_arm_mve_vrinta_predicated: MVESimpleUnaryPredicated;
1342 def int_arm_mve_vrintx_predicated: MVESimpleUnaryPredicated;
1343 def int_arm_mve_vrintn_predicated: MVESimpleUnaryPredicated;
1344 
1345 def int_arm_mve_vrev_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1346    [LLVMMatchType<0>, llvm_i32_ty /* size to reverse */,
1347     llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
1348 
1349 def int_arm_mve_vmovl_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1350    [llvm_anyvector_ty, llvm_i32_ty /* unsigned */, llvm_i32_ty /* top half */,
1351     llvm_anyvector_ty /* predicate */, LLVMMatchType<0>], [IntrNoMem]>;
1352 def int_arm_mve_vmovn_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1353    [LLVMMatchType<0>, llvm_anyvector_ty, llvm_i32_ty /* top half */,
1354     llvm_anyvector_ty /* predicate */], [IntrNoMem]>;
1355 
1356 def int_arm_mve_vqmovn: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1357    [LLVMMatchType<0>, llvm_anyvector_ty,
1358     llvm_i32_ty /* unsigned output */, llvm_i32_ty /* unsigned input */,
1359     llvm_i32_ty /* top half */], [IntrNoMem]>;
1360 def int_arm_mve_vqmovn_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1361    [LLVMMatchType<0>, llvm_anyvector_ty,
1362     llvm_i32_ty /* unsigned output */, llvm_i32_ty /* unsigned input */,
1363     llvm_i32_ty /* top half */, llvm_anyvector_ty /* pred */], [IntrNoMem]>;
1364 
1365 // fma_predicated returns the add operand for disabled lanes.
1366 def int_arm_mve_fma_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1367    [LLVMMatchType<0> /* mult op #1 */, LLVMMatchType<0> /* mult op #2 */,
1368     LLVMMatchType<0> /* addend */, llvm_anyvector_ty /* pred */], [IntrNoMem]>;
1369 def int_arm_mve_vmla_n_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1370    [LLVMMatchType<0> /* mult op #1 */, LLVMMatchType<0> /* addend */,
1371     llvm_i32_ty /* mult op #2 (scalar) */, llvm_anyvector_ty /* pred */],
1372    [IntrNoMem]>;
1373 def int_arm_mve_vmlas_n_predicated: DefaultAttrsIntrinsic<[llvm_anyvector_ty],
1374    [LLVMMatchType<0> /* mult op #1 */, LLVMMatchType<0> /* mult op #2 */,
1375     llvm_i32_ty /* addend (scalar) */, llvm_anyvector_ty /* pred */],
1376    [IntrNoMem]>;
1377 
1378 defm int_arm_mve_vqdmlah: MVEPredicated<[llvm_anyvector_ty],
1379   [LLVMMatchType<0> /* mult op #1 */, LLVMMatchType<0> /* addend */,
1380    llvm_i32_ty /* mult op #2 (scalar) */]>;
1381 defm int_arm_mve_vqrdmlah: MVEPredicated<[llvm_anyvector_ty],
1382   [LLVMMatchType<0> /* mult op #1 */, LLVMMatchType<0> /* addend */,
1383    llvm_i32_ty /* mult op #2 (scalar) */]>;
1384 defm int_arm_mve_vqdmlash: MVEPredicated<[llvm_anyvector_ty],
1385   [LLVMMatchType<0> /* mult op #1 */, LLVMMatchType<0> /* mult op #2 */,
1386    llvm_i32_ty /* addend (scalar) */]>;
1387 defm int_arm_mve_vqrdmlash: MVEPredicated<[llvm_anyvector_ty],
1388   [LLVMMatchType<0> /* mult op #1 */, LLVMMatchType<0> /* mult op #2 */,
1389    llvm_i32_ty /* addend (scalar) */]>;
1390 
1391 defm int_arm_mve_vqdmlad: MVEPredicated<[llvm_anyvector_ty],
1392   [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>,
1393    llvm_i32_ty /* exchange */, llvm_i32_ty /* round */,
1394    llvm_i32_ty /* subtract */]>;
1395 
1396 // CDE (Custom Datapath Extension)
1397 
1398 multiclass CDEGPRIntrinsics<list<LLVMType> args> {
1399   def "" : DefaultAttrsIntrinsic<
1400     [llvm_i32_ty],
1401     !listconcat([llvm_i32_ty /* coproc */], args, [llvm_i32_ty /* imm */]),
1402     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 1)>>]>;
1403   def a : DefaultAttrsIntrinsic<
1404     [llvm_i32_ty],
1405     !listconcat([llvm_i32_ty /* coproc */, llvm_i32_ty /* acc */], args,
1406                 [llvm_i32_ty /* imm */]),
1407     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 2)>>]>;
1408 
1409   def d: DefaultAttrsIntrinsic<
1410     [llvm_i32_ty /* lo */, llvm_i32_ty /* hi */],
1411     !listconcat([llvm_i32_ty /* coproc */], args, [llvm_i32_ty /* imm */]),
1412     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 1)>>]>;
1413   def da: DefaultAttrsIntrinsic<
1414     [llvm_i32_ty /* lo */, llvm_i32_ty /* hi */],
1415     !listconcat([llvm_i32_ty /* coproc */, llvm_i32_ty /* acc_lo */,
1416                  llvm_i32_ty /* acc_hi */], args, [llvm_i32_ty /* imm */]),
1417     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 3)>>]>;
1418 }
1419 
1420 defm int_arm_cde_cx1: CDEGPRIntrinsics<[]>;
1421 defm int_arm_cde_cx2: CDEGPRIntrinsics<[llvm_i32_ty]>;
1422 defm int_arm_cde_cx3: CDEGPRIntrinsics<[llvm_i32_ty, llvm_i32_ty]>;
1423 
1424 multiclass CDEVCXIntrinsics<list<LLVMType> args> {
1425   def "" : DefaultAttrsIntrinsic<
1426     [llvm_anyfloat_ty],
1427     !listconcat([llvm_i32_ty /* coproc */], args, [llvm_i32_ty /* imm */]),
1428     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 1)>>]>;
1429   def a : DefaultAttrsIntrinsic<
1430     [llvm_anyfloat_ty],
1431     !listconcat([llvm_i32_ty /* coproc */,  LLVMMatchType<0> /* acc */],
1432                 args, [llvm_i32_ty /* imm */]),
1433     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 2)>>]>;
1434 }
1435 
1436 defm int_arm_cde_vcx1 : CDEVCXIntrinsics<[]>;
1437 defm int_arm_cde_vcx2 : CDEVCXIntrinsics<[LLVMMatchType<0>]>;
1438 defm int_arm_cde_vcx3 : CDEVCXIntrinsics<[LLVMMatchType<0>, LLVMMatchType<0>]>;
1439 
1440 multiclass CDEVCXVecIntrinsics<list<LLVMType> args> {
1441   def "" : DefaultAttrsIntrinsic<
1442     [llvm_v16i8_ty],
1443     !listconcat([llvm_i32_ty /* coproc */], args, [llvm_i32_ty /* imm */]),
1444     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 1)>>]>;
1445   def a : DefaultAttrsIntrinsic<
1446     [llvm_v16i8_ty],
1447     !listconcat([llvm_i32_ty /* coproc */, llvm_v16i8_ty /* acc */],
1448                 args, [llvm_i32_ty /* imm */]),
1449     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 2)>>]>;
1450 
1451   def _predicated : DefaultAttrsIntrinsic<
1452     [llvm_anyvector_ty],
1453     !listconcat([llvm_i32_ty /* coproc */, LLVMMatchType<0> /* inactive */],
1454                 args, [llvm_i32_ty /* imm */, llvm_anyvector_ty /* mask */]),
1455     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 2)>>]>;
1456   def a_predicated : DefaultAttrsIntrinsic<
1457     [llvm_anyvector_ty],
1458     !listconcat([llvm_i32_ty /* coproc */, LLVMMatchType<0> /* acc */],
1459                 args, [llvm_i32_ty /* imm */, llvm_anyvector_ty /* mask */]),
1460     [IntrNoMem, ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<!add(!size(args), 2)>>]>;
1461 }
1462 
1463 defm int_arm_cde_vcx1q : CDEVCXVecIntrinsics<[]>;
1464 defm int_arm_cde_vcx2q : CDEVCXVecIntrinsics<[llvm_v16i8_ty]>;
1465 defm int_arm_cde_vcx3q : CDEVCXVecIntrinsics<[llvm_v16i8_ty, llvm_v16i8_ty]>;
1466 
1467 } // end TargetPrefix