Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- IntrinsicsHexagon.td - Defines Hexagon intrinsics ---*- tablegen -*-===// |
2 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
3 | // See https://llvm.org/LICENSE.txt for license information. |
||
4 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
5 | // |
||
6 | //===----------------------------------------------------------------------===// |
||
7 | // |
||
8 | // This file defines all of the Hexagon-specific intrinsics. |
||
9 | // |
||
10 | //===----------------------------------------------------------------------===// |
||
11 | |||
12 | //===----------------------------------------------------------------------===// |
||
13 | // Definitions for all Hexagon intrinsics. |
||
14 | // |
||
15 | // All Hexagon intrinsics start with "llvm.hexagon.". |
||
16 | let TargetPrefix = "hexagon" in { |
||
17 | /// Hexagon_Intrinsic - Base class for the majority of Hexagon intrinsics. |
||
18 | class Hexagon_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types, |
||
19 | list<LLVMType> param_types, |
||
20 | list<IntrinsicProperty> properties> |
||
21 | : ClangBuiltin<!strconcat("__builtin_", GCCIntSuffix)>, |
||
22 | DefaultAttrsIntrinsic<ret_types, param_types, properties>; |
||
23 | |||
24 | /// Hexagon_NonGCC_Intrinsic - Base class for bitcode convertible Hexagon |
||
25 | /// intrinsics. |
||
26 | class Hexagon_NonGCC_Intrinsic<list<LLVMType> ret_types, |
||
27 | list<LLVMType> param_types, |
||
28 | list<IntrinsicProperty> properties> |
||
29 | : DefaultAttrsIntrinsic<ret_types, param_types, properties>; |
||
30 | } |
||
31 | |||
32 | class Hexagon_mem_memmemsi_Intrinsic<string GCCIntSuffix> |
||
33 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
34 | [llvm_ptr_ty], [llvm_ptr_ty, llvm_ptr_ty, |
||
35 | llvm_i32_ty], |
||
36 | [IntrArgMemOnly]>; |
||
37 | |||
38 | class Hexagon_mem_memsisi_Intrinsic<string GCCIntSuffix> |
||
39 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
40 | [llvm_ptr_ty], [llvm_ptr_ty, llvm_i32_ty, |
||
41 | llvm_i32_ty], |
||
42 | [IntrWriteMem]>; |
||
43 | |||
44 | class Hexagon_mem_memdisi_Intrinsic<string GCCIntSuffix> |
||
45 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
46 | [llvm_ptr_ty], [llvm_ptr_ty, llvm_i64_ty, |
||
47 | llvm_i32_ty], |
||
48 | [IntrWriteMem]>; |
||
49 | |||
50 | class Hexagon_mem_memmemsisi_Intrinsic<string GCCIntSuffix> |
||
51 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
52 | [llvm_ptr_ty], [llvm_ptr_ty, llvm_ptr_ty, |
||
53 | llvm_i32_ty, llvm_i32_ty], |
||
54 | [IntrArgMemOnly, ImmArg<ArgIndex<3>>]>; |
||
55 | |||
56 | class Hexagon_mem_memsisisi_Intrinsic<string GCCIntSuffix> |
||
57 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
58 | [llvm_ptr_ty], [llvm_ptr_ty, llvm_i32_ty, |
||
59 | llvm_i32_ty, llvm_i32_ty], |
||
60 | [IntrWriteMem, ImmArg<ArgIndex<3>>]>; |
||
61 | |||
62 | class Hexagon_mem_memdisisi_Intrinsic<string GCCIntSuffix> |
||
63 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
64 | [llvm_ptr_ty], [llvm_ptr_ty, llvm_i64_ty, |
||
65 | llvm_i32_ty, llvm_i32_ty], |
||
66 | [IntrWriteMem, ImmArg<ArgIndex<3>>]>; |
||
67 | |||
68 | // |
||
69 | // BUILTIN_INFO_NONCONST(circ_ldd,PTR_ftype_PTRPTRSISI,4) |
||
70 | // |
||
71 | def int_hexagon_circ_ldd : |
||
72 | Hexagon_mem_memmemsisi_Intrinsic<"circ_ldd">; |
||
73 | // |
||
74 | // BUILTIN_INFO_NONCONST(circ_ldw,PTR_ftype_PTRPTRSISI,4) |
||
75 | // |
||
76 | def int_hexagon_circ_ldw : |
||
77 | Hexagon_mem_memmemsisi_Intrinsic<"circ_ldw">; |
||
78 | // |
||
79 | // BUILTIN_INFO_NONCONST(circ_ldh,PTR_ftype_PTRPTRSISI,4) |
||
80 | // |
||
81 | def int_hexagon_circ_ldh : |
||
82 | Hexagon_mem_memmemsisi_Intrinsic<"circ_ldh">; |
||
83 | // |
||
84 | // BUILTIN_INFO_NONCONST(circ_lduh,PTR_ftype_PTRPTRSISI,4) |
||
85 | // |
||
86 | def int_hexagon_circ_lduh : |
||
87 | Hexagon_mem_memmemsisi_Intrinsic<"circ_lduh">; |
||
88 | // |
||
89 | // BUILTIN_INFO_NONCONST(circ_ldb,PTR_ftype_PTRPTRSISI,4) |
||
90 | // |
||
91 | def int_hexagon_circ_ldb : |
||
92 | Hexagon_mem_memmemsisi_Intrinsic<"circ_ldb">; |
||
93 | // |
||
94 | // BUILTIN_INFO_NONCONST(circ_ldub,PTR_ftype_PTRPTRSISI,4) |
||
95 | // |
||
96 | def int_hexagon_circ_ldub : |
||
97 | Hexagon_mem_memmemsisi_Intrinsic<"circ_ldub">; |
||
98 | |||
99 | // |
||
100 | // BUILTIN_INFO_NONCONST(circ_std,PTR_ftype_PTRDISISI,4) |
||
101 | // |
||
102 | def int_hexagon_circ_std : |
||
103 | Hexagon_mem_memdisisi_Intrinsic<"circ_std">; |
||
104 | // |
||
105 | // BUILTIN_INFO_NONCONST(circ_stw,PTR_ftype_PTRSISISI,4) |
||
106 | // |
||
107 | def int_hexagon_circ_stw : |
||
108 | Hexagon_mem_memsisisi_Intrinsic<"circ_stw">; |
||
109 | // |
||
110 | // BUILTIN_INFO_NONCONST(circ_sth,PTR_ftype_PTRSISISI,4) |
||
111 | // |
||
112 | def int_hexagon_circ_sth : |
||
113 | Hexagon_mem_memsisisi_Intrinsic<"circ_sth">; |
||
114 | // |
||
115 | // BUILTIN_INFO_NONCONST(circ_sthhi,PTR_ftype_PTRSISISI,4) |
||
116 | // |
||
117 | def int_hexagon_circ_sthhi : |
||
118 | Hexagon_mem_memsisisi_Intrinsic<"circ_sthhi">; |
||
119 | // |
||
120 | // BUILTIN_INFO_NONCONST(circ_stb,PTR_ftype_PTRSISISI,4) |
||
121 | // |
||
122 | def int_hexagon_circ_stb : |
||
123 | Hexagon_mem_memsisisi_Intrinsic<"circ_stb">; |
||
124 | |||
125 | def int_hexagon_prefetch : |
||
126 | Hexagon_Intrinsic<"HEXAGON_prefetch", [], [llvm_ptr_ty], []>; |
||
127 | |||
128 | def llvm_ptr32_ty : LLVMPointerType<llvm_i32_ty>; |
||
129 | def llvm_ptr64_ty : LLVMPointerType<llvm_i64_ty>; |
||
130 | |||
131 | // Mark locked loads as read/write to prevent any accidental reordering. |
||
132 | // These don't use Hexagon_Intrinsic, because they are not nosync, and as such |
||
133 | // cannot use default attributes. |
||
134 | let TargetPrefix = "hexagon" in { |
||
135 | def int_hexagon_L2_loadw_locked : |
||
136 | ClangBuiltin<"__builtin_HEXAGON_L2_loadw_locked">, |
||
137 | Intrinsic<[llvm_i32_ty], [llvm_ptr32_ty], |
||
138 | [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>; |
||
139 | def int_hexagon_L4_loadd_locked : |
||
140 | ClangBuiltin<"__builtin__HEXAGON_L4_loadd_locked">, |
||
141 | Intrinsic<[llvm_i64_ty], [llvm_ptr64_ty], |
||
142 | [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>; |
||
143 | |||
144 | def int_hexagon_S2_storew_locked : |
||
145 | ClangBuiltin<"__builtin_HEXAGON_S2_storew_locked">, |
||
146 | Intrinsic<[llvm_i32_ty], |
||
147 | [llvm_ptr32_ty, llvm_i32_ty], [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>; |
||
148 | def int_hexagon_S4_stored_locked : |
||
149 | ClangBuiltin<"__builtin_HEXAGON_S4_stored_locked">, |
||
150 | Intrinsic<[llvm_i32_ty], |
||
151 | [llvm_ptr64_ty, llvm_i64_ty], [IntrArgMemOnly, NoCapture<ArgIndex<0>>]>; |
||
152 | } |
||
153 | |||
154 | def int_hexagon_vmemcpy : Hexagon_Intrinsic<"hexagon_vmemcpy", |
||
155 | [], [llvm_ptr_ty, llvm_ptr_ty, llvm_i32_ty], |
||
156 | [IntrArgMemOnly, NoCapture<ArgIndex<0>>, NoCapture<ArgIndex<1>>, WriteOnly<ArgIndex<0>>, ReadOnly<ArgIndex<1>>]>; |
||
157 | |||
158 | def int_hexagon_vmemset : Hexagon_Intrinsic<"hexagon_vmemset", |
||
159 | [], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], |
||
160 | [IntrArgMemOnly, NoCapture<ArgIndex<0>>, WriteOnly<ArgIndex<0>>]>; |
||
161 | |||
162 | multiclass Hexagon_custom_circ_ld_Intrinsic<LLVMType ElTy> { |
||
163 | def NAME#_pci : Hexagon_NonGCC_Intrinsic< |
||
164 | [ElTy, llvm_ptr_ty], |
||
165 | [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty], |
||
166 | [IntrArgMemOnly, NoCapture<ArgIndex<3>>]>; |
||
167 | def NAME#_pcr : Hexagon_NonGCC_Intrinsic< |
||
168 | [ElTy, llvm_ptr_ty], [llvm_ptr_ty, llvm_i32_ty, llvm_ptr_ty], |
||
169 | [IntrArgMemOnly, NoCapture<ArgIndex<2>>]>; |
||
170 | } |
||
171 | |||
172 | defm int_hexagon_L2_loadrub : Hexagon_custom_circ_ld_Intrinsic<llvm_i32_ty>; |
||
173 | defm int_hexagon_L2_loadrb : Hexagon_custom_circ_ld_Intrinsic<llvm_i32_ty>; |
||
174 | defm int_hexagon_L2_loadruh : Hexagon_custom_circ_ld_Intrinsic<llvm_i32_ty>; |
||
175 | defm int_hexagon_L2_loadrh : Hexagon_custom_circ_ld_Intrinsic<llvm_i32_ty>; |
||
176 | defm int_hexagon_L2_loadri : Hexagon_custom_circ_ld_Intrinsic<llvm_i32_ty>; |
||
177 | defm int_hexagon_L2_loadrd : Hexagon_custom_circ_ld_Intrinsic<llvm_i64_ty>; |
||
178 | |||
179 | multiclass Hexagon_custom_circ_st_Intrinsic<LLVMType ElTy> { |
||
180 | def NAME#_pci : Hexagon_NonGCC_Intrinsic< |
||
181 | [llvm_ptr_ty], |
||
182 | [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, ElTy, llvm_ptr_ty], |
||
183 | [IntrArgMemOnly, NoCapture<ArgIndex<4>>]>; |
||
184 | def NAME#_pcr : Hexagon_NonGCC_Intrinsic< |
||
185 | [llvm_ptr_ty], [llvm_ptr_ty, llvm_i32_ty, ElTy, llvm_ptr_ty], |
||
186 | [IntrArgMemOnly, NoCapture<ArgIndex<3>>]>; |
||
187 | } |
||
188 | |||
189 | defm int_hexagon_S2_storerb : Hexagon_custom_circ_st_Intrinsic<llvm_i32_ty>; |
||
190 | defm int_hexagon_S2_storerh : Hexagon_custom_circ_st_Intrinsic<llvm_i32_ty>; |
||
191 | defm int_hexagon_S2_storerf : Hexagon_custom_circ_st_Intrinsic<llvm_i32_ty>; |
||
192 | defm int_hexagon_S2_storeri : Hexagon_custom_circ_st_Intrinsic<llvm_i32_ty>; |
||
193 | defm int_hexagon_S2_storerd : Hexagon_custom_circ_st_Intrinsic<llvm_i64_ty>; |
||
194 | |||
195 | // The front-end emits the intrinsic call with only two arguments. The third |
||
196 | // argument from the builtin is already used by front-end to write to memory |
||
197 | // by generating a store. |
||
198 | class Hexagon_custom_brev_ld_Intrinsic<LLVMType ElTy> |
||
199 | : Hexagon_NonGCC_Intrinsic< |
||
200 | [ElTy, llvm_ptr_ty], [llvm_ptr_ty, llvm_i32_ty], |
||
201 | [IntrReadMem]>; |
||
202 | |||
203 | def int_hexagon_L2_loadrub_pbr : Hexagon_custom_brev_ld_Intrinsic<llvm_i32_ty>; |
||
204 | def int_hexagon_L2_loadrb_pbr : Hexagon_custom_brev_ld_Intrinsic<llvm_i32_ty>; |
||
205 | def int_hexagon_L2_loadruh_pbr : Hexagon_custom_brev_ld_Intrinsic<llvm_i32_ty>; |
||
206 | def int_hexagon_L2_loadrh_pbr : Hexagon_custom_brev_ld_Intrinsic<llvm_i32_ty>; |
||
207 | def int_hexagon_L2_loadri_pbr : Hexagon_custom_brev_ld_Intrinsic<llvm_i32_ty>; |
||
208 | def int_hexagon_L2_loadrd_pbr : Hexagon_custom_brev_ld_Intrinsic<llvm_i64_ty>; |
||
209 | |||
210 | def int_hexagon_S2_storerb_pbr : Hexagon_mem_memsisi_Intrinsic<"brev_stb">; |
||
211 | def int_hexagon_S2_storerh_pbr : Hexagon_mem_memsisi_Intrinsic<"brev_sth">; |
||
212 | def int_hexagon_S2_storerf_pbr : Hexagon_mem_memsisi_Intrinsic<"brev_sthhi">; |
||
213 | def int_hexagon_S2_storeri_pbr : Hexagon_mem_memsisi_Intrinsic<"brev_stw">; |
||
214 | def int_hexagon_S2_storerd_pbr : Hexagon_mem_memdisi_Intrinsic<"brev_std">; |
||
215 | |||
216 | // tag : V6_vrmpybub_rtt |
||
217 | class Hexagon_v32i32_v16i32i64_rtt_Intrinsic<string GCCIntSuffix> |
||
218 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
219 | [llvm_v32i32_ty], [llvm_v16i32_ty,llvm_i64_ty], |
||
220 | [IntrNoMem]>; |
||
221 | |||
222 | // tag : V6_vrmpybub_rtt_128B |
||
223 | class Hexagon_v64i32_v32i32i64_rtt_Intrinsic<string GCCIntSuffix> |
||
224 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
225 | [llvm_v64i32_ty], [llvm_v32i32_ty,llvm_i64_ty], |
||
226 | [IntrNoMem]>; |
||
227 | |||
228 | // tag : V6_vrmpybub_rtt_acc |
||
229 | class Hexagon_v32i32_v32i32v16i32i64_rtt_Intrinsic<string GCCIntSuffix> |
||
230 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
231 | [llvm_v32i32_ty], [llvm_v32i32_ty,llvm_v16i32_ty,llvm_i64_ty], |
||
232 | [IntrNoMem]>; |
||
233 | |||
234 | // tag : V6_vrmpybub_rtt_acc_128B |
||
235 | class Hexagon_v64i32_v64i32v32i32i64_rtt_Intrinsic<string GCCIntSuffix> |
||
236 | : Hexagon_Intrinsic<GCCIntSuffix, |
||
237 | [llvm_v64i32_ty], [llvm_v64i32_ty,llvm_v32i32_ty,llvm_i64_ty], |
||
238 | [IntrNoMem]>; |
||
239 | |||
240 | def int_hexagon_V6_vrmpybub_rtt : |
||
241 | Hexagon_v32i32_v16i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpybub_rtt">; |
||
242 | |||
243 | def int_hexagon_V6_vrmpybub_rtt_128B : |
||
244 | Hexagon_v64i32_v32i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpybub_rtt_128B">; |
||
245 | |||
246 | def int_hexagon_V6_vrmpybub_rtt_acc : |
||
247 | Hexagon_v32i32_v32i32v16i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpybub_rtt_acc">; |
||
248 | |||
249 | def int_hexagon_V6_vrmpybub_rtt_acc_128B : |
||
250 | Hexagon_v64i32_v64i32v32i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpybub_rtt_acc_128B">; |
||
251 | |||
252 | def int_hexagon_V6_vrmpyub_rtt : |
||
253 | Hexagon_v32i32_v16i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpyub_rtt">; |
||
254 | |||
255 | def int_hexagon_V6_vrmpyub_rtt_128B : |
||
256 | Hexagon_v64i32_v32i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpyub_rtt_128B">; |
||
257 | |||
258 | def int_hexagon_V6_vrmpyub_rtt_acc : |
||
259 | Hexagon_v32i32_v32i32v16i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpyub_rtt_acc">; |
||
260 | |||
261 | def int_hexagon_V6_vrmpyub_rtt_acc_128B : |
||
262 | Hexagon_v64i32_v64i32v32i32i64_rtt_Intrinsic<"HEXAGON_V6_vrmpyub_rtt_acc_128B">; |
||
263 | |||
264 | // HVX conditional loads/stores |
||
265 | |||
266 | class Hexagon_pred_vload_imm<LLVMType ValTy> |
||
267 | : Hexagon_NonGCC_Intrinsic< |
||
268 | [ValTy], |
||
269 | [llvm_i1_ty, LLVMPointerType<ValTy>, llvm_i32_ty], |
||
270 | [IntrReadMem, IntrArgMemOnly, NoCapture<ArgIndex<1>>, |
||
271 | ImmArg<ArgIndex<2>>]>; |
||
272 | |||
273 | class Hexagon_pred_vload_imm_64B: Hexagon_pred_vload_imm<llvm_v16i32_ty>; |
||
274 | class Hexagon_pred_vload_imm_128B: Hexagon_pred_vload_imm<llvm_v32i32_ty>; |
||
275 | |||
276 | def int_hexagon_V6_vL32b_pred_ai: Hexagon_pred_vload_imm_64B; |
||
277 | def int_hexagon_V6_vL32b_npred_ai: Hexagon_pred_vload_imm_64B; |
||
278 | def int_hexagon_V6_vL32b_nt_pred_ai: Hexagon_pred_vload_imm_64B; |
||
279 | def int_hexagon_V6_vL32b_nt_npred_ai: Hexagon_pred_vload_imm_64B; |
||
280 | def int_hexagon_V6_vL32b_pred_ai_128B: Hexagon_pred_vload_imm_128B; |
||
281 | def int_hexagon_V6_vL32b_npred_ai_128B: Hexagon_pred_vload_imm_128B; |
||
282 | def int_hexagon_V6_vL32b_nt_pred_ai_128B: Hexagon_pred_vload_imm_128B; |
||
283 | def int_hexagon_V6_vL32b_nt_npred_ai_128B: Hexagon_pred_vload_imm_128B; |
||
284 | |||
285 | class Hexagom_pred_vload_upd<LLVMType ValTy, bit TakesImm> |
||
286 | : Hexagon_NonGCC_Intrinsic< |
||
287 | [ValTy, LLVMPointerType<ValTy>], |
||
288 | [llvm_i1_ty, LLVMPointerType<ValTy>, llvm_i32_ty], |
||
289 | !if(TakesImm, |
||
290 | [IntrReadMem, IntrArgMemOnly, NoCapture<ArgIndex<1>>, |
||
291 | ImmArg<ArgIndex<2>>], |
||
292 | [IntrReadMem, IntrArgMemOnly, NoCapture<ArgIndex<1>>])>; |
||
293 | |||
294 | class Hexagom_pred_vload_upd_64B<bit TakesImm> |
||
295 | : Hexagom_pred_vload_upd<llvm_v16i32_ty, TakesImm>; |
||
296 | class Hexagom_pred_vload_upd_128B<bit TakesImm> |
||
297 | : Hexagom_pred_vload_upd<llvm_v32i32_ty, TakesImm>; |
||
298 | |||
299 | def int_hexagon_V6_vL32b_pred_pi: Hexagom_pred_vload_upd_64B<1>; |
||
300 | def int_hexagon_V6_vL32b_npred_pi: Hexagom_pred_vload_upd_64B<1>; |
||
301 | def int_hexagon_V6_vL32b_nt_pred_pi: Hexagom_pred_vload_upd_64B<1>; |
||
302 | def int_hexagon_V6_vL32b_nt_npred_pi: Hexagom_pred_vload_upd_64B<1>; |
||
303 | def int_hexagon_V6_vL32b_pred_pi_128B: Hexagom_pred_vload_upd_128B<1>; |
||
304 | def int_hexagon_V6_vL32b_npred_pi_128B: Hexagom_pred_vload_upd_128B<1>; |
||
305 | def int_hexagon_V6_vL32b_nt_pred_pi_128B: Hexagom_pred_vload_upd_128B<1>; |
||
306 | def int_hexagon_V6_vL32b_nt_npred_pi_128B: Hexagom_pred_vload_upd_128B<1>; |
||
307 | |||
308 | def int_hexagon_V6_vL32b_pred_ppu: Hexagom_pred_vload_upd_64B<0>; |
||
309 | def int_hexagon_V6_vL32b_npred_ppu: Hexagom_pred_vload_upd_64B<0>; |
||
310 | def int_hexagon_V6_vL32b_nt_pred_ppu: Hexagom_pred_vload_upd_64B<0>; |
||
311 | def int_hexagon_V6_vL32b_nt_npred_ppu: Hexagom_pred_vload_upd_64B<0>; |
||
312 | def int_hexagon_V6_vL32b_pred_ppu_128B: Hexagom_pred_vload_upd_128B<0>; |
||
313 | def int_hexagon_V6_vL32b_npred_ppu_128B: Hexagom_pred_vload_upd_128B<0>; |
||
314 | def int_hexagon_V6_vL32b_nt_pred_ppu_128B: Hexagom_pred_vload_upd_128B<0>; |
||
315 | def int_hexagon_V6_vL32b_nt_npred_ppu_128B: Hexagom_pred_vload_upd_128B<0>; |
||
316 | |||
317 | |||
318 | class Hexagon_pred_vstore_imm<LLVMType ValTy> |
||
319 | : Hexagon_NonGCC_Intrinsic< |
||
320 | [], |
||
321 | [llvm_i1_ty, LLVMPointerType<ValTy>, llvm_i32_ty, ValTy], |
||
322 | [IntrWriteMem, IntrArgMemOnly, NoCapture<ArgIndex<1>>, |
||
323 | ImmArg<ArgIndex<2>>]>; |
||
324 | |||
325 | class Hexagon_pred_vstore_imm_64B: Hexagon_pred_vstore_imm<llvm_v16i32_ty>; |
||
326 | class Hexagon_pred_vstore_imm_128B: Hexagon_pred_vstore_imm<llvm_v32i32_ty>; |
||
327 | |||
328 | def int_hexagon_V6_vS32b_pred_ai: Hexagon_pred_vstore_imm_64B; |
||
329 | def int_hexagon_V6_vS32b_npred_ai: Hexagon_pred_vstore_imm_64B; |
||
330 | def int_hexagon_V6_vS32Ub_pred_ai: Hexagon_pred_vstore_imm_64B; |
||
331 | def int_hexagon_V6_vS32Ub_npred_ai: Hexagon_pred_vstore_imm_64B; |
||
332 | def int_hexagon_V6_vS32b_nt_pred_ai: Hexagon_pred_vstore_imm_64B; |
||
333 | def int_hexagon_V6_vS32b_nt_npred_ai: Hexagon_pred_vstore_imm_64B; |
||
334 | def int_hexagon_V6_vS32b_pred_ai_128B: Hexagon_pred_vstore_imm_128B; |
||
335 | def int_hexagon_V6_vS32b_npred_ai_128B: Hexagon_pred_vstore_imm_128B; |
||
336 | def int_hexagon_V6_vS32Ub_pred_ai_128B: Hexagon_pred_vstore_imm_128B; |
||
337 | def int_hexagon_V6_vS32Ub_npred_ai_128B: Hexagon_pred_vstore_imm_128B; |
||
338 | def int_hexagon_V6_vS32b_nt_pred_ai_128B: Hexagon_pred_vstore_imm_128B; |
||
339 | def int_hexagon_V6_vS32b_nt_npred_ai_128B: Hexagon_pred_vstore_imm_128B; |
||
340 | |||
341 | class Hexagon_pred_vstore_upd<LLVMType ValTy, bit TakesImm> |
||
342 | : Hexagon_NonGCC_Intrinsic< |
||
343 | [LLVMPointerType<ValTy>], |
||
344 | [llvm_i1_ty, LLVMPointerType<ValTy>, llvm_i32_ty, ValTy], |
||
345 | !if(TakesImm, |
||
346 | [IntrWriteMem, IntrArgMemOnly, NoCapture<ArgIndex<1>>, |
||
347 | ImmArg<ArgIndex<2>>], |
||
348 | [IntrWriteMem, IntrArgMemOnly, NoCapture<ArgIndex<1>>])>; |
||
349 | |||
350 | class Hexagon_pred_vstore_upd_64B<bit TakesImm> |
||
351 | : Hexagon_pred_vstore_upd<llvm_v16i32_ty, TakesImm>; |
||
352 | class Hexagon_pred_vstore_upd_128B<bit TakesImm> |
||
353 | : Hexagon_pred_vstore_upd<llvm_v32i32_ty, TakesImm>; |
||
354 | |||
355 | def int_hexagon_V6_vS32b_pred_pi: Hexagon_pred_vstore_upd_64B<1>; |
||
356 | def int_hexagon_V6_vS32b_npred_pi: Hexagon_pred_vstore_upd_64B<1>; |
||
357 | def int_hexagon_V6_vS32Ub_pred_pi: Hexagon_pred_vstore_upd_64B<1>; |
||
358 | def int_hexagon_V6_vS32Ub_npred_pi: Hexagon_pred_vstore_upd_64B<1>; |
||
359 | def int_hexagon_V6_vS32b_nt_pred_pi: Hexagon_pred_vstore_upd_64B<1>; |
||
360 | def int_hexagon_V6_vS32b_nt_npred_pi: Hexagon_pred_vstore_upd_64B<1>; |
||
361 | def int_hexagon_V6_vS32b_pred_pi_128B: Hexagon_pred_vstore_upd_128B<1>; |
||
362 | def int_hexagon_V6_vS32b_npred_pi_128B: Hexagon_pred_vstore_upd_128B<1>; |
||
363 | def int_hexagon_V6_vS32Ub_pred_pi_128B: Hexagon_pred_vstore_upd_128B<1>; |
||
364 | def int_hexagon_V6_vS32Ub_npred_pi_128B: Hexagon_pred_vstore_upd_128B<1>; |
||
365 | def int_hexagon_V6_vS32b_nt_pred_pi_128B: Hexagon_pred_vstore_upd_128B<1>; |
||
366 | def int_hexagon_V6_vS32b_nt_npred_pi_128B: Hexagon_pred_vstore_upd_128B<1>; |
||
367 | |||
368 | def int_hexagon_V6_vS32b_pred_ppu: Hexagon_pred_vstore_upd_64B<0>; |
||
369 | def int_hexagon_V6_vS32b_npred_ppu: Hexagon_pred_vstore_upd_64B<0>; |
||
370 | def int_hexagon_V6_vS32Ub_pred_ppu: Hexagon_pred_vstore_upd_64B<0>; |
||
371 | def int_hexagon_V6_vS32Ub_npred_ppu: Hexagon_pred_vstore_upd_64B<0>; |
||
372 | def int_hexagon_V6_vS32b_nt_pred_ppu: Hexagon_pred_vstore_upd_64B<0>; |
||
373 | def int_hexagon_V6_vS32b_nt_npred_ppu: Hexagon_pred_vstore_upd_64B<0>; |
||
374 | def int_hexagon_V6_vS32b_pred_ppu_128B: Hexagon_pred_vstore_upd_128B<0>; |
||
375 | def int_hexagon_V6_vS32b_npred_ppu_128B: Hexagon_pred_vstore_upd_128B<0>; |
||
376 | def int_hexagon_V6_vS32Ub_pred_ppu_128B: Hexagon_pred_vstore_upd_128B<0>; |
||
377 | def int_hexagon_V6_vS32Ub_npred_ppu_128B: Hexagon_pred_vstore_upd_128B<0>; |
||
378 | def int_hexagon_V6_vS32b_nt_pred_ppu_128B: Hexagon_pred_vstore_upd_128B<0>; |
||
379 | def int_hexagon_V6_vS32b_nt_npred_ppu_128B: Hexagon_pred_vstore_upd_128B<0>; |
||
380 | |||
381 | |||
382 | // HVX Vector predicate casts. |
||
383 | // These intrinsics do not emit (nor do they correspond to) any instructions, |
||
384 | // they are no-ops. |
||
385 | |||
386 | def int_hexagon_V6_pred_typecast : |
||
387 | Hexagon_NonGCC_Intrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>; |
||
388 | |||
389 | def int_hexagon_V6_pred_typecast_128B : |
||
390 | Hexagon_NonGCC_Intrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>; |
||
391 | |||
392 | // HVX full-precision multiplication. |
||
393 | // V6_vmpyss_parts(Vu,Vv) = (MulHS(Vu,Vv), Mul(Vu,Vv)) |
||
394 | // V6_vmpyuu_parts(Vu,Vv) = (MulHU(Vu,Vv), Mul(Vu,Vv)) |
||
395 | // V6_vmpyus_parts(Vu,Vv) = (MulHUS(Vu,Vv), Mul(Vu,Vv)) |
||
396 | // |
||
397 | // Both, the (purportedly) 64b and the _128B versions are exactly equivalent |
||
398 | // regardless of the HVX mode, they are both defined for consistency. |
||
399 | // The purpose of these intrinsics is to have a uniform way of multiplying two |
||
400 | // integer vectors in the LLVM IR. Many HVX multiply operations interleave |
||
401 | // the even-odd results, except for 32x32 multiplications. Also, different |
||
402 | // HVX versions have different instructions that can be used, so defer the |
||
403 | // instruction choice to the isel. |
||
404 | class Hexagon_vv_vv_pure: |
||
405 | Hexagon_NonGCC_Intrinsic< |
||
406 | [llvm_anyvector_ty, LLVMMatchType<0>], |
||
407 | [LLVMMatchType<0>, LLVMMatchType<0>], |
||
408 | [IntrNoMem]>; |
||
409 | |||
410 | def int_hexagon_V6_vmpyss_parts: Hexagon_vv_vv_pure; |
||
411 | def int_hexagon_V6_vmpyss_parts_128B: Hexagon_vv_vv_pure; |
||
412 | def int_hexagon_V6_vmpyuu_parts: Hexagon_vv_vv_pure; |
||
413 | def int_hexagon_V6_vmpyuu_parts_128B: Hexagon_vv_vv_pure; |
||
414 | def int_hexagon_V6_vmpyus_parts: Hexagon_vv_vv_pure; |
||
415 | def int_hexagon_V6_vmpyus_parts_128B: Hexagon_vv_vv_pure; |
||
416 | |||
417 | |||
418 | // Masked vector stores |
||
419 | // |
||
420 | // These are all deprecated, the intrinsics matching instruction names |
||
421 | // should be used instead, e.g. int_hexagon_V6_vS32b_qpred_ai, etc. |
||
422 | |||
423 | class Hexagon_custom_vms_Intrinsic |
||
424 | : Hexagon_NonGCC_Intrinsic< |
||
425 | [], [llvm_v64i1_ty,llvm_ptr_ty,llvm_v16i32_ty], [IntrWriteMem]>; |
||
426 | |||
427 | class Hexagon_custom_vms_Intrinsic_128B |
||
428 | : Hexagon_NonGCC_Intrinsic< |
||
429 | [], [llvm_v128i1_ty,llvm_ptr_ty,llvm_v32i32_ty], [IntrWriteMem]>; |
||
430 | |||
431 | def int_hexagon_V6_vmaskedstoreq: Hexagon_custom_vms_Intrinsic; |
||
432 | def int_hexagon_V6_vmaskedstorenq: Hexagon_custom_vms_Intrinsic; |
||
433 | def int_hexagon_V6_vmaskedstorentq: Hexagon_custom_vms_Intrinsic; |
||
434 | def int_hexagon_V6_vmaskedstorentnq: Hexagon_custom_vms_Intrinsic; |
||
435 | |||
436 | def int_hexagon_V6_vmaskedstoreq_128B: Hexagon_custom_vms_Intrinsic_128B; |
||
437 | def int_hexagon_V6_vmaskedstorenq_128B: Hexagon_custom_vms_Intrinsic_128B; |
||
438 | def int_hexagon_V6_vmaskedstorentq_128B: Hexagon_custom_vms_Intrinsic_128B; |
||
439 | def int_hexagon_V6_vmaskedstorentnq_128B: Hexagon_custom_vms_Intrinsic_128B; |
||
440 | |||
441 | |||
442 | // Intrinsic for instrumentation based profiling using a custom handler. The |
||
443 | // name of the handler is passed as the first operand to the intrinsic. The |
||
444 | // handler can take only one int32 input which is passed as the second |
||
445 | // operand to the intrinsic. |
||
446 | def int_hexagon_instrprof_custom |
||
447 | : Hexagon_NonGCC_Intrinsic<[], |
||
448 | [llvm_ptr_ty, llvm_i32_ty], |
||
449 | [IntrInaccessibleMemOnly]>; |
||
450 | |||
451 | |||
452 | include "llvm/IR/IntrinsicsHexagonDep.td" |