1 | // BuiltinsWebAssembly.def - WebAssembly builtin function database -*- C++ -*-// |
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 the WebAssembly-specific builtin function database. |
11 | /// Users of this file must define the BUILTIN macro to make use of this |
12 | /// information. |
13 | /// |
14 | //===----------------------------------------------------------------------===// |
15 | |
16 | // The format of this database matches clang/Basic/Builtins.def. |
17 | |
18 | #if defined(BUILTIN) && !defined(TARGET_BUILTIN) |
19 | # define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS) |
20 | #endif |
21 | |
22 | // Query the current memory size, and increase the current memory size. |
23 | // Note that memory.size is not "c" (readnone) because it must be sequenced |
24 | // with respect to memory.grow calls. |
25 | BUILTIN(__builtin_wasm_memory_size, "zIi" , "n" ) |
26 | BUILTIN(__builtin_wasm_memory_grow, "zIiz" , "n" ) |
27 | |
28 | // Thread-local storage |
29 | TARGET_BUILTIN(__builtin_wasm_tls_size, "z" , "nc" , "bulk-memory" ) |
30 | TARGET_BUILTIN(__builtin_wasm_tls_align, "z" , "nc" , "bulk-memory" ) |
31 | TARGET_BUILTIN(__builtin_wasm_tls_base, "v*" , "nU" , "bulk-memory" ) |
32 | |
33 | // Floating point min/max |
34 | BUILTIN(__builtin_wasm_min_f32, "fff" , "nc" ) |
35 | BUILTIN(__builtin_wasm_max_f32, "fff" , "nc" ) |
36 | BUILTIN(__builtin_wasm_min_f64, "ddd" , "nc" ) |
37 | BUILTIN(__builtin_wasm_max_f64, "ddd" , "nc" ) |
38 | |
39 | // Exception handling builtins. |
40 | TARGET_BUILTIN(__builtin_wasm_throw, "vIUiv*" , "r" , "exception-handling" ) |
41 | TARGET_BUILTIN(__builtin_wasm_rethrow, "v" , "r" , "exception-handling" ) |
42 | |
43 | // Atomic wait and notify. |
44 | TARGET_BUILTIN(__builtin_wasm_memory_atomic_wait32, "ii*iLLi" , "n" , "atomics" ) |
45 | TARGET_BUILTIN(__builtin_wasm_memory_atomic_wait64, "iLLi*LLiLLi" , "n" , "atomics" ) |
46 | TARGET_BUILTIN(__builtin_wasm_memory_atomic_notify, "Uii*Ui" , "n" , "atomics" ) |
47 | |
48 | // Trapping fp-to-int conversions |
49 | BUILTIN(__builtin_wasm_trunc_s_i32_f32, "if" , "nc" ) |
50 | BUILTIN(__builtin_wasm_trunc_u_i32_f32, "if" , "nc" ) |
51 | BUILTIN(__builtin_wasm_trunc_s_i32_f64, "id" , "nc" ) |
52 | BUILTIN(__builtin_wasm_trunc_u_i32_f64, "id" , "nc" ) |
53 | BUILTIN(__builtin_wasm_trunc_s_i64_f32, "LLif" , "nc" ) |
54 | BUILTIN(__builtin_wasm_trunc_u_i64_f32, "LLif" , "nc" ) |
55 | BUILTIN(__builtin_wasm_trunc_s_i64_f64, "LLid" , "nc" ) |
56 | BUILTIN(__builtin_wasm_trunc_u_i64_f64, "LLid" , "nc" ) |
57 | |
58 | // Saturating fp-to-int conversions |
59 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_s_i32_f32, "if" , "nc" , "nontrapping-fptoint" ) |
60 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i32_f32, "if" , "nc" , "nontrapping-fptoint" ) |
61 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_s_i32_f64, "id" , "nc" , "nontrapping-fptoint" ) |
62 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i32_f64, "id" , "nc" , "nontrapping-fptoint" ) |
63 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_s_i64_f32, "LLif" , "nc" , "nontrapping-fptoint" ) |
64 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i64_f32, "LLif" , "nc" , "nontrapping-fptoint" ) |
65 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_s_i64_f64, "LLid" , "nc" , "nontrapping-fptoint" ) |
66 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i64_f64, "LLid" , "nc" , "nontrapping-fptoint" ) |
67 | |
68 | // SIMD builtins |
69 | TARGET_BUILTIN(__builtin_wasm_swizzle_i8x16, "V16ScV16ScV16Sc" , "nc" , "simd128" ) |
70 | |
71 | TARGET_BUILTIN(__builtin_wasm_add_sat_s_i8x16, "V16ScV16ScV16Sc" , "nc" , "simd128" ) |
72 | TARGET_BUILTIN(__builtin_wasm_add_sat_u_i8x16, "V16UcV16UcV16Uc" , "nc" , "simd128" ) |
73 | TARGET_BUILTIN(__builtin_wasm_add_sat_s_i16x8, "V8sV8sV8s" , "nc" , "simd128" ) |
74 | TARGET_BUILTIN(__builtin_wasm_add_sat_u_i16x8, "V8UsV8UsV8Us" , "nc" , "simd128" ) |
75 | |
76 | TARGET_BUILTIN(__builtin_wasm_sub_sat_s_i8x16, "V16ScV16ScV16Sc" , "nc" , "simd128" ) |
77 | TARGET_BUILTIN(__builtin_wasm_sub_sat_u_i8x16, "V16UcV16UcV16Uc" , "nc" , "simd128" ) |
78 | TARGET_BUILTIN(__builtin_wasm_sub_sat_s_i16x8, "V8sV8sV8s" , "nc" , "simd128" ) |
79 | TARGET_BUILTIN(__builtin_wasm_sub_sat_u_i16x8, "V8UsV8UsV8Us" , "nc" , "simd128" ) |
80 | |
81 | TARGET_BUILTIN(__builtin_wasm_abs_i8x16, "V16ScV16Sc" , "nc" , "simd128" ) |
82 | TARGET_BUILTIN(__builtin_wasm_abs_i16x8, "V8sV8s" , "nc" , "simd128" ) |
83 | TARGET_BUILTIN(__builtin_wasm_abs_i32x4, "V4iV4i" , "nc" , "simd128" ) |
84 | TARGET_BUILTIN(__builtin_wasm_abs_i64x2, "V2LLiV2LLi" , "nc" , "simd128" ) |
85 | |
86 | TARGET_BUILTIN(__builtin_wasm_min_s_i8x16, "V16ScV16ScV16Sc" , "nc" , "simd128" ) |
87 | TARGET_BUILTIN(__builtin_wasm_min_u_i8x16, "V16UcV16UcV16Uc" , "nc" , "simd128" ) |
88 | TARGET_BUILTIN(__builtin_wasm_max_s_i8x16, "V16ScV16ScV16Sc" , "nc" , "simd128" ) |
89 | TARGET_BUILTIN(__builtin_wasm_max_u_i8x16, "V16UcV16UcV16Uc" , "nc" , "simd128" ) |
90 | TARGET_BUILTIN(__builtin_wasm_min_s_i16x8, "V8sV8sV8s" , "nc" , "simd128" ) |
91 | TARGET_BUILTIN(__builtin_wasm_min_u_i16x8, "V8UsV8UsV8Us" , "nc" , "simd128" ) |
92 | TARGET_BUILTIN(__builtin_wasm_max_s_i16x8, "V8sV8sV8s" , "nc" , "simd128" ) |
93 | TARGET_BUILTIN(__builtin_wasm_max_u_i16x8, "V8UsV8UsV8Us" , "nc" , "simd128" ) |
94 | TARGET_BUILTIN(__builtin_wasm_min_s_i32x4, "V4iV4iV4i" , "nc" , "simd128" ) |
95 | TARGET_BUILTIN(__builtin_wasm_min_u_i32x4, "V4UiV4UiV4Ui" , "nc" , "simd128" ) |
96 | TARGET_BUILTIN(__builtin_wasm_max_s_i32x4, "V4iV4iV4i" , "nc" , "simd128" ) |
97 | TARGET_BUILTIN(__builtin_wasm_max_u_i32x4, "V4UiV4UiV4Ui" , "nc" , "simd128" ) |
98 | |
99 | TARGET_BUILTIN(__builtin_wasm_avgr_u_i8x16, "V16UcV16UcV16Uc" , "nc" , "simd128" ) |
100 | TARGET_BUILTIN(__builtin_wasm_avgr_u_i16x8, "V8UsV8UsV8Us" , "nc" , "simd128" ) |
101 | |
102 | TARGET_BUILTIN(__builtin_wasm_popcnt_i8x16, "V16ScV16Sc" , "nc" , "simd128" ) |
103 | |
104 | TARGET_BUILTIN(__builtin_wasm_q15mulr_sat_s_i16x8, "V8sV8sV8s" , "nc" , "simd128" ) |
105 | |
106 | TARGET_BUILTIN(__builtin_wasm_extadd_pairwise_i8x16_s_i16x8, "V8sV16Sc" , "nc" , "simd128" ) |
107 | TARGET_BUILTIN(__builtin_wasm_extadd_pairwise_i8x16_u_i16x8, "V8UsV16Uc" , "nc" , "simd128" ) |
108 | |
109 | TARGET_BUILTIN(__builtin_wasm_extadd_pairwise_i16x8_s_i32x4, "V4iV8s" , "nc" , "simd128" ) |
110 | TARGET_BUILTIN(__builtin_wasm_extadd_pairwise_i16x8_u_i32x4, "V4UiV8Us" , "nc" , "simd128" ) |
111 | |
112 | TARGET_BUILTIN(__builtin_wasm_bitselect, "V4iV4iV4iV4i" , "nc" , "simd128" ) |
113 | |
114 | TARGET_BUILTIN(__builtin_wasm_shuffle_i8x16, "V16ScV16ScV16ScIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi" , "nc" , "simd128" ) |
115 | |
116 | TARGET_BUILTIN(__builtin_wasm_any_true_v128, "iV16Sc" , "nc" , "simd128" ) |
117 | TARGET_BUILTIN(__builtin_wasm_all_true_i8x16, "iV16Sc" , "nc" , "simd128" ) |
118 | TARGET_BUILTIN(__builtin_wasm_all_true_i16x8, "iV8s" , "nc" , "simd128" ) |
119 | TARGET_BUILTIN(__builtin_wasm_all_true_i32x4, "iV4i" , "nc" , "simd128" ) |
120 | TARGET_BUILTIN(__builtin_wasm_all_true_i64x2, "iV2LLi" , "nc" , "simd128" ) |
121 | |
122 | TARGET_BUILTIN(__builtin_wasm_bitmask_i8x16, "UiV16Sc" , "nc" , "simd128" ) |
123 | TARGET_BUILTIN(__builtin_wasm_bitmask_i16x8, "UiV8s" , "nc" , "simd128" ) |
124 | TARGET_BUILTIN(__builtin_wasm_bitmask_i32x4, "UiV4i" , "nc" , "simd128" ) |
125 | TARGET_BUILTIN(__builtin_wasm_bitmask_i64x2, "UiV2LLi" , "nc" , "simd128" ) |
126 | |
127 | TARGET_BUILTIN(__builtin_wasm_abs_f32x4, "V4fV4f" , "nc" , "simd128" ) |
128 | TARGET_BUILTIN(__builtin_wasm_abs_f64x2, "V2dV2d" , "nc" , "simd128" ) |
129 | |
130 | TARGET_BUILTIN(__builtin_wasm_min_f32x4, "V4fV4fV4f" , "nc" , "simd128" ) |
131 | TARGET_BUILTIN(__builtin_wasm_max_f32x4, "V4fV4fV4f" , "nc" , "simd128" ) |
132 | TARGET_BUILTIN(__builtin_wasm_pmin_f32x4, "V4fV4fV4f" , "nc" , "simd128" ) |
133 | TARGET_BUILTIN(__builtin_wasm_pmax_f32x4, "V4fV4fV4f" , "nc" , "simd128" ) |
134 | TARGET_BUILTIN(__builtin_wasm_min_f64x2, "V2dV2dV2d" , "nc" , "simd128" ) |
135 | TARGET_BUILTIN(__builtin_wasm_max_f64x2, "V2dV2dV2d" , "nc" , "simd128" ) |
136 | TARGET_BUILTIN(__builtin_wasm_pmin_f64x2, "V2dV2dV2d" , "nc" , "simd128" ) |
137 | TARGET_BUILTIN(__builtin_wasm_pmax_f64x2, "V2dV2dV2d" , "nc" , "simd128" ) |
138 | |
139 | TARGET_BUILTIN(__builtin_wasm_ceil_f32x4, "V4fV4f" , "nc" , "simd128" ) |
140 | TARGET_BUILTIN(__builtin_wasm_floor_f32x4, "V4fV4f" , "nc" , "simd128" ) |
141 | TARGET_BUILTIN(__builtin_wasm_trunc_f32x4, "V4fV4f" , "nc" , "simd128" ) |
142 | TARGET_BUILTIN(__builtin_wasm_nearest_f32x4, "V4fV4f" , "nc" , "simd128" ) |
143 | TARGET_BUILTIN(__builtin_wasm_ceil_f64x2, "V2dV2d" , "nc" , "simd128" ) |
144 | TARGET_BUILTIN(__builtin_wasm_floor_f64x2, "V2dV2d" , "nc" , "simd128" ) |
145 | TARGET_BUILTIN(__builtin_wasm_trunc_f64x2, "V2dV2d" , "nc" , "simd128" ) |
146 | TARGET_BUILTIN(__builtin_wasm_nearest_f64x2, "V2dV2d" , "nc" , "simd128" ) |
147 | |
148 | TARGET_BUILTIN(__builtin_wasm_dot_s_i32x4_i16x8, "V4iV8sV8s" , "nc" , "simd128" ) |
149 | |
150 | TARGET_BUILTIN(__builtin_wasm_sqrt_f32x4, "V4fV4f" , "nc" , "simd128" ) |
151 | TARGET_BUILTIN(__builtin_wasm_sqrt_f64x2, "V2dV2d" , "nc" , "simd128" ) |
152 | |
153 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_s_i32x4_f32x4, "V4iV4f" , "nc" , "simd128" ) |
154 | TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i32x4_f32x4, "V4iV4f" , "nc" , "simd128" ) |
155 | |
156 | TARGET_BUILTIN(__builtin_wasm_narrow_s_i8x16_i16x8, "V16ScV8sV8s" , "nc" , "simd128" ) |
157 | TARGET_BUILTIN(__builtin_wasm_narrow_u_i8x16_i16x8, "V16UcV8sV8s" , "nc" , "simd128" ) |
158 | TARGET_BUILTIN(__builtin_wasm_narrow_s_i16x8_i32x4, "V8sV4iV4i" , "nc" , "simd128" ) |
159 | TARGET_BUILTIN(__builtin_wasm_narrow_u_i16x8_i32x4, "V8UsV4iV4i" , "nc" , "simd128" ) |
160 | |
161 | TARGET_BUILTIN(__builtin_wasm_trunc_sat_s_zero_f64x2_i32x4, "V4iV2d" , "nc" , "simd128" ) |
162 | TARGET_BUILTIN(__builtin_wasm_trunc_sat_u_zero_f64x2_i32x4, "V4UiV2d" , "nc" , "simd128" ) |
163 | |
164 | // Relaxed SIMD builtins |
165 | TARGET_BUILTIN(__builtin_wasm_relaxed_madd_f32x4, "V4fV4fV4fV4f" , "nc" , "relaxed-simd" ) |
166 | TARGET_BUILTIN(__builtin_wasm_relaxed_nmadd_f32x4, "V4fV4fV4fV4f" , "nc" , "relaxed-simd" ) |
167 | TARGET_BUILTIN(__builtin_wasm_relaxed_madd_f64x2, "V2dV2dV2dV2d" , "nc" , "relaxed-simd" ) |
168 | TARGET_BUILTIN(__builtin_wasm_relaxed_nmadd_f64x2, "V2dV2dV2dV2d" , "nc" , "relaxed-simd" ) |
169 | |
170 | TARGET_BUILTIN(__builtin_wasm_relaxed_laneselect_i8x16, "V16ScV16ScV16ScV16Sc" , "nc" , "relaxed-simd" ) |
171 | TARGET_BUILTIN(__builtin_wasm_relaxed_laneselect_i16x8, "V8sV8sV8sV8s" , "nc" , "relaxed-simd" ) |
172 | TARGET_BUILTIN(__builtin_wasm_relaxed_laneselect_i32x4, "V4iV4iV4iV4i" , "nc" , "relaxed-simd" ) |
173 | TARGET_BUILTIN(__builtin_wasm_relaxed_laneselect_i64x2, "V2LLiV2LLiV2LLiV2LLi" , "nc" , "relaxed-simd" ) |
174 | |
175 | TARGET_BUILTIN(__builtin_wasm_relaxed_swizzle_i8x16, "V16ScV16ScV16Sc" , "nc" , "relaxed-simd" ) |
176 | |
177 | TARGET_BUILTIN(__builtin_wasm_relaxed_min_f32x4, "V4fV4fV4f" , "nc" , "relaxed-simd" ) |
178 | TARGET_BUILTIN(__builtin_wasm_relaxed_max_f32x4, "V4fV4fV4f" , "nc" , "relaxed-simd" ) |
179 | TARGET_BUILTIN(__builtin_wasm_relaxed_min_f64x2, "V2dV2dV2d" , "nc" , "relaxed-simd" ) |
180 | TARGET_BUILTIN(__builtin_wasm_relaxed_max_f64x2, "V2dV2dV2d" , "nc" , "relaxed-simd" ) |
181 | |
182 | TARGET_BUILTIN(__builtin_wasm_relaxed_trunc_s_i32x4_f32x4, "V4iV4f" , "nc" , "relaxed-simd" ) |
183 | TARGET_BUILTIN(__builtin_wasm_relaxed_trunc_u_i32x4_f32x4, "V4UiV4f" , "nc" , "relaxed-simd" ) |
184 | TARGET_BUILTIN(__builtin_wasm_relaxed_trunc_s_zero_i32x4_f64x2, "V4iV2d" , "nc" , "relaxed-simd" ) |
185 | TARGET_BUILTIN(__builtin_wasm_relaxed_trunc_u_zero_i32x4_f64x2, "V4UiV2d" , "nc" , "relaxed-simd" ) |
186 | |
187 | TARGET_BUILTIN(__builtin_wasm_relaxed_q15mulr_s_i16x8, "V8sV8sV8s" , "nc" , "relaxed-simd" ) |
188 | |
189 | TARGET_BUILTIN(__builtin_wasm_relaxed_dot_i8x16_i7x16_s_i16x8, "V8sV16ScV16Sc" , "nc" , "relaxed-simd" ) |
190 | TARGET_BUILTIN(__builtin_wasm_relaxed_dot_i8x16_i7x16_add_s_i32x4, "V4iV16ScV16ScV4i" , "nc" , "relaxed-simd" ) |
191 | TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" , "nc" , "relaxed-simd" ) |
192 | |
193 | // Reference Types builtins |
194 | // Some builtins are custom type-checked - see 't' as part of the third argument, |
195 | // in which case the argument spec (second argument) is unused. |
196 | |
197 | TARGET_BUILTIN(__builtin_wasm_ref_null_extern, "i" , "nct" , "reference-types" ) |
198 | |
199 | // A funcref represented as a function pointer with the funcref attribute |
200 | // attached to the type, therefore SemaChecking will check for the right |
201 | // return type. |
202 | TARGET_BUILTIN(__builtin_wasm_ref_null_func, "i" , "nct" , "reference-types" ) |
203 | |
204 | // Table builtins |
205 | TARGET_BUILTIN(__builtin_wasm_table_set, "viii" , "t" , "reference-types" ) |
206 | TARGET_BUILTIN(__builtin_wasm_table_get, "iii" , "t" , "reference-types" ) |
207 | TARGET_BUILTIN(__builtin_wasm_table_size, "zi" , "nt" , "reference-types" ) |
208 | TARGET_BUILTIN(__builtin_wasm_table_grow, "iiii" , "nt" , "reference-types" ) |
209 | TARGET_BUILTIN(__builtin_wasm_table_fill, "viiii" , "t" , "reference-types" ) |
210 | TARGET_BUILTIN(__builtin_wasm_table_copy, "viiiii" , "t" , "reference-types" ) |
211 | |
212 | #undef BUILTIN |
213 | #undef TARGET_BUILTIN |
214 | |