1 // RUN: mlir-opt %s -pass-pipeline="builtin.module(func.func(test-math-polynomial-approximation,convert-arith-to-llvm),convert-vector-to-scf,convert-scf-to-cf,convert-cf-to-llvm,convert-vector-to-llvm,func.func(convert-math-to-llvm),convert-func-to-llvm,reconcile-unrealized-casts)" \
2 // RUN: | mlir-cpu-runner \
3 // RUN: -e main -entry-point-result=void -O0 \
4 // RUN: -shared-libs=%mlir_c_runner_utils \
5 // RUN: -shared-libs=%mlir_runner_utils \
8 // -------------------------------------------------------------------------- //
10 // -------------------------------------------------------------------------- //
12 func.func @tanh_f32(%a : f32) {
13 %r = math.tanh %a : f32
18 func.func @tanh_4xf32(%a : vector<4xf32>) {
19 %r = math.tanh %a : vector<4xf32>
20 vector.print %r : vector<4xf32>
24 func.func @tanh_8xf32(%a : vector<8xf32>) {
25 %r = math.tanh %a : vector<8xf32>
26 vector.print %r : vector<8xf32>
32 %f0 = arith.constant 1.25 : f32
33 call @tanh_f32(%f0) : (f32) -> ()
35 // CHECK: 0.244919, 0.635149, 0.761594, 0.848284
36 %v1 = arith.constant dense<[0.25, 0.75, 1.0, 1.25]> : vector<4xf32>
37 call @tanh_4xf32(%v1) : (vector<4xf32>) -> ()
39 // CHECK: 0.099668, 0.197375, 0.291313, 0.379949, 0.462117, 0.53705, 0.604368, 0.664037
40 %v2 = arith.constant dense<[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]> : vector<8xf32>
41 call @tanh_8xf32(%v2) : (vector<8xf32>) -> ()
44 %nan = arith.constant 0x7fc00000 : f32
45 call @tanh_f32(%nan) : (f32) -> ()
50 // -------------------------------------------------------------------------- //
52 // -------------------------------------------------------------------------- //
54 func.func @log_f32(%a : f32) {
55 %r = math.log %a : f32
60 func.func @log_4xf32(%a : vector<4xf32>) {
61 %r = math.log %a : vector<4xf32>
62 vector.print %r : vector<4xf32>
66 func.func @log_8xf32(%a : vector<8xf32>) {
67 %r = math.log %a : vector<8xf32>
68 vector.print %r : vector<8xf32>
74 %f1 = arith.constant 14.112233 : f32
75 call @log_f32(%f1) : (f32) -> ()
77 // CHECK: -1.38629, -0.287682, 0, 0.223144
78 %v1 = arith.constant dense<[0.25, 0.75, 1.0, 1.25]> : vector<4xf32>
79 call @log_4xf32(%v1) : (vector<4xf32>) -> ()
81 // CHECK: -2.30259, -1.60944, -1.20397, -0.916291, -0.693147, -0.510826, -0.356675, -0.223144
82 %v2 = arith.constant dense<[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]> : vector<8xf32>
83 call @log_8xf32(%v2) : (vector<8xf32>) -> ()
86 %zero = arith.constant 0.0 : f32
87 call @log_f32(%zero) : (f32) -> ()
90 %nan = arith.constant 0x7fc00000 : f32
91 call @log_f32(%nan) : (f32) -> ()
94 %inf = arith.constant 0x7f800000 : f32
95 call @log_f32(%inf) : (f32) -> ()
97 // CHECK: -inf, nan, inf, 0.693147
98 %special_vec = arith.constant dense<[0.0, -1.0, 0x7f800000, 2.0]> : vector<4xf32>
99 call @log_4xf32(%special_vec) : (vector<4xf32>) -> ()
104 func.func @log2_f32(%a : f32) {
105 %r = math.log2 %a : f32
106 vector.print %r : f32
110 func.func @log2_4xf32(%a : vector<4xf32>) {
111 %r = math.log2 %a : vector<4xf32>
112 vector.print %r : vector<4xf32>
116 func.func @log2_8xf32(%a : vector<8xf32>) {
117 %r = math.log2 %a : vector<8xf32>
118 vector.print %r : vector<8xf32>
124 %f0 = arith.constant 14.112233 : f32
125 call @log2_f32(%f0) : (f32) -> ()
127 // CHECK: -2, -0.415037, 0, 0.321928
128 %v1 = arith.constant dense<[0.25, 0.75, 1.0, 1.25]> : vector<4xf32>
129 call @log2_4xf32(%v1) : (vector<4xf32>) -> ()
131 // CHECK: -3.32193, -2.32193, -1.73697, -1.32193, -1, -0.736966, -0.514573, -0.321928
132 %v2 = arith.constant dense<[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]> : vector<8xf32>
133 call @log2_8xf32(%v2) : (vector<8xf32>) -> ()
136 %zero = arith.constant 0.0 : f32
137 call @log2_f32(%zero) : (f32) -> ()
140 %neg_one = arith.constant -1.0 : f32
141 call @log2_f32(%neg_one) : (f32) -> ()
144 %inf = arith.constant 0x7f800000 : f32
145 call @log2_f32(%inf) : (f32) -> ()
147 // CHECK: -inf, nan, inf, 1.58496
148 %special_vec = arith.constant dense<[0.0, -1.0, 0x7f800000, 3.0]> : vector<4xf32>
149 call @log2_4xf32(%special_vec) : (vector<4xf32>) -> ()
154 func.func @log1p_f32(%a : f32) {
155 %r = math.log1p %a : f32
156 vector.print %r : f32
160 func.func @log1p_4xf32(%a : vector<4xf32>) {
161 %r = math.log1p %a : vector<4xf32>
162 vector.print %r : vector<4xf32>
166 func.func @log1p_8xf32(%a : vector<8xf32>) {
167 %r = math.log1p %a : vector<8xf32>
168 vector.print %r : vector<8xf32>
174 %f0 = arith.constant 0.01 : f32
175 call @log1p_f32(%f0) : (f32) -> ()
178 // CHECK: -4.60517, -0.693147, 0, 1.38629
179 %v1 = arith.constant dense<[-0.99, -0.5, 0.0, 3.0]> : vector<4xf32>
180 call @log1p_4xf32(%v1) : (vector<4xf32>) -> ()
182 // CHECK: 0.0953102, 0.182322, 0.262364, 0.336472, 0.405465, 0.470004, 0.530628, 0.587787
183 %v2 = arith.constant dense<[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]> : vector<8xf32>
184 call @log1p_8xf32(%v2) : (vector<8xf32>) -> ()
187 %neg_one = arith.constant -1.0 : f32
188 call @log1p_f32(%neg_one) : (f32) -> ()
191 %neg_two = arith.constant -2.0 : f32
192 call @log1p_f32(%neg_two) : (f32) -> ()
195 %inf = arith.constant 0x7f800000 : f32
196 call @log1p_f32(%inf) : (f32) -> ()
198 // CHECK: -inf, nan, inf, 9.99995e-06
199 %special_vec = arith.constant dense<[-1.0, -1.1, 0x7f800000, 0.00001]> : vector<4xf32>
200 call @log1p_4xf32(%special_vec) : (vector<4xf32>) -> ()
205 // -------------------------------------------------------------------------- //
207 // -------------------------------------------------------------------------- //
208 func.func @erf_f32(%a : f32) {
209 %r = math.erf %a : f32
210 vector.print %r : f32
214 func.func @erf_4xf32(%a : vector<4xf32>) {
215 %r = math.erf %a : vector<4xf32>
216 vector.print %r : vector<4xf32>
221 // CHECK: -0.000274406
222 %val1 = arith.constant -2.431864e-4 : f32
223 call @erf_f32(%val1) : (f32) -> ()
226 %val2 = arith.constant 0.79999 : f32
227 call @erf_f32(%val2) : (f32) -> ()
230 %val3 = arith.constant 0.8 : f32
231 call @erf_f32(%val3) : (f32) -> ()
234 %val4 = arith.constant 1.99999 : f32
235 call @erf_f32(%val4) : (f32) -> ()
238 %val5 = arith.constant 2.0 : f32
239 call @erf_f32(%val5) : (f32) -> ()
242 %val6 = arith.constant 3.74999 : f32
243 call @erf_f32(%val6) : (f32) -> ()
246 %val7 = arith.constant 3.75 : f32
247 call @erf_f32(%val7) : (f32) -> ()
250 %negativeInf = arith.constant 0xff800000 : f32
251 call @erf_f32(%negativeInf) : (f32) -> ()
253 // CHECK: -1, -1, -0.913759, -0.731446
254 %vecVals1 = arith.constant dense<[-3.4028235e+38, -4.54318, -1.2130899, -7.8234202e-01]> : vector<4xf32>
255 call @erf_4xf32(%vecVals1) : (vector<4xf32>) -> ()
257 // CHECK: -1.3264e-38, 0, 1.3264e-38, 0.121319
258 %vecVals2 = arith.constant dense<[-1.1754944e-38, 0.0, 1.1754944e-38, 1.0793410e-01]> : vector<4xf32>
259 call @erf_4xf32(%vecVals2) : (vector<4xf32>) -> ()
261 // CHECK: 0.919477, 0.999069, 1, 1
262 %vecVals3 = arith.constant dense<[1.23578, 2.34093, 3.82342, 3.4028235e+38]> : vector<4xf32>
263 call @erf_4xf32(%vecVals3) : (vector<4xf32>) -> ()
266 %inf = arith.constant 0x7f800000 : f32
267 call @erf_f32(%inf) : (f32) -> ()
270 %nan = arith.constant 0x7fc00000 : f32
271 call @erf_f32(%nan) : (f32) -> ()
276 // -------------------------------------------------------------------------- //
278 // -------------------------------------------------------------------------- //
279 func.func @exp_f32(%a : f32) {
280 %r = math.exp %a : f32
281 vector.print %r : f32
285 func.func @exp_4xf32(%a : vector<4xf32>) {
286 %r = math.exp %a : vector<4xf32>
287 vector.print %r : vector<4xf32>
293 %f0 = arith.constant 1.0 : f32
294 call @exp_f32(%f0) : (f32) -> ()
296 // CHECK: 0.778801, 2.117, 2.71828, 3.85743
297 %v1 = arith.constant dense<[-0.25, 0.75, 1.0, 1.35]> : vector<4xf32>
298 call @exp_4xf32(%v1) : (vector<4xf32>) -> ()
301 %zero = arith.constant 0.0 : f32
302 call @exp_f32(%zero) : (f32) -> ()
304 // CHECK: 0, 1.38879e-11, 7.20049e+10, inf
305 %special_vec = arith.constant dense<[-89.0, -25.0, 25.0, 89.0]> : vector<4xf32>
306 call @exp_4xf32(%special_vec) : (vector<4xf32>) -> ()
309 %inf = arith.constant 0x7f800000 : f32
310 call @exp_f32(%inf) : (f32) -> ()
313 %negative_inf = arith.constant 0xff800000 : f32
314 call @exp_f32(%negative_inf) : (f32) -> ()
317 %nan = arith.constant 0x7fc00000 : f32
318 call @exp_f32(%nan) : (f32) -> ()
323 func.func @expm1_f32(%a : f32) {
324 %r = math.expm1 %a : f32
325 vector.print %r : f32
329 func.func @expm1_3xf32(%a : vector<3xf32>) {
330 %r = math.expm1 %a : vector<3xf32>
331 vector.print %r : vector<3xf32>
335 func.func @expm1_4xf32(%a : vector<4xf32>) {
336 %r = math.expm1 %a : vector<4xf32>
337 vector.print %r : vector<4xf32>
341 func.func @expm1_8xf32(%a : vector<8xf32>) {
342 %r = math.expm1 %a : vector<8xf32>
343 vector.print %r : vector<8xf32>
349 %f0 = arith.constant 1.0e-10 : f32
350 call @expm1_f32(%f0) : (f32) -> ()
352 // CHECK: -0.00995017, 0.0100502, 0.648721, 6.38906
353 %v1 = arith.constant dense<[-0.01, 0.01, 0.5, 2.0]> : vector<4xf32>
354 call @expm1_4xf32(%v1) : (vector<4xf32>) -> ()
356 // CHECK: -0.181269, 0, 0.221403, 0.491825, 0.822119, 1.22554, 1.71828, 2.32012
357 %v2 = arith.constant dense<[-0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2]> : vector<8xf32>
358 call @expm1_8xf32(%v2) : (vector<8xf32>) -> ()
361 %neg_inf = arith.constant 0xff800000 : f32
362 call @expm1_f32(%neg_inf) : (f32) -> ()
365 %inf = arith.constant 0x7f800000 : f32
366 call @expm1_f32(%inf) : (f32) -> ()
368 // CHECK: -1, inf, 1e-10
369 %special_vec = arith.constant dense<[0xff800000, 0x7f800000, 1.0e-10]> : vector<3xf32>
370 call @expm1_3xf32(%special_vec) : (vector<3xf32>) -> ()
373 %nan = arith.constant 0x7fc00000 : f32
374 call @expm1_f32(%nan) : (f32) -> ()
378 // -------------------------------------------------------------------------- //
380 // -------------------------------------------------------------------------- //
381 func.func @sin_f32(%a : f32) {
382 %r = math.sin %a : f32
383 vector.print %r : f32
387 func.func @sin_3xf32(%a : vector<3xf32>) {
388 %r = math.sin %a : vector<3xf32>
389 vector.print %r : vector<3xf32>
395 %zero = arith.constant 0.0 : f32
396 call @sin_f32(%zero) : (f32) -> ()
399 %pi_over_4 = arith.constant 0.78539816339 : f32
400 call @sin_f32(%pi_over_4) : (f32) -> ()
403 %pi_over_2 = arith.constant 1.57079632679 : f32
404 call @sin_f32(%pi_over_2) : (f32) -> ()
407 %pi = arith.constant 3.14159265359 : f32
408 call @sin_f32(%pi) : (f32) -> ()
411 %pi_3_over_2 = arith.constant 4.71238898038 : f32
412 call @sin_f32(%pi_3_over_2) : (f32) -> ()
414 // CHECK: 0, 0.866025, -1
415 %vec_x = arith.constant dense<[9.42477796077, 2.09439510239, -1.57079632679]> : vector<3xf32>
416 call @sin_3xf32(%vec_x) : (vector<3xf32>) -> ()
421 // -------------------------------------------------------------------------- //
423 // -------------------------------------------------------------------------- //
424 func.func @cos_f32(%a : f32) {
425 %r = math.cos %a : f32
426 vector.print %r : f32
430 func.func @cos_3xf32(%a : vector<3xf32>) {
431 %r = math.cos %a : vector<3xf32>
432 vector.print %r : vector<3xf32>
438 %zero = arith.constant 0.0 : f32
439 call @cos_f32(%zero) : (f32) -> ()
442 %pi_over_4 = arith.constant 0.78539816339 : f32
443 call @cos_f32(%pi_over_4) : (f32) -> ()
446 %pi_over_2 = arith.constant 1.57079632679 : f32
447 call @cos_f32(%pi_over_2) : (f32) -> ()
450 %pi = arith.constant 3.14159265359 : f32
451 call @cos_f32(%pi) : (f32) -> ()
454 %pi_3_over_2 = arith.constant 4.71238898038 : f32
455 call @cos_f32(%pi_3_over_2) : (f32) -> ()
457 // CHECK: -1, -0.5, 0
458 %vec_x = arith.constant dense<[9.42477796077, 2.09439510239, -1.57079632679]> : vector<3xf32>
459 call @cos_3xf32(%vec_x) : (vector<3xf32>) -> ()
464 // -------------------------------------------------------------------------- //
466 // -------------------------------------------------------------------------- //
467 func.func @asin_f32(%a : f32) {
468 %r = math.asin %a : f32
469 vector.print %r : f32
473 func.func @asin_3xf32(%a : vector<3xf32>) {
474 %r = math.asin %a : vector<3xf32>
475 vector.print %r : vector<3xf32>
481 %zero = arith.constant 0.0 : f32
482 call @asin_f32(%zero) : (f32) -> ()
485 %cst1 = arith.constant -0.5625 : f32
486 call @asin_f32(%cst1) : (f32) -> ()
489 %cst2 = arith.constant -0.375 : f32
490 call @asin_f32(%cst2) : (f32) -> ()
493 %cst3 = arith.constant -0.25 : f32
494 call @asin_f32(%cst3) : (f32) -> ()
497 %cst4 = arith.constant -0.90 : f32
498 call @asin_f32(%cst4) : (f32) -> ()
500 // CHECK: 0.25268, 0.384397, 0.597406
501 %vec_x = arith.constant dense<[0.25, 0.375, 0.5625]> : vector<3xf32>
502 call @asin_3xf32(%vec_x) : (vector<3xf32>) -> ()
507 // -------------------------------------------------------------------------- //
509 // -------------------------------------------------------------------------- //
510 func.func @acos_f32(%a : f32) {
511 %r = math.acos %a : f32
512 vector.print %r : f32
516 func.func @acos_3xf32(%a : vector<3xf32>) {
517 %r = math.acos %a : vector<3xf32>
518 vector.print %r : vector<3xf32>
524 %zero = arith.constant 0.0 : f32
525 call @acos_f32(%zero) : (f32) -> ()
528 %cst1 = arith.constant -0.5625 : f32
529 call @acos_f32(%cst1) : (f32) -> ()
532 %cst2 = arith.constant -0.375 : f32
533 call @acos_f32(%cst2) : (f32) -> ()
536 %cst3 = arith.constant -0.25 : f32
537 call @acos_f32(%cst3) : (f32) -> ()
539 // CHECK: 1.31812, 1.1864, 0.97339
540 %vec_x = arith.constant dense<[0.25, 0.375, 0.5625]> : vector<3xf32>
541 call @acos_3xf32(%vec_x) : (vector<3xf32>) -> ()
546 // -------------------------------------------------------------------------- //
548 // -------------------------------------------------------------------------- //
549 func.func @atan_f32(%a : f32) {
550 %r = math.atan %a : f32
551 vector.print %r : f32
557 %0 = arith.constant -1.0 : f32
558 call @atan_f32(%0) : (f32) -> ()
561 %1 = arith.constant 1.0 : f32
562 call @atan_f32(%1) : (f32) -> ()
565 %2 = arith.constant -0.5 : f32
566 call @atan_f32(%2) : (f32) -> ()
569 %3 = arith.constant 0.5 : f32
570 call @atan_f32(%3) : (f32) -> ()
573 %4 = arith.constant 0.0 : f32
574 call @atan_f32(%4) : (f32) -> ()
577 %5 = arith.constant -2.0 : f32
578 call @atan_f32(%5) : (f32) -> ()
581 %6 = arith.constant 2.0 : f32
582 call @atan_f32(%6) : (f32) -> ()
588 // -------------------------------------------------------------------------- //
590 // -------------------------------------------------------------------------- //
591 func.func @atan2_f32(%a : f32, %b : f32) {
592 %r = math.atan2 %a, %b : f32
593 vector.print %r : f32
598 %zero = arith.constant 0.0 : f32
599 %one = arith.constant 1.0 : f32
600 %two = arith.constant 2.0 : f32
601 %neg_one = arith.constant -1.0 : f32
602 %neg_two = arith.constant -2.0 : f32
605 call @atan2_f32(%zero, %one) : (f32, f32) -> ()
608 call @atan2_f32(%one, %zero) : (f32, f32) -> ()
611 call @atan2_f32(%zero, %neg_one) : (f32, f32) -> ()
614 call @atan2_f32(%neg_one, %zero) : (f32, f32) -> ()
617 call @atan2_f32(%zero, %zero) : (f32, f32) -> ()
620 call @atan2_f32(%two, %one) : (f32, f32) -> ()
623 %x6 = arith.constant -1.0 : f32
624 %y6 = arith.constant 2.0 : f32
625 call @atan2_f32(%two, %neg_one) : (f32, f32) -> ()
628 call @atan2_f32(%neg_two, %neg_one) : (f32, f32) -> ()
631 call @atan2_f32(%neg_two, %one) : (f32, f32) -> ()
634 call @atan2_f32(%one, %two) : (f32, f32) -> ()
637 %x10 = arith.constant -2.0 : f32
638 %y10 = arith.constant 1.0 : f32
639 call @atan2_f32(%one, %neg_two) : (f32, f32) -> ()
642 %x11 = arith.constant -2.0 : f32
643 %y11 = arith.constant -1.0 : f32
644 call @atan2_f32(%neg_one, %neg_two) : (f32, f32) -> ()
647 call @atan2_f32(%neg_one, %two) : (f32, f32) -> ()
653 // -------------------------------------------------------------------------- //
655 // -------------------------------------------------------------------------- //
657 func.func @cbrt_f32(%a : f32) {
658 %r = math.cbrt %a : f32
659 vector.print %r : f32
665 %a = arith.constant 1.0 : f32
666 call @cbrt_f32(%a) : (f32) -> ()
669 %b = arith.constant -1.0 : f32
670 call @cbrt_f32(%b) : (f32) -> ()
673 %c = arith.constant 0.0 : f32
674 call @cbrt_f32(%c) : (f32) -> ()
677 %d = arith.constant -0.0 : f32
678 call @cbrt_f32(%d) : (f32) -> ()
681 %e = arith.constant 1000.0 : f32
682 call @cbrt_f32(%e) : (f32) -> ()
685 %f = arith.constant -1000.0 : f32
686 call @cbrt_f32(%f) : (f32) -> ()
689 %g = arith.constant 17.0 : f32
690 call @cbrt_f32(%g) : (f32) -> ()
695 // -------------------------------------------------------------------------- //
697 // -------------------------------------------------------------------------- //
698 func.func @func_floorf32(%a : f32) {
699 %r = math.floor %a : f32
700 vector.print %r : f32
704 func.func @floorf() {
706 %a = arith.constant 3.8 : f32
707 call @func_floorf32(%a) : (f32) -> ()
710 %b = arith.constant -3.8 : f32
711 call @func_floorf32(%b) : (f32) -> ()
714 %c = arith.constant 0.0 : f32
715 call @func_floorf32(%c) : (f32) -> ()
718 %d = arith.constant -4.2 : f32
719 call @func_floorf32(%d) : (f32) -> ()
722 %e = arith.constant -2.0 : f32
723 call @func_floorf32(%e) : (f32) -> ()
726 %f = arith.constant 2.0 : f32
727 call @func_floorf32(%f) : (f32) -> ()
732 // -------------------------------------------------------------------------- //
734 // -------------------------------------------------------------------------- //
735 func.func @func_ceilf32(%a : f32) {
736 %r = math.ceil %a : f32
737 vector.print %r : f32
743 %a = arith.constant 3.8 : f32
744 call @func_ceilf32(%a) : (f32) -> ()
747 %b = arith.constant -3.8 : f32
748 call @func_ceilf32(%b) : (f32) -> ()
751 %c = arith.constant 0.0 : f32
752 call @func_ceilf32(%c) : (f32) -> ()
755 %d = arith.constant -4.2 : f32
756 call @func_ceilf32(%d) : (f32) -> ()
759 %e = arith.constant -495.0 : f32
760 call @func_ceilf32(%e) : (f32) -> ()
763 %f = arith.constant 495.0 : f32
764 call @func_ceilf32(%f) : (f32) -> ()
770 call @tanh(): () -> ()
771 call @log(): () -> ()
772 call @log2(): () -> ()
773 call @log1p(): () -> ()
774 call @erf(): () -> ()
775 call @exp(): () -> ()
776 call @expm1(): () -> ()
777 call @sin(): () -> ()
778 call @cos(): () -> ()
779 call @asin(): () -> ()
780 call @acos(): () -> ()
781 call @atan() : () -> ()
782 call @atan2() : () -> ()
783 call @cbrt() : () -> ()
784 call @floorf() : () -> ()
785 call @ceilf() : () -> ()