IntrinsicsAArch64.td revision 1a035dd6df1d953af57656491eda28ceef9ad4a3
1//===- IntrinsicsAArch64.td - Defines AArch64 intrinsics -----------*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines all of the AArch64-specific intrinsics. 11// 12//===----------------------------------------------------------------------===// 13 14//===----------------------------------------------------------------------===// 15// Advanced SIMD (NEON) 16 17let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.". 18 19// Vector Absolute Compare (Floating Point) 20def int_aarch64_neon_vacgeq : 21 Intrinsic<[llvm_v2i64_ty], [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>; 22def int_aarch64_neon_vacgtq : 23 Intrinsic<[llvm_v2i64_ty], [llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>; 24 25// Vector maxNum (Floating Point) 26def int_aarch64_neon_vmaxnm : Neon_2Arg_Intrinsic; 27 28// Vector minNum (Floating Point) 29def int_aarch64_neon_vminnm : Neon_2Arg_Intrinsic; 30 31// Vector Pairwise maxNum (Floating Point) 32def int_aarch64_neon_vpmaxnm : Neon_2Arg_Intrinsic; 33 34// Vector Pairwise minNum (Floating Point) 35def int_aarch64_neon_vpminnm : Neon_2Arg_Intrinsic; 36 37// Vector Multiply Extended (Floating Point) 38def int_aarch64_neon_vmulx : Neon_2Arg_Intrinsic; 39 40class Neon_N2V_Intrinsic 41 : Intrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>, llvm_i32_ty], 42 [IntrNoMem]>; 43class Neon_N3V_Intrinsic 44 : Intrinsic<[llvm_anyvector_ty], 45 [LLVMMatchType<0>, LLVMMatchType<0>, llvm_i32_ty], 46 [IntrNoMem]>; 47class Neon_N2V_Narrow_Intrinsic 48 : Intrinsic<[llvm_anyvector_ty], 49 [LLVMExtendedElementVectorType<0>, llvm_i32_ty], 50 [IntrNoMem]>; 51 52// Vector rounding shift right by immediate (Signed) 53def int_aarch64_neon_vsrshr : Neon_N2V_Intrinsic; 54def int_aarch64_neon_vurshr : Neon_N2V_Intrinsic; 55def int_aarch64_neon_vsqshlu : Neon_N2V_Intrinsic; 56 57def int_aarch64_neon_vsri : Neon_N3V_Intrinsic; 58def int_aarch64_neon_vsli : Neon_N3V_Intrinsic; 59 60def int_aarch64_neon_vsqshrun : Neon_N2V_Narrow_Intrinsic; 61def int_aarch64_neon_vrshrn : Neon_N2V_Narrow_Intrinsic; 62def int_aarch64_neon_vsqrshrun : Neon_N2V_Narrow_Intrinsic; 63def int_aarch64_neon_vsqshrn : Neon_N2V_Narrow_Intrinsic; 64def int_aarch64_neon_vuqshrn : Neon_N2V_Narrow_Intrinsic; 65def int_aarch64_neon_vsqrshrn : Neon_N2V_Narrow_Intrinsic; 66def int_aarch64_neon_vuqrshrn : Neon_N2V_Narrow_Intrinsic; 67 68// Vector across 69class Neon_Across_Intrinsic 70 : Intrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>; 71 72class Neon_2Arg_Across_Float_Intrinsic 73 : Intrinsic<[llvm_anyvector_ty], [llvm_v4f32_ty], [IntrNoMem]>; 74 75def int_aarch64_neon_saddlv : Neon_Across_Intrinsic; 76def int_aarch64_neon_uaddlv : Neon_Across_Intrinsic; 77def int_aarch64_neon_smaxv : Neon_Across_Intrinsic; 78def int_aarch64_neon_umaxv : Neon_Across_Intrinsic; 79def int_aarch64_neon_sminv : Neon_Across_Intrinsic; 80def int_aarch64_neon_uminv : Neon_Across_Intrinsic; 81def int_aarch64_neon_vaddv : Neon_Across_Intrinsic; 82def int_aarch64_neon_vmaxv : Neon_Across_Intrinsic; 83def int_aarch64_neon_vminv : Neon_Across_Intrinsic; 84def int_aarch64_neon_vmaxnmv : Neon_Across_Intrinsic; 85def int_aarch64_neon_vminnmv : Neon_Across_Intrinsic; 86 87// Scalar Add 88def int_aarch64_neon_vaddds : 89 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 90def int_aarch64_neon_vadddu : 91 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 92 93// Scalar Saturating Add (Signed, Unsigned) 94def int_aarch64_neon_vqadds : Neon_2Arg_Intrinsic; 95def int_aarch64_neon_vqaddu : Neon_2Arg_Intrinsic; 96 97// Scalar Sub 98def int_aarch64_neon_vsubds : 99 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 100def int_aarch64_neon_vsubdu : 101 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 102 103// Scalar Saturating Sub (Signed, Unsigned) 104def int_aarch64_neon_vqsubs : Neon_2Arg_Intrinsic; 105def int_aarch64_neon_vqsubu : Neon_2Arg_Intrinsic; 106 107// Scalar Shift 108// Scalar Shift Left 109def int_aarch64_neon_vshlds : 110 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 111def int_aarch64_neon_vshldu : 112 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 113 114// Scalar Saturating Shift Left 115def int_aarch64_neon_vqshls : Neon_2Arg_Intrinsic; 116def int_aarch64_neon_vqshlu : Neon_2Arg_Intrinsic; 117 118// Scalar Shift Rouding Left 119def int_aarch64_neon_vrshlds : 120 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 121def int_aarch64_neon_vrshldu : 122 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>; 123 124// Scalar Saturating Rounding Shift Left 125def int_aarch64_neon_vqrshls : Neon_2Arg_Intrinsic; 126def int_aarch64_neon_vqrshlu : Neon_2Arg_Intrinsic; 127 128// Scalar Reduce Pairwise Add. 129def int_aarch64_neon_vpadd : 130 Intrinsic<[llvm_v1i64_ty], [llvm_v2i64_ty],[IntrNoMem]>; 131def int_aarch64_neon_vpfadd : 132 Intrinsic<[llvm_v1f32_ty], [llvm_v2f32_ty], [IntrNoMem]>; 133def int_aarch64_neon_vpfaddq : 134 Intrinsic<[llvm_v1f64_ty], [llvm_v2f64_ty], [IntrNoMem]>; 135 136// Scalar Reduce Pairwise Floating Point Max/Min. 137def int_aarch64_neon_vpmax : 138 Intrinsic<[llvm_v1f32_ty], [llvm_v2f32_ty], [IntrNoMem]>; 139def int_aarch64_neon_vpmaxq : 140 Intrinsic<[llvm_v1f64_ty], [llvm_v2f64_ty], [IntrNoMem]>; 141def int_aarch64_neon_vpmin : 142 Intrinsic<[llvm_v1f32_ty], [llvm_v2f32_ty], [IntrNoMem]>; 143def int_aarch64_neon_vpminq : 144 Intrinsic<[llvm_v1f64_ty], [llvm_v2f64_ty], [IntrNoMem]>; 145 146// Scalar Reduce Pairwise Floating Point Maxnm/Minnm. 147def int_aarch64_neon_vpfmaxnm : 148 Intrinsic<[llvm_v1f32_ty], [llvm_v2f32_ty], [IntrNoMem]>; 149def int_aarch64_neon_vpfmaxnmq : 150 Intrinsic<[llvm_v1f64_ty], [llvm_v2f64_ty], [IntrNoMem]>; 151def int_aarch64_neon_vpfminnm : 152 Intrinsic<[llvm_v1f32_ty], [llvm_v2f32_ty], [IntrNoMem]>; 153def int_aarch64_neon_vpfminnmq : 154 Intrinsic<[llvm_v1f64_ty], [llvm_v2f64_ty], [IntrNoMem]>; 155 156// Scalar Signed Integer Convert To Floating-point 157def int_aarch64_neon_vcvtf32_s32 : 158 Intrinsic<[llvm_v1f32_ty], [llvm_v1i32_ty], [IntrNoMem]>; 159def int_aarch64_neon_vcvtf64_s64 : 160 Intrinsic<[llvm_v1f64_ty], [llvm_v1i64_ty], [IntrNoMem]>; 161 162// Scalar Unsigned Integer Convert To Floating-point 163def int_aarch64_neon_vcvtf32_u32 : 164 Intrinsic<[llvm_v1f32_ty], [llvm_v1i32_ty], [IntrNoMem]>; 165def int_aarch64_neon_vcvtf64_u64 : 166 Intrinsic<[llvm_v1f64_ty], [llvm_v1i64_ty], [IntrNoMem]>; 167 168// Scalar Floating-point Reciprocal Exponent 169def int_aarch64_neon_vrecpx : Neon_1Arg_Intrinsic; 170 171class Neon_Cmp_Intrinsic 172 : Intrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty, llvm_anyvector_ty], 173 [IntrNoMem]>; 174 175// Scalar Compare Equal 176def int_aarch64_neon_vceq : Neon_Cmp_Intrinsic; 177 178// Scalar Compare Greater-Than or Equal 179def int_aarch64_neon_vcge : Neon_Cmp_Intrinsic; 180def int_aarch64_neon_vchs : Neon_Cmp_Intrinsic; 181 182// Scalar Compare Less-Than or Equal 183def int_aarch64_neon_vclez : Neon_Cmp_Intrinsic; 184 185// Scalar Compare Less-Than 186def int_aarch64_neon_vcltz : Neon_Cmp_Intrinsic; 187 188// Scalar Compare Greater-Than 189def int_aarch64_neon_vcgt : Neon_Cmp_Intrinsic; 190def int_aarch64_neon_vchi : Neon_Cmp_Intrinsic; 191 192// Scalar Compare Bitwise Test Bits 193def int_aarch64_neon_vtstd : Neon_Cmp_Intrinsic; 194 195// Scalar Floating-point Absolute Compare Greater Than Or Equal 196def int_aarch64_neon_vcage : Neon_Cmp_Intrinsic; 197 198// Scalar Floating-point Absolute Compare Greater Than 199def int_aarch64_neon_vcagt : Neon_Cmp_Intrinsic; 200 201// Scalar Signed Saturating Accumulated of Unsigned Value 202def int_aarch64_neon_vuqadd : Neon_2Arg_Intrinsic; 203 204// Scalar Unsigned Saturating Accumulated of Signed Value 205def int_aarch64_neon_vsqadd : Neon_2Arg_Intrinsic; 206 207// Scalar Absolute Value 208def int_aarch64_neon_vabs : 209 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty], [IntrNoMem]>; 210 211// Scalar Negate Value 212def int_aarch64_neon_vneg : 213 Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty], [IntrNoMem]>; 214 215// Signed Saturating Doubling Multiply-Add Long 216def int_aarch64_neon_vqdmlal : Neon_3Arg_Long_Intrinsic; 217 218// Signed Saturating Doubling Multiply-Subtract Long 219def int_aarch64_neon_vqdmlsl : Neon_3Arg_Long_Intrinsic; 220 221// Signed Saturating Doubling Multiply Long 222def int_aarch64_neon_vqdmull : Neon_2Arg_Long_Intrinsic; 223 224class Neon_2Arg_ShiftImm_Intrinsic 225 : Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_i32_ty], [IntrNoMem]>; 226 227class Neon_3Arg_ShiftImm_Intrinsic 228 : Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty, llvm_i32_ty], 229 [IntrNoMem]>; 230 231// Scalar Shift Right (Immediate) 232def int_aarch64_neon_vshrds_n : Neon_2Arg_ShiftImm_Intrinsic; 233def int_aarch64_neon_vshrdu_n : Neon_2Arg_ShiftImm_Intrinsic; 234 235// Scalar Rounding Shift Right (Immediate) 236def int_aarch64_neon_vrshrds_n : Neon_2Arg_ShiftImm_Intrinsic; 237def int_aarch64_neon_vrshrdu_n : Neon_2Arg_ShiftImm_Intrinsic; 238 239// Scalar Shift Right and Accumulate (Immediate) 240def int_aarch64_neon_vsrads_n : Neon_3Arg_ShiftImm_Intrinsic; 241def int_aarch64_neon_vsradu_n : Neon_3Arg_ShiftImm_Intrinsic; 242 243// Scalar Rounding Shift Right and Accumulate (Immediate) 244def int_aarch64_neon_vrsrads_n : Neon_3Arg_ShiftImm_Intrinsic; 245def int_aarch64_neon_vrsradu_n : Neon_3Arg_ShiftImm_Intrinsic; 246 247// Scalar Shift Left (Immediate) 248def int_aarch64_neon_vshld_n : Neon_2Arg_ShiftImm_Intrinsic; 249 250// Scalar Saturating Shift Left (Immediate) 251def int_aarch64_neon_vqshls_n : Neon_N2V_Intrinsic; 252def int_aarch64_neon_vqshlu_n : Neon_N2V_Intrinsic; 253 254// Scalar Signed Saturating Shift Left Unsigned (Immediate) 255def int_aarch64_neon_vqshlus_n : Neon_N2V_Intrinsic; 256 257// Shift Right And Insert (Immediate) 258def int_aarch64_neon_vsrid_n : Neon_2Arg_ShiftImm_Intrinsic; 259 260// Shift Left And Insert (Immediate) 261def int_aarch64_neon_vslid_n : Neon_2Arg_ShiftImm_Intrinsic; 262 263// Scalar Signed Fixed-point Convert To Floating-Point (Immediate) 264def int_aarch64_neon_vcvtf32_n_s32 : 265 Intrinsic<[llvm_v1f32_ty], [llvm_v1i32_ty, llvm_i32_ty], [IntrNoMem]>; 266def int_aarch64_neon_vcvtf64_n_s64 : 267 Intrinsic<[llvm_v1f64_ty], [llvm_v1i64_ty, llvm_i32_ty], [IntrNoMem]>; 268 269// Scalar Unsigned Fixed-point Convert To Floating-Point (Immediate) 270def int_aarch64_neon_vcvtf32_n_u32 : 271 Intrinsic<[llvm_v1f32_ty], [llvm_v1i32_ty, llvm_i32_ty], [IntrNoMem]>; 272def int_aarch64_neon_vcvtf64_n_u64 : 273 Intrinsic<[llvm_v1f64_ty], [llvm_v1i64_ty, llvm_i32_ty], [IntrNoMem]>; 274} 275