xref: /freebsd-src/contrib/llvm-project/llvm/include/llvm/IR/IntrinsicsWebAssembly.td (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1//===- IntrinsicsWebAssembly.td - Defines wasm intrinsics --*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file defines all of the WebAssembly-specific intrinsics.
11///
12//===----------------------------------------------------------------------===//
13
14// Type definition for a table in an intrinsic
15def llvm_table_ty : LLVMQualPointerType<llvm_i8_ty, 1>;
16
17let TargetPrefix = "wasm" in {  // All intrinsics start with "llvm.wasm.".
18
19// Query the current memory size, and increase the current memory size.
20// Note that memory.size is not IntrNoMem because it must be sequenced with
21// respect to memory.grow calls.
22def int_wasm_memory_size :
23  DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_i32_ty], [IntrReadMem]>;
24def int_wasm_memory_grow :
25  DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_i32_ty, LLVMMatchType<0>], []>;
26
27//===----------------------------------------------------------------------===//
28// ref.null intrinsics
29//===----------------------------------------------------------------------===//
30def int_wasm_ref_null_extern :
31  DefaultAttrsIntrinsic<[llvm_externref_ty], [], [IntrNoMem]>;
32def int_wasm_ref_null_func :
33  DefaultAttrsIntrinsic<[llvm_funcref_ty], [], [IntrNoMem]>;
34def int_wasm_ref_is_null_extern :
35  DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_externref_ty], [IntrNoMem],
36                        "llvm.wasm.ref.is_null.extern">;
37def int_wasm_ref_is_null_func :
38  DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_funcref_ty],
39                        [IntrNoMem], "llvm.wasm.ref.is_null.func">;
40
41//===----------------------------------------------------------------------===//
42// Table intrinsics
43//===----------------------------------------------------------------------===//
44def int_wasm_table_set_externref :
45  DefaultAttrsIntrinsic<[], [llvm_table_ty, llvm_i32_ty, llvm_externref_ty],
46                        [IntrWriteMem]>;
47def int_wasm_table_set_funcref :
48  DefaultAttrsIntrinsic<[], [llvm_table_ty, llvm_i32_ty, llvm_funcref_ty],
49                        [IntrWriteMem]>;
50
51def int_wasm_table_get_externref :
52  DefaultAttrsIntrinsic<[llvm_externref_ty], [llvm_table_ty, llvm_i32_ty],
53                        [IntrReadMem]>;
54def int_wasm_table_get_funcref :
55  DefaultAttrsIntrinsic<[llvm_funcref_ty], [llvm_table_ty, llvm_i32_ty],
56                        [IntrReadMem]>;
57
58// Query the current table size, and increase the current table size.
59def int_wasm_table_size :
60  DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_table_ty], [IntrReadMem]>;
61def int_wasm_table_copy :
62  DefaultAttrsIntrinsic<[],
63                        [llvm_table_ty, llvm_table_ty, llvm_i32_ty, llvm_i32_ty,
64                         llvm_i32_ty], []>;
65def int_wasm_table_grow_externref :
66  DefaultAttrsIntrinsic<[llvm_i32_ty],
67                        [llvm_table_ty, llvm_externref_ty, llvm_i32_ty], []>;
68def int_wasm_table_grow_funcref :
69  DefaultAttrsIntrinsic<[llvm_i32_ty],
70                        [llvm_table_ty, llvm_funcref_ty, llvm_i32_ty], []>;
71def int_wasm_table_fill_externref :
72  DefaultAttrsIntrinsic<[],
73                        [llvm_table_ty, llvm_i32_ty, llvm_externref_ty,
74                         llvm_i32_ty], []>;
75def int_wasm_table_fill_funcref :
76  DefaultAttrsIntrinsic<[],
77                        [llvm_table_ty, llvm_i32_ty, llvm_funcref_ty,
78                         llvm_i32_ty], []>;
79
80//===----------------------------------------------------------------------===//
81// Trapping float-to-int conversions
82//===----------------------------------------------------------------------===//
83
84// These don't use default attributes, because they are not willreturn.
85def int_wasm_trunc_signed : Intrinsic<[llvm_anyint_ty],
86                                      [llvm_anyfloat_ty],
87                                      [IntrNoMem]>;
88def int_wasm_trunc_unsigned : Intrinsic<[llvm_anyint_ty],
89                                        [llvm_anyfloat_ty],
90                                        [IntrNoMem]>;
91
92//===----------------------------------------------------------------------===//
93// Saturating float-to-int conversions
94//===----------------------------------------------------------------------===//
95
96def int_wasm_trunc_saturate_signed :
97  DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty],
98                        [IntrNoMem, IntrSpeculatable]>;
99def int_wasm_trunc_saturate_unsigned :
100  DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty],
101                        [IntrNoMem, IntrSpeculatable]>;
102
103//===----------------------------------------------------------------------===//
104// Exception handling intrinsics
105//===----------------------------------------------------------------------===//
106
107// throw / rethrow
108// The first immediate argument is an index to a tag, which is 0 for C++
109// exception. The second argument is the thrown exception pointer.
110def int_wasm_throw : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty],
111                               [Throws, IntrNoReturn, ImmArg<ArgIndex<0>>]>;
112def int_wasm_rethrow : Intrinsic<[], [], [Throws, IntrNoReturn]>;
113
114// Since wasm does not use landingpad instructions, these instructions return
115// exception pointer and selector values until we lower them in WasmEHPrepare.
116def int_wasm_get_exception :
117  DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_token_ty], [IntrHasSideEffects]>;
118def int_wasm_get_ehselector :
119  DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_token_ty], [IntrHasSideEffects]>;
120
121// wasm.catch returns the pointer to the exception object caught by wasm 'catch'
122// instruction. This returns a single pointer, which is the case for C++
123// exceptions. The immediate argument is an index to for a tag, which is 0 for
124// C++ exceptions.
125def int_wasm_catch :
126  DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_i32_ty],
127                        [IntrHasSideEffects, ImmArg<ArgIndex<0>>]>;
128
129// WebAssembly EH must maintain the landingpads in the order assigned to them
130// by WasmEHPrepare pass to generate landingpad table in EHStreamer. This is
131// used in order to give them the indices in WasmEHPrepare.
132def int_wasm_landingpad_index :
133  DefaultAttrsIntrinsic<[], [llvm_token_ty, llvm_i32_ty],
134                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
135
136// Returns LSDA address of the current function.
137def int_wasm_lsda : DefaultAttrsIntrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
138
139//===----------------------------------------------------------------------===//
140// Atomic intrinsics
141//===----------------------------------------------------------------------===//
142
143// wait / notify
144// These don't use default attributes, because they are not nosync.
145def int_wasm_memory_atomic_wait32 :
146  Intrinsic<[llvm_i32_ty],
147            [LLVMPointerType<llvm_i32_ty>, llvm_i32_ty, llvm_i64_ty],
148            [IntrInaccessibleMemOrArgMemOnly, ReadOnly<ArgIndex<0>>,
149             NoCapture<ArgIndex<0>>, IntrHasSideEffects],
150            "", [SDNPMemOperand]>;
151def int_wasm_memory_atomic_wait64 :
152  Intrinsic<[llvm_i32_ty],
153            [LLVMPointerType<llvm_i64_ty>, llvm_i64_ty, llvm_i64_ty],
154            [IntrInaccessibleMemOrArgMemOnly, ReadOnly<ArgIndex<0>>,
155             NoCapture<ArgIndex<0>>, IntrHasSideEffects],
156            "", [SDNPMemOperand]>;
157def int_wasm_memory_atomic_notify:
158  Intrinsic<[llvm_i32_ty], [LLVMPointerType<llvm_i32_ty>, llvm_i32_ty],
159            [IntrInaccessibleMemOnly, NoCapture<ArgIndex<0>>,
160             IntrHasSideEffects],
161            "", [SDNPMemOperand]>;
162
163//===----------------------------------------------------------------------===//
164// SIMD intrinsics
165//===----------------------------------------------------------------------===//
166
167def int_wasm_swizzle :
168  DefaultAttrsIntrinsic<[llvm_v16i8_ty],
169                        [llvm_v16i8_ty, llvm_v16i8_ty],
170                        [IntrNoMem, IntrSpeculatable]>;
171def int_wasm_shuffle :
172  DefaultAttrsIntrinsic<[llvm_v16i8_ty],
173                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty,
174                         llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
175                         llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
176                         llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
177                         llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
178                        [IntrNoMem, IntrSpeculatable]>;
179def int_wasm_sub_sat_signed :
180  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
181                        [LLVMMatchType<0>, LLVMMatchType<0>],
182                        [IntrNoMem, IntrSpeculatable]>;
183def int_wasm_sub_sat_unsigned :
184  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
185                        [LLVMMatchType<0>, LLVMMatchType<0>],
186                        [IntrNoMem, IntrSpeculatable]>;
187def int_wasm_avgr_unsigned :
188  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
189                        [LLVMMatchType<0>, LLVMMatchType<0>],
190                        [IntrNoMem, IntrSpeculatable]>;
191def int_wasm_bitselect :
192  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
193                        [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
194                        [IntrNoMem, IntrSpeculatable]>;
195def int_wasm_anytrue :
196  DefaultAttrsIntrinsic<[llvm_i32_ty],
197                        [llvm_anyvector_ty],
198                        [IntrNoMem, IntrSpeculatable]>;
199def int_wasm_alltrue :
200  DefaultAttrsIntrinsic<[llvm_i32_ty],
201                        [llvm_anyvector_ty],
202                        [IntrNoMem, IntrSpeculatable]>;
203def int_wasm_bitmask :
204  DefaultAttrsIntrinsic<[llvm_i32_ty],
205                        [llvm_anyvector_ty],
206                        [IntrNoMem, IntrSpeculatable]>;
207def int_wasm_dot :
208  DefaultAttrsIntrinsic<[llvm_v4i32_ty],
209                        [llvm_v8i16_ty, llvm_v8i16_ty],
210                        [IntrNoMem, IntrSpeculatable]>;
211
212def int_wasm_narrow_signed :
213  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
214                        [llvm_anyvector_ty, LLVMMatchType<1>],
215                        [IntrNoMem, IntrSpeculatable]>;
216def int_wasm_narrow_unsigned :
217  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
218                        [llvm_anyvector_ty, LLVMMatchType<1>],
219                        [IntrNoMem, IntrSpeculatable]>;
220
221def int_wasm_q15mulr_sat_signed :
222  DefaultAttrsIntrinsic<[llvm_v8i16_ty],
223                        [llvm_v8i16_ty, llvm_v8i16_ty],
224                        [IntrNoMem, IntrSpeculatable]>;
225
226def int_wasm_pmin :
227  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
228                        [LLVMMatchType<0>, LLVMMatchType<0>],
229                        [IntrNoMem, IntrSpeculatable]>;
230def int_wasm_pmax :
231  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
232                        [LLVMMatchType<0>, LLVMMatchType<0>],
233                        [IntrNoMem, IntrSpeculatable]>;
234
235def int_wasm_extadd_pairwise_signed :
236  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
237                        [LLVMSubdivide2VectorType<0>],
238                        [IntrNoMem, IntrSpeculatable]>;
239def int_wasm_extadd_pairwise_unsigned :
240  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
241                        [LLVMSubdivide2VectorType<0>],
242                        [IntrNoMem, IntrSpeculatable]>;
243
244//===----------------------------------------------------------------------===//
245// Relaxed SIMD intrinsics (experimental)
246//===----------------------------------------------------------------------===//
247
248def int_wasm_relaxed_madd :
249  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
250                        [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
251                        [IntrNoMem, IntrSpeculatable]>;
252def int_wasm_relaxed_nmadd :
253  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
254                        [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
255                        [IntrNoMem, IntrSpeculatable]>;
256
257def int_wasm_relaxed_laneselect :
258  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
259                        [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
260                        [IntrNoMem, IntrSpeculatable]>;
261
262def int_wasm_relaxed_swizzle :
263  DefaultAttrsIntrinsic<[llvm_v16i8_ty],
264                        [llvm_v16i8_ty, llvm_v16i8_ty],
265                        [IntrNoMem, IntrSpeculatable]>;
266
267def int_wasm_relaxed_min :
268  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
269                        [LLVMMatchType<0>, LLVMMatchType<0>],
270                        [IntrNoMem, IntrSpeculatable]>;
271def int_wasm_relaxed_max :
272  DefaultAttrsIntrinsic<[llvm_anyvector_ty],
273                        [LLVMMatchType<0>, LLVMMatchType<0>],
274                        [IntrNoMem, IntrSpeculatable]>;
275
276def int_wasm_relaxed_trunc_signed:
277  DefaultAttrsIntrinsic<[llvm_v4i32_ty],
278                        [llvm_v4f32_ty],
279                        [IntrNoMem, IntrSpeculatable]>;
280
281def int_wasm_relaxed_trunc_unsigned:
282  DefaultAttrsIntrinsic<[llvm_v4i32_ty],
283                        [llvm_v4f32_ty],
284                        [IntrNoMem, IntrSpeculatable]>;
285
286def int_wasm_relaxed_trunc_signed_zero:
287  DefaultAttrsIntrinsic<[llvm_v4i32_ty],
288                        [llvm_v2f64_ty],
289                        [IntrNoMem, IntrSpeculatable]>;
290
291def int_wasm_relaxed_trunc_unsigned_zero:
292  DefaultAttrsIntrinsic<[llvm_v4i32_ty],
293                        [llvm_v2f64_ty],
294                        [IntrNoMem, IntrSpeculatable]>;
295
296def int_wasm_relaxed_q15mulr_signed:
297  DefaultAttrsIntrinsic<[llvm_v8i16_ty],
298                        [llvm_v8i16_ty, llvm_v8i16_ty],
299                        [IntrNoMem, IntrSpeculatable]>;
300
301def int_wasm_relaxed_dot_i8x16_i7x16_signed:
302  DefaultAttrsIntrinsic<[llvm_v8i16_ty],
303                        [llvm_v16i8_ty, llvm_v16i8_ty],
304                        [IntrNoMem, IntrSpeculatable]>;
305
306def int_wasm_relaxed_dot_i8x16_i7x16_add_signed:
307  DefaultAttrsIntrinsic<[llvm_v4i32_ty],
308                        [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v4i32_ty],
309                        [IntrNoMem, IntrSpeculatable]>;
310
311def int_wasm_relaxed_dot_bf16x8_add_f32:
312  DefaultAttrsIntrinsic<[llvm_v4f32_ty],
313                        [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4f32_ty],
314                        [IntrNoMem, IntrSpeculatable]>;
315
316
317//===----------------------------------------------------------------------===//
318// Thread-local storage intrinsics
319//===----------------------------------------------------------------------===//
320
321def int_wasm_tls_size :
322  DefaultAttrsIntrinsic<[llvm_anyint_ty],
323                        [],
324                        [IntrNoMem, IntrSpeculatable]>;
325
326def int_wasm_tls_align :
327  DefaultAttrsIntrinsic<[llvm_anyint_ty],
328                        [],
329                        [IntrNoMem, IntrSpeculatable]>;
330
331def int_wasm_tls_base :
332  DefaultAttrsIntrinsic<[llvm_ptr_ty],
333                        [],
334                        [IntrReadMem]>;
335
336} // TargetPrefix = "wasm"
337