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