xref: /aosp_15_r20/external/pytorch/torch/csrc/jit/tensorexpr/intrinsic_symbols.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1 #ifdef TORCH_ENABLE_LLVM
2 #include <c10/util/Half.h>
3 #include <torch/csrc/jit/tensorexpr/intrinsic_symbols.h>
4 #include <cmath>
5 
6 #if !defined(_MSC_VER) && defined(__x86_64__)
7 #include <x86intrin.h>
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif // __cplusplus
12 
13 __m128 Sleef_acosf4_u10(__m128);
14 __m128 Sleef_asinf4_u10(__m128);
15 __m128 Sleef_atanf4_u10(__m128);
16 __m128 Sleef_cosf4_u10(__m128);
17 __m128 Sleef_sinf4_u10(__m128);
18 __m128 Sleef_tanf4_u10(__m128);
19 __m128 Sleef_coshf4_u10(__m128);
20 __m128 Sleef_sinhf4_u10(__m128);
21 __m128 Sleef_tanhf4_u10(__m128);
22 __m128 Sleef_erff4_u10(__m128);
23 __m128 Sleef_erfcf4_u15(__m128);
24 __m128 Sleef_expf4_u10(__m128);
25 __m128 Sleef_expm1f4_u10(__m128);
26 __m128 Sleef_logf4_u10(__m128);
27 __m128 Sleef_log2f4_u10(__m128);
28 __m128 Sleef_log10f4_u10(__m128);
29 __m128 Sleef_log1pf4_u10(__m128);
30 __m128 Sleef_sqrtf4_u05(__m128);
31 __m128 Sleef_fabsf4(__m128);
32 __m128 Sleef_floorf4(__m128);
33 __m128 Sleef_ceilf4(__m128);
34 __m128 Sleef_truncf4(__m128);
35 __m128 Sleef_roundf4(__m128);
36 __m128 Sleef_lgammaf4_u10(__m128);
37 __m128 Sleef_atan2f4_u10(__m128, __m128);
38 __m128 Sleef_powf4_u10(__m128, __m128);
39 __m128 Sleef_fmodf4(__m128, __m128);
40 
41 __m256 Sleef_acosf8_u10(__m256);
42 __m256 Sleef_asinf8_u10(__m256);
43 __m256 Sleef_atanf8_u10(__m256);
44 __m256 Sleef_cosf8_u10(__m256);
45 __m256 Sleef_sinf8_u10(__m256);
46 __m256 Sleef_tanf8_u10(__m256);
47 __m256 Sleef_coshf8_u10(__m256);
48 __m256 Sleef_sinhf8_u10(__m256);
49 __m256 Sleef_tanhf8_u10(__m256);
50 __m256 Sleef_erff8_u10(__m256);
51 __m256 Sleef_erfcf8_u15(__m256);
52 __m256 Sleef_expf8_u10(__m256);
53 __m256 Sleef_expm1f8_u10(__m256);
54 __m256 Sleef_logf8_u10(__m256);
55 __m256 Sleef_log2f8_u10(__m256);
56 __m256 Sleef_log10f8_u10(__m256);
57 __m256 Sleef_log1pf8_u10(__m256);
58 __m256 Sleef_sqrtf8_u05(__m256);
59 __m256 Sleef_fabsf8(__m256);
60 __m256 Sleef_floorf8(__m256);
61 __m256 Sleef_ceilf8(__m256);
62 __m256 Sleef_truncf8(__m256);
63 __m256 Sleef_roundf8(__m256);
64 __m256 Sleef_lgammaf8_u10(__m256);
65 __m256 Sleef_atan2f8_u10(__m256, __m256);
66 __m256 Sleef_powf8_u10(__m256, __m256);
67 __m256 Sleef_fmodf8(__m256, __m256);
68 
69 __m128d Sleef_acosd2_u10(__m128d);
70 __m128d Sleef_asind2_u10(__m128d);
71 __m128d Sleef_atand2_u10(__m128d);
72 __m128d Sleef_cosd2_u10(__m128d);
73 __m128d Sleef_sind2_u10(__m128d);
74 __m128d Sleef_tand2_u10(__m128d);
75 __m128d Sleef_coshd2_u10(__m128d);
76 __m128d Sleef_sinhd2_u10(__m128d);
77 __m128d Sleef_tanhd2_u10(__m128d);
78 __m128d Sleef_erfd2_u10(__m128d);
79 __m128d Sleef_erfcd2_u15(__m128d);
80 __m128d Sleef_expd2_u10(__m128d);
81 __m128d Sleef_expm1d2_u10(__m128d);
82 __m128d Sleef_logd2_u10(__m128d);
83 __m128d Sleef_log2d2_u10(__m128d);
84 __m128d Sleef_log10d2_u10(__m128d);
85 __m128d Sleef_log1pd2_u10(__m128d);
86 __m128d Sleef_sqrtd2_u05(__m128d);
87 __m128d Sleef_fabsd2(__m128d);
88 __m128d Sleef_floord2(__m128d);
89 __m128d Sleef_ceild2(__m128d);
90 __m128d Sleef_truncd2(__m128d);
91 __m128d Sleef_roundd2(__m128d);
92 __m128d Sleef_lgammad2_u10(__m128d);
93 __m128d Sleef_atan2d2_u10(__m128d, __m128d);
94 __m128d Sleef_powd2_u10(__m128d, __m128d);
95 __m128d Sleef_fmodd2(__m128d, __m128d);
96 
97 __m256d Sleef_acosd4_u10(__m256d);
98 __m256d Sleef_asind4_u10(__m256d);
99 __m256d Sleef_atand4_u10(__m256d);
100 __m256d Sleef_cosd4_u10(__m256d);
101 __m256d Sleef_sind4_u10(__m256d);
102 __m256d Sleef_tand4_u10(__m256d);
103 __m256d Sleef_coshd4_u10(__m256d);
104 __m256d Sleef_sinhd4_u10(__m256d);
105 __m256d Sleef_tanhd4_u10(__m256d);
106 __m256d Sleef_erfd4_u10(__m256d);
107 __m256d Sleef_erfcd4_u15(__m256d);
108 __m256d Sleef_expd4_u10(__m256d);
109 __m256d Sleef_expm1d4_u10(__m256d);
110 __m256d Sleef_logd4_u10(__m256d);
111 __m256d Sleef_log2d4_u10(__m256d);
112 __m256d Sleef_log10d4_u10(__m256d);
113 __m256d Sleef_log1pd4_u10(__m256d);
114 __m256d Sleef_sqrtd4_u05(__m256d);
115 __m256d Sleef_fabsd4(__m256d);
116 __m256d Sleef_floord4(__m256d);
117 __m256d Sleef_ceild4(__m256d);
118 __m256d Sleef_truncd4(__m256d);
119 __m256d Sleef_roundd4(__m256d);
120 __m256d Sleef_lgammad4_u10(__m256d);
121 __m256d Sleef_atan2d4_u10(__m256d, __m256d);
122 __m256d Sleef_powd4_u10(__m256d, __m256d);
123 __m256d Sleef_fmodd4(__m256d, __m256d);
124 
125 #ifdef __cplusplus
126 }
127 #endif // __cplusplus
128 #endif // !defined(_MSC_VER) && defined(__x86_64__)
129 
130 namespace torch::jit::tensorexpr {
131 
getIntrinsicSymbols()132 c10::ArrayRef<SymbolAddress> getIntrinsicSymbols() {
133   static SymbolAddress symbolAddresses[] = {
134     {"log10f", reinterpret_cast<void*>(&log10f)},
135     {"log1pf", reinterpret_cast<void*>(&log1pf)},
136     {"logf", reinterpret_cast<void*>(&logf)},
137     {"log2f", reinterpret_cast<void*>(&log2f)},
138     {"expf", reinterpret_cast<void*>(&expf)},
139     {"erff", reinterpret_cast<void*>(&erff)},
140     {"cosf", reinterpret_cast<void*>(&cosf)},
141     {"sinf", reinterpret_cast<void*>(&sinf)},
142     {"tanf", reinterpret_cast<void*>(&tanf)},
143     {"acosf", reinterpret_cast<void*>(&acosf)},
144     {"asinf", reinterpret_cast<void*>(&asinf)},
145     {"atanf", reinterpret_cast<void*>(&atanf)},
146     {"coshf", reinterpret_cast<void*>(&coshf)},
147     {"sinhf", reinterpret_cast<void*>(&sinhf)},
148     {"tanhf", reinterpret_cast<void*>(&tanhf)},
149     {"sqrtf", reinterpret_cast<void*>(&sqrtf)},
150     {"fabsf", reinterpret_cast<void*>(&fabsf)},
151     {"floorf", reinterpret_cast<void*>(&floorf)},
152     {"ceilf", reinterpret_cast<void*>(&ceilf)},
153     {"roundf", reinterpret_cast<void*>(&roundf)},
154     {"truncf", reinterpret_cast<void*>(&truncf)},
155     {"atan2f", reinterpret_cast<void*>(&atan2f)},
156     {"fmodf", reinterpret_cast<void*>(&fmodf)},
157     {"remainderf", reinterpret_cast<void*>(&remainderf)},
158 
159     // float -> half & half -> float conversions
160     {"__gnu_h2f_ieee",
161      reinterpret_cast<void*>(&c10::detail::fp16_ieee_to_fp32_value)},
162     {"__gnu_f2h_ieee",
163      reinterpret_cast<void*>(&c10::detail::fp16_ieee_from_fp32_value)},
164 
165 #if !defined(_MSC_VER) && defined(__x86_64__)
166     // FP32 Sleef functions -- SSE
167     {"Sleef_acosf4", reinterpret_cast<void*>(&Sleef_acosf4_u10)},
168     {"Sleef_asinf4", reinterpret_cast<void*>(&Sleef_asinf4_u10)},
169     {"Sleef_atanf4", reinterpret_cast<void*>(&Sleef_atanf4_u10)},
170     {"Sleef_cosf4", reinterpret_cast<void*>(&Sleef_cosf4_u10)},
171     {"Sleef_sinf4", reinterpret_cast<void*>(&Sleef_sinf4_u10)},
172     {"Sleef_tanf4", reinterpret_cast<void*>(&Sleef_tanf4_u10)},
173     {"Sleef_coshf4", reinterpret_cast<void*>(&Sleef_coshf4_u10)},
174     {"Sleef_sinhf4", reinterpret_cast<void*>(&Sleef_sinhf4_u10)},
175     {"Sleef_tanhf4", reinterpret_cast<void*>(&Sleef_tanhf4_u10)},
176     {"Sleef_erff4", reinterpret_cast<void*>(&Sleef_erff4_u10)},
177     {"Sleef_erfcf4", reinterpret_cast<void*>(&Sleef_erfcf4_u15)},
178     {"Sleef_expf4", reinterpret_cast<void*>(&Sleef_expf4_u10)},
179     {"Sleef_expm1f4", reinterpret_cast<void*>(&Sleef_expm1f4_u10)},
180     {"Sleef_logf4", reinterpret_cast<void*>(&Sleef_logf4_u10)},
181     {"Sleef_log2f4", reinterpret_cast<void*>(&Sleef_log2f4_u10)},
182     {"Sleef_log10f4", reinterpret_cast<void*>(&Sleef_log10f4_u10)},
183     {"Sleef_log1pf4", reinterpret_cast<void*>(&Sleef_log1pf4_u10)},
184     {"Sleef_sqrtf4", reinterpret_cast<void*>(&Sleef_sqrtf4_u05)},
185     {"Sleef_fabsf4", reinterpret_cast<void*>(&Sleef_fabsf4)},
186     {"Sleef_floorf4", reinterpret_cast<void*>(&Sleef_floorf4)},
187     {"Sleef_ceilf4", reinterpret_cast<void*>(&Sleef_ceilf4)},
188     {"Sleef_truncf4", reinterpret_cast<void*>(&Sleef_truncf4)},
189     {"Sleef_roundf4", reinterpret_cast<void*>(&Sleef_roundf4)},
190     {"Sleef_lgammaf4", reinterpret_cast<void*>(&Sleef_lgammaf4_u10)},
191     {"Sleef_atan2f4", reinterpret_cast<void*>(&Sleef_atan2f4_u10)},
192     {"Sleef_powf4", reinterpret_cast<void*>(&Sleef_powf4_u10)},
193     {"Sleef_fmodf4", reinterpret_cast<void*>(&Sleef_fmodf4)},
194 
195     // FP32 Sleef functions -- AVX2
196     {"Sleef_acosf8", reinterpret_cast<void*>(&Sleef_acosf8_u10)},
197     {"Sleef_asinf8", reinterpret_cast<void*>(&Sleef_asinf8_u10)},
198     {"Sleef_atanf8", reinterpret_cast<void*>(&Sleef_atanf8_u10)},
199     {"Sleef_cosf8", reinterpret_cast<void*>(&Sleef_cosf8_u10)},
200     {"Sleef_sinf8", reinterpret_cast<void*>(&Sleef_sinf8_u10)},
201     {"Sleef_tanf8", reinterpret_cast<void*>(&Sleef_tanf8_u10)},
202     {"Sleef_coshf8", reinterpret_cast<void*>(&Sleef_coshf8_u10)},
203     {"Sleef_sinhf8", reinterpret_cast<void*>(&Sleef_sinhf8_u10)},
204     {"Sleef_tanhf8", reinterpret_cast<void*>(&Sleef_tanhf8_u10)},
205     {"Sleef_erff8", reinterpret_cast<void*>(&Sleef_erff8_u10)},
206     {"Sleef_erfcf8", reinterpret_cast<void*>(&Sleef_erfcf8_u15)},
207     {"Sleef_expf8", reinterpret_cast<void*>(&Sleef_expf8_u10)},
208     {"Sleef_expm1f8", reinterpret_cast<void*>(&Sleef_expm1f8_u10)},
209     {"Sleef_logf8", reinterpret_cast<void*>(&Sleef_logf8_u10)},
210     {"Sleef_log2f8", reinterpret_cast<void*>(&Sleef_log2f8_u10)},
211     {"Sleef_log10f8", reinterpret_cast<void*>(&Sleef_log10f8_u10)},
212     {"Sleef_log1pf8", reinterpret_cast<void*>(&Sleef_log1pf8_u10)},
213     {"Sleef_sqrtf8", reinterpret_cast<void*>(&Sleef_sqrtf8_u05)},
214     {"Sleef_fabsf8", reinterpret_cast<void*>(&Sleef_fabsf8)},
215     {"Sleef_floorf8", reinterpret_cast<void*>(&Sleef_floorf8)},
216     {"Sleef_ceilf8", reinterpret_cast<void*>(&Sleef_ceilf8)},
217     {"Sleef_truncf8", reinterpret_cast<void*>(&Sleef_truncf8)},
218     {"Sleef_roundf8", reinterpret_cast<void*>(&Sleef_roundf8)},
219     {"Sleef_lgammaf8", reinterpret_cast<void*>(&Sleef_lgammaf8_u10)},
220     {"Sleef_atan2f8", reinterpret_cast<void*>(&Sleef_atan2f8_u10)},
221     {"Sleef_powf8", reinterpret_cast<void*>(&Sleef_powf8_u10)},
222     {"Sleef_fmodf8", reinterpret_cast<void*>(&Sleef_fmodf8)},
223 
224     // FP64 Sleef functions -- SSE
225     {"Sleef_acosd2", reinterpret_cast<void*>(&Sleef_acosd2_u10)},
226     {"Sleef_asind2", reinterpret_cast<void*>(&Sleef_asind2_u10)},
227     {"Sleef_atand2", reinterpret_cast<void*>(&Sleef_atand2_u10)},
228     {"Sleef_cosd2", reinterpret_cast<void*>(&Sleef_cosd2_u10)},
229     {"Sleef_sind2", reinterpret_cast<void*>(&Sleef_sind2_u10)},
230     {"Sleef_tand2", reinterpret_cast<void*>(&Sleef_tand2_u10)},
231     {"Sleef_coshd2", reinterpret_cast<void*>(&Sleef_coshd2_u10)},
232     {"Sleef_sinhd2", reinterpret_cast<void*>(&Sleef_sinhd2_u10)},
233     {"Sleef_tanhd2", reinterpret_cast<void*>(&Sleef_tanhd2_u10)},
234     {"Sleef_erfd2", reinterpret_cast<void*>(&Sleef_erfd2_u10)},
235     {"Sleef_erfcd2", reinterpret_cast<void*>(&Sleef_erfcd2_u15)},
236     {"Sleef_expd2", reinterpret_cast<void*>(&Sleef_expd2_u10)},
237     {"Sleef_expm1d2", reinterpret_cast<void*>(&Sleef_expm1d2_u10)},
238     {"Sleef_logd2", reinterpret_cast<void*>(&Sleef_logd2_u10)},
239     {"Sleef_log2d2", reinterpret_cast<void*>(&Sleef_log2d2_u10)},
240     {"Sleef_log10d2", reinterpret_cast<void*>(&Sleef_log10d2_u10)},
241     {"Sleef_log1pd2", reinterpret_cast<void*>(&Sleef_log1pd2_u10)},
242     {"Sleef_sqrtd2", reinterpret_cast<void*>(&Sleef_sqrtd2_u05)},
243     {"Sleef_fabsd2", reinterpret_cast<void*>(&Sleef_fabsd2)},
244     {"Sleef_floord2", reinterpret_cast<void*>(&Sleef_floord2)},
245     {"Sleef_ceild2", reinterpret_cast<void*>(&Sleef_ceild2)},
246     {"Sleef_truncd2", reinterpret_cast<void*>(&Sleef_truncd2)},
247     {"Sleef_roundd2", reinterpret_cast<void*>(&Sleef_roundd2)},
248     {"Sleef_lgammad2", reinterpret_cast<void*>(&Sleef_lgammad2_u10)},
249     {"Sleef_atan2d2", reinterpret_cast<void*>(&Sleef_atan2d2_u10)},
250     {"Sleef_powd2", reinterpret_cast<void*>(&Sleef_powd2_u10)},
251     {"Sleef_fmodd2", reinterpret_cast<void*>(&Sleef_fmodd2)},
252 
253     // FP64 Sleef functions -- AVX2
254     {"Sleef_acosd4", reinterpret_cast<void*>(&Sleef_acosd4_u10)},
255     {"Sleef_asind4", reinterpret_cast<void*>(&Sleef_asind4_u10)},
256     {"Sleef_atand4", reinterpret_cast<void*>(&Sleef_atand4_u10)},
257     {"Sleef_cosd4", reinterpret_cast<void*>(&Sleef_cosd4_u10)},
258     {"Sleef_sind4", reinterpret_cast<void*>(&Sleef_sind4_u10)},
259     {"Sleef_tand4", reinterpret_cast<void*>(&Sleef_tand4_u10)},
260     {"Sleef_coshd4", reinterpret_cast<void*>(&Sleef_coshd4_u10)},
261     {"Sleef_sinhd4", reinterpret_cast<void*>(&Sleef_sinhd4_u10)},
262     {"Sleef_tanhd4", reinterpret_cast<void*>(&Sleef_tanhd4_u10)},
263     {"Sleef_erfd4", reinterpret_cast<void*>(&Sleef_erfd4_u10)},
264     {"Sleef_erfcd4", reinterpret_cast<void*>(&Sleef_erfcd4_u15)},
265     {"Sleef_expd4", reinterpret_cast<void*>(&Sleef_expd4_u10)},
266     {"Sleef_expm1d4", reinterpret_cast<void*>(&Sleef_expm1d4_u10)},
267     {"Sleef_logd4", reinterpret_cast<void*>(&Sleef_logd4_u10)},
268     {"Sleef_log2d4", reinterpret_cast<void*>(&Sleef_log2d4_u10)},
269     {"Sleef_log10d4", reinterpret_cast<void*>(&Sleef_log10d4_u10)},
270     {"Sleef_log1pd4", reinterpret_cast<void*>(&Sleef_log1pd4_u10)},
271     {"Sleef_sqrtd4", reinterpret_cast<void*>(&Sleef_sqrtd4_u05)},
272     {"Sleef_fabsd4", reinterpret_cast<void*>(&Sleef_fabsd4)},
273     {"Sleef_floord4", reinterpret_cast<void*>(&Sleef_floord4)},
274     {"Sleef_ceild4", reinterpret_cast<void*>(&Sleef_ceild4)},
275     {"Sleef_truncd4", reinterpret_cast<void*>(&Sleef_truncd4)},
276     {"Sleef_roundd4", reinterpret_cast<void*>(&Sleef_roundd4)},
277     {"Sleef_lgammad4", reinterpret_cast<void*>(&Sleef_lgammad4_u10)},
278     {"Sleef_atan2d4", reinterpret_cast<void*>(&Sleef_atan2d4_u10)},
279     {"Sleef_powd4", reinterpret_cast<void*>(&Sleef_powd4_u10)},
280     {"Sleef_fmodd4", reinterpret_cast<void*>(&Sleef_fmodd4)},
281 #endif
282   };
283   return c10::ArrayRef<SymbolAddress>(symbolAddresses);
284 }
285 
286 } // namespace torch::jit::tensorexpr
287 #endif // TORCH_ENABLE_LLVM
288