xref: /llvm-project/mlir/test/Dialect/Math/polynomial-approximation.mlir (revision 72f362170fbe7834febfe08d8bd1f7ba935ddbc9)
1f99ccf65SEugene Zhulenev// RUN: mlir-opt %s -test-math-polynomial-approximation | FileCheck %s
235553d45SEmilio Cota// RUN: mlir-opt %s -test-math-polynomial-approximation=enable-avx2 \
335553d45SEmilio Cota// RUN: | FileCheck --check-prefix=AVX2 %s
4f99ccf65SEugene Zhulenev
5ce976d2dSEugene Zhulenev// Check that all math functions lowered to approximations built from
6ce976d2dSEugene Zhulenev// standard operations (add, mul, fma, shift, etc...).
7ce976d2dSEugene Zhulenev
8f1b92218SBoian Petkantchin// CHECK-LABEL: func @erf_scalar(
9f1b92218SBoian Petkantchin// CHECK-SAME:    %[[val_arg0:.*]]: f32) -> f32 {
10f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst:.*]] = arith.constant 0.000000e+00 : f32
11f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_0:.*]] = arith.constant 1.000000e+00 : f32
12f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_1:.*]] = arith.constant 1.12837911 : f32
13f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_2:.*]] = arith.constant -0.523018539 : f32
14f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_3:.*]] = arith.constant 0.209741712 : f32
15f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_4:.*]] = arith.constant 0.0258146804 : f32
16f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_5:.*]] = arith.constant 1.12750685 : f32
17f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_6:.*]] = arith.constant -0.364721417 : f32
18f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_7:.*]] = arith.constant 0.118407398 : f32
19f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_8:.*]] = arith.constant 0.0370645523 : f32
20f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_9:.*]] = arith.constant -0.00330093061 : f32
21f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_10:.*]] = arith.constant 0.00351961935 : f32
22f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_11:.*]] = arith.constant -0.00141373626 : f32
23f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_12:.*]] = arith.constant 2.53447099E-4 : f32
24f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_13:.*]] = arith.constant -1.71048032E-5 : f32
25f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_14:.*]] = arith.constant -0.463513821 : f32
26f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_15:.*]] = arith.constant 0.519230127 : f32
27f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_16:.*]] = arith.constant -0.131808966 : f32
28f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_17:.*]] = arith.constant 0.0739796459 : f32
29f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_18:.*]] = arith.constant -3.276070e-01 : f32
30f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_19:.*]] = arith.constant 0.448369086 : f32
31f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_20:.*]] = arith.constant -0.0883462652 : f32
32f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_21:.*]] = arith.constant 0.0572442785 : f32
33f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_22:.*]] = arith.constant -2.0606916 : f32
34f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_23:.*]] = arith.constant 1.62705934 : f32
35f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_24:.*]] = arith.constant -0.583389878 : f32
36f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_25:.*]] = arith.constant 0.0821908935 : f32
37f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_26:.*]] = arith.constant 8.000000e-01 : f32
38f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_27:.*]] = arith.constant 2.000000e+00 : f32
39f1b92218SBoian Petkantchin// CHECK-DAG:     %[[val_cst_28:.*]] = arith.constant 3.750000e+00 : f32
40f1b92218SBoian Petkantchin// CHECK:         %[[val_0:.*]] = arith.cmpf olt, %[[val_arg0]], %[[val_cst]] : f32
41f1b92218SBoian Petkantchin// CHECK:         %[[val_1:.*]] = arith.negf %[[val_arg0]] : f32
42dec8af70SRiver Riddle// CHECK:         %[[val_2:.*]] = arith.select %[[val_0]], %[[val_1]], %[[val_arg0]] : f32
43f1b92218SBoian Petkantchin// CHECK:         %[[val_3:.*]] = arith.cmpf olt, %[[val_2]], %[[val_cst_26]] : f32
44dec8af70SRiver Riddle// CHECK:         %[[val_4:.*]] = arith.select %[[val_3]], %[[val_cst_1]], %[[val_cst_5]] : f32
45dec8af70SRiver Riddle// CHECK:         %[[val_5:.*]] = arith.select %[[val_3]], %[[val_cst_14]], %[[val_cst_18]] : f32
46dec8af70SRiver Riddle// CHECK:         %[[val_6:.*]] = arith.select %[[val_3]], %[[val_cst_2]], %[[val_cst_6]] : f32
47dec8af70SRiver Riddle// CHECK:         %[[val_7:.*]] = arith.select %[[val_3]], %[[val_cst_15]], %[[val_cst_19]] : f32
48dec8af70SRiver Riddle// CHECK:         %[[val_8:.*]] = arith.select %[[val_3]], %[[val_cst_3]], %[[val_cst_7]] : f32
49dec8af70SRiver Riddle// CHECK:         %[[val_9:.*]] = arith.select %[[val_3]], %[[val_cst_16]], %[[val_cst_20]] : f32
50dec8af70SRiver Riddle// CHECK:         %[[val_10:.*]] = arith.select %[[val_3]], %[[val_cst_4]], %[[val_cst_8]] : f32
51dec8af70SRiver Riddle// CHECK:         %[[val_11:.*]] = arith.select %[[val_3]], %[[val_cst_17]], %[[val_cst_21]] : f32
52f1b92218SBoian Petkantchin// CHECK:         %[[val_12:.*]] = arith.cmpf olt, %[[val_2]], %[[val_cst_27]] : f32
53dec8af70SRiver Riddle// CHECK:         %[[val_13:.*]] = arith.select %[[val_12]], %[[val_cst]], %[[val_cst_9]] : f32
54dec8af70SRiver Riddle// CHECK:         %[[val_14:.*]] = arith.select %[[val_12]], %[[val_4]], %[[val_cst_10]] : f32
55dec8af70SRiver Riddle// CHECK:         %[[val_15:.*]] = arith.select %[[val_12]], %[[val_5]], %[[val_cst_22]] : f32
56dec8af70SRiver Riddle// CHECK:         %[[val_16:.*]] = arith.select %[[val_12]], %[[val_6]], %[[val_cst_11]] : f32
57dec8af70SRiver Riddle// CHECK:         %[[val_17:.*]] = arith.select %[[val_12]], %[[val_7]], %[[val_cst_23]] : f32
58dec8af70SRiver Riddle// CHECK:         %[[val_18:.*]] = arith.select %[[val_12]], %[[val_8]], %[[val_cst_12]] : f32
59dec8af70SRiver Riddle// CHECK:         %[[val_19:.*]] = arith.select %[[val_12]], %[[val_9]], %[[val_cst_24]] : f32
60dec8af70SRiver Riddle// CHECK:         %[[val_20:.*]] = arith.select %[[val_12]], %[[val_10]], %[[val_cst_13]] : f32
61dec8af70SRiver Riddle// CHECK:         %[[val_21:.*]] = arith.select %[[val_12]], %[[val_11]], %[[val_cst_25]] : f32
62dec8af70SRiver Riddle// CHECK:         %[[val_22:.*]] = arith.select %[[val_12]], %[[val_cst]], %[[val_cst_0]] : f32
63f1b92218SBoian Petkantchin// CHECK:         %[[val_23:.*]] = arith.cmpf ult, %[[val_2]], %[[val_cst_28]] : f32
64f1b92218SBoian Petkantchin// CHECK:         %[[val_24:.*]] = math.fma %[[val_2]], %[[val_20]], %[[val_18]] : f32
65f1b92218SBoian Petkantchin// CHECK:         %[[val_25:.*]] = math.fma %[[val_2]], %[[val_24]], %[[val_16]] : f32
66f1b92218SBoian Petkantchin// CHECK:         %[[val_26:.*]] = math.fma %[[val_2]], %[[val_25]], %[[val_14]] : f32
67f1b92218SBoian Petkantchin// CHECK:         %[[val_27:.*]] = math.fma %[[val_2]], %[[val_26]], %[[val_13]] : f32
68f1b92218SBoian Petkantchin// CHECK:         %[[val_28:.*]] = math.fma %[[val_2]], %[[val_21]], %[[val_19]] : f32
69f1b92218SBoian Petkantchin// CHECK:         %[[val_29:.*]] = math.fma %[[val_2]], %[[val_28]], %[[val_17]] : f32
70f1b92218SBoian Petkantchin// CHECK:         %[[val_30:.*]] = math.fma %[[val_2]], %[[val_29]], %[[val_15]] : f32
71f1b92218SBoian Petkantchin// CHECK:         %[[val_31:.*]] = math.fma %[[val_2]], %[[val_30]], %[[val_cst_0]] : f32
72f1b92218SBoian Petkantchin// CHECK:         %[[val_32:.*]] = arith.divf %[[val_27]], %[[val_31]] : f32
73f1b92218SBoian Petkantchin// CHECK:         %[[val_33:.*]] = arith.addf %[[val_22]], %[[val_32]] : f32
74dec8af70SRiver Riddle// CHECK:         %[[val_34:.*]] = arith.select %[[val_23]], %[[val_33]], %[[val_cst_0]] : f32
75f1b92218SBoian Petkantchin// CHECK:         %[[val_35:.*]] = arith.negf %[[val_34]] : f32
76dec8af70SRiver Riddle// CHECK:         %[[val_36:.*]] = arith.select %[[val_0]], %[[val_35]], %[[val_34]] : f32
77f1b92218SBoian Petkantchin// CHECK:         return %[[val_36]] : f32
78f1b92218SBoian Petkantchin// CHECK:       }
790254b0bcSRiver Riddlefunc.func @erf_scalar(%arg0: f32) -> f32 {
80f1b92218SBoian Petkantchin  %0 = math.erf %arg0 : f32
81f1b92218SBoian Petkantchin  return %0 : f32
82f1b92218SBoian Petkantchin}
83f1b92218SBoian Petkantchin
84f1b92218SBoian Petkantchin// CHECK-LABEL:   func @erf_vector(
85f1b92218SBoian Petkantchin// CHECK-SAME:                     %[[arg0:.*]]: vector<8xf32>) -> vector<8xf32> {
86f1b92218SBoian Petkantchin// CHECK:           %[[zero:.*]] = arith.constant dense<0.000000e+00> : vector<8xf32>
87f1b92218SBoian Petkantchin// CHECK-NOT:       erf
88f1b92218SBoian Petkantchin// CHECK-COUNT-20:  select
89dec8af70SRiver Riddle// CHECK:           %[[res:.*]] = arith.select
90f1b92218SBoian Petkantchin// CHECK:           return %[[res]] : vector<8xf32>
91f1b92218SBoian Petkantchin// CHECK:         }
920254b0bcSRiver Riddlefunc.func @erf_vector(%arg0: vector<8xf32>) -> vector<8xf32> {
93f1b92218SBoian Petkantchin  %0 = math.erf %arg0 : vector<8xf32>
94f1b92218SBoian Petkantchin  return %0 : vector<8xf32>
95f1b92218SBoian Petkantchin}
96f1b92218SBoian Petkantchin
97e74bcecdSBenjamin Maxwell// CHECK-LABEL:   func @erf_scalable_vector(
98e74bcecdSBenjamin Maxwell// CHECK-SAME:                     %[[arg0:.*]]: vector<[8]xf32>) -> vector<[8]xf32> {
99e74bcecdSBenjamin Maxwell// CHECK:           %[[zero:.*]] = arith.constant dense<0.000000e+00> : vector<[8]xf32>
100e74bcecdSBenjamin Maxwell// CHECK-NOT:       erf
101e74bcecdSBenjamin Maxwell// CHECK-NOT:       vector<8xf32>
102e74bcecdSBenjamin Maxwell// CHECK-COUNT-20:  select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
103e74bcecdSBenjamin Maxwell// CHECK:           %[[res:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
104e74bcecdSBenjamin Maxwell// CHECK:           return %[[res]] : vector<[8]xf32>
105e74bcecdSBenjamin Maxwell// CHECK:         }
106e74bcecdSBenjamin Maxwellfunc.func @erf_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {
107e74bcecdSBenjamin Maxwell  %0 = math.erf %arg0 : vector<[8]xf32>
108e74bcecdSBenjamin Maxwell  return %0 : vector<[8]xf32>
109e74bcecdSBenjamin Maxwell}
110e74bcecdSBenjamin Maxwell
1113c952ab2SEmilio Cota// CHECK-LABEL:   func @exp_scalar(
1123c952ab2SEmilio Cota// CHECK-SAME:                     %[[VAL_0:.*]]: f32) -> f32 {
113710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 5.000000e-01 : f32
114710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32
115710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 1.44269502 : f32
116710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant -0.693359375 : f32
117710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant 2.12194442E-4 : f32
118710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 1.98756912E-4 : f32
119710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 0.00139819994 : f32
120710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant 0.00833345205 : f32
121710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 0.0416657962 : f32
122710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 0.166666657 : f32
123710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant -8.780000e+01 : f32
124710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 8.880000e+01 : f32
125710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant -1.270000e+02 : f32
126710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 1.270000e+02 : f32
127710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 23 : i32
128710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant 127 : i32
129710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_17:.*]] = arith.cmpf uge, %[[VAL_0]], %[[VAL_11]] : f32
130710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_18:.*]] = arith.select %[[VAL_17]], %[[VAL_0]], %[[VAL_11]] : f32
131710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_19:.*]] = arith.cmpf ule, %[[VAL_18]], %[[VAL_12]] : f32
132710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_20:.*]] = arith.select %[[VAL_19]], %[[VAL_18]], %[[VAL_12]] : f32
133710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_21:.*]] = math.fma %[[VAL_20]], %[[VAL_3]], %[[VAL_1]] : f32
134710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_22:.*]] = math.floor %[[VAL_21]] : f32
135710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_23:.*]] = arith.cmpf uge, %[[VAL_22]], %[[VAL_13]] : f32
136710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_24:.*]] = arith.select %[[VAL_23]], %[[VAL_22]], %[[VAL_13]] : f32
137710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_25:.*]] = arith.cmpf ule, %[[VAL_24]], %[[VAL_14]] : f32
138710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_26:.*]] = arith.select %[[VAL_25]], %[[VAL_24]], %[[VAL_14]] : f32
139710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_27:.*]] = math.fma %[[VAL_4]], %[[VAL_26]], %[[VAL_20]] : f32
140710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_28:.*]] = math.fma %[[VAL_5]], %[[VAL_26]], %[[VAL_27]] : f32
141710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_29:.*]] = math.fma %[[VAL_28]], %[[VAL_6]], %[[VAL_7]] : f32
142710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_30:.*]] = math.fma %[[VAL_29]], %[[VAL_28]], %[[VAL_8]] : f32
143710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_31:.*]] = math.fma %[[VAL_30]], %[[VAL_28]], %[[VAL_9]] : f32
144710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_32:.*]] = math.fma %[[VAL_31]], %[[VAL_28]], %[[VAL_10]] : f32
145710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_33:.*]] = math.fma %[[VAL_32]], %[[VAL_28]], %[[VAL_1]] : f32
146710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_34:.*]] = arith.mulf %[[VAL_28]], %[[VAL_28]] : f32
147710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_35:.*]] = math.fma %[[VAL_33]], %[[VAL_34]], %[[VAL_28]] : f32
148710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_36:.*]] = arith.addf %[[VAL_35]], %[[VAL_2]] : f32
149710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_37:.*]] = arith.fptosi %[[VAL_26]] : f32 to i32
150710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_38:.*]] = arith.addi %[[VAL_37]], %[[VAL_16]] : i32
151710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_39:.*]] = arith.shli %[[VAL_38]], %[[VAL_15]] : i32
152710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_40:.*]] = arith.bitcast %[[VAL_39]] : i32 to f32
153710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_41:.*]] = arith.mulf %[[VAL_36]], %[[VAL_40]] : f32
154b122cbebSAdrian Kuegel// CHECK:           return %[[VAL_41]] : f32
1550254b0bcSRiver Riddlefunc.func @exp_scalar(%arg0: f32) -> f32 {
1563c952ab2SEmilio Cota  %0 = math.exp %arg0 : f32
1573c952ab2SEmilio Cota  return %0 : f32
158f99ccf65SEugene Zhulenev}
159f99ccf65SEugene Zhulenev
1603c952ab2SEmilio Cota// CHECK-LABEL:   func @exp_vector(
1613c952ab2SEmilio Cota// CHECK-SAME:                     %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {
162710dc728SRobert Suderman// CHECK-NOT:   math.exp
1630254b0bcSRiver Riddlefunc.func @exp_vector(%arg0: vector<8xf32>) -> vector<8xf32> {
1643c952ab2SEmilio Cota  %0 = math.exp %arg0 : vector<8xf32>
1653c952ab2SEmilio Cota  return %0 : vector<8xf32>
1663c952ab2SEmilio Cota}
1673c952ab2SEmilio Cota
168e74bcecdSBenjamin Maxwell// CHECK-LABEL:   func @exp_scalable_vector
169e74bcecdSBenjamin Maxwell// CHECK-NOT:      math.exp
170e74bcecdSBenjamin Maxwell// CHECK-NOT:      vector<8xf32>
171e74bcecdSBenjamin Maxwell// CHECK-COUNT-46: vector<[8]x{{(i32)|(f32)}}>
172e74bcecdSBenjamin Maxwell// CHECK-NOT:      vector<8xf32>
173e74bcecdSBenjamin Maxwell// CHECK-NOT:      math.exp
174e74bcecdSBenjamin Maxwellfunc.func @exp_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {
175e74bcecdSBenjamin Maxwell  %0 = math.exp %arg0 : vector<[8]xf32>
176e74bcecdSBenjamin Maxwell  return %0 : vector<[8]xf32>
177e74bcecdSBenjamin Maxwell}
178e74bcecdSBenjamin Maxwell
1793c952ab2SEmilio Cota// CHECK-LABEL:   func @expm1_scalar(
1803c952ab2SEmilio Cota// CHECK-SAME:                       %[[X:.*]]: f32) -> f32 {
181710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 1.000000e+00 : f32
182710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant -1.000000e+00 : f32
183710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 5.000000e-01 : f32
184710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 1.44269502 : f32
185710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant -0.693359375 : f32
186710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 2.12194442E-4 : f32
187710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 1.98756912E-4 : f32
188710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant 0.00139819994 : f32
189710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 0.00833345205 : f32
190710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 0.0416657962 : f32
191710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 0.166666657 : f32
192710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant -8.780000e+01 : f32
193710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 8.880000e+01 : f32
194710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant -1.270000e+02 : f32
195710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 1.270000e+02 : f32
196710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant 23 : i32
197710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_17:.*]] = arith.constant 127 : i32
198710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_18:.*]] = arith.constant 0.000000e+00 : f32
199710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_19:.*]] = arith.constant -5.000000e-01 : f32
200710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_20:.*]] = arith.constant 1.17549435E-38 : f32
201710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_21:.*]] = arith.constant 0xFF800000 : f32
202710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_22:.*]] = arith.constant 0x7F800000 : f32
203710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_23:.*]] = arith.constant 0x7FC00000 : f32
204710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_24:.*]] = arith.constant 0.707106769 : f32
205710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_25:.*]] = arith.constant 0.0703768358 : f32
206710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_26:.*]] = arith.constant -0.115146101 : f32
207710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_27:.*]] = arith.constant 0.116769984 : f32
208710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_28:.*]] = arith.constant -0.12420141 : f32
209710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_29:.*]] = arith.constant 0.142493233 : f32
210710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_30:.*]] = arith.constant -0.166680574 : f32
211710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_31:.*]] = arith.constant 0.200007141 : f32
212710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_32:.*]] = arith.constant -0.24999994 : f32
213710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_33:.*]] = arith.constant 0.333333313 : f32
214710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_34:.*]] = arith.constant 1.260000e+02 : f32
215710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_35:.*]] = arith.constant -2139095041 : i32
216710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_36:.*]] = arith.constant 1056964608 : i32
217710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_37:.*]] = arith.constant 0.693147182 : f32
218710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_38:.*]] = arith.cmpf uge, %[[X]], %[[VAL_12]] : f32
219710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_39:.*]] = arith.select %[[VAL_38]], %[[X]], %[[VAL_12]] : f32
220710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_40:.*]] = arith.cmpf ule, %[[VAL_39]], %[[VAL_13]] : f32
221710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_41:.*]] = arith.select %[[VAL_40]], %[[VAL_39]], %[[VAL_13]] : f32
222710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_42:.*]] = math.fma %[[VAL_41]], %[[VAL_4]], %[[VAL_3]] : f32
223710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_43:.*]] = math.floor %[[VAL_42]] : f32
224710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_44:.*]] = arith.cmpf uge, %[[VAL_43]], %[[VAL_14]] : f32
225710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_45:.*]] = arith.select %[[VAL_44]], %[[VAL_43]], %[[VAL_14]] : f32
226710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_46:.*]] = arith.cmpf ule, %[[VAL_45]], %[[VAL_15]] : f32
227710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_47:.*]] = arith.select %[[VAL_46]], %[[VAL_45]], %[[VAL_15]] : f32
228710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_48:.*]] = math.fma %[[VAL_5]], %[[VAL_47]], %[[VAL_41]] : f32
229710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_49:.*]] = math.fma %[[VAL_6]], %[[VAL_47]], %[[VAL_48]] : f32
230710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_50:.*]] = math.fma %[[VAL_49]], %[[VAL_7]], %[[VAL_8]] : f32
231710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_51:.*]] = math.fma %[[VAL_50]], %[[VAL_49]], %[[VAL_9]] : f32
232710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_52:.*]] = math.fma %[[VAL_51]], %[[VAL_49]], %[[VAL_10]] : f32
233710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_53:.*]] = math.fma %[[VAL_52]], %[[VAL_49]], %[[VAL_11]] : f32
234710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_54:.*]] = math.fma %[[VAL_53]], %[[VAL_49]], %[[VAL_3]] : f32
235710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_55:.*]] = arith.mulf %[[VAL_49]], %[[VAL_49]] : f32
236710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_56:.*]] = math.fma %[[VAL_54]], %[[VAL_55]], %[[VAL_49]] : f32
237710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_57:.*]] = arith.addf %[[VAL_56]], %[[VAL_1]] : f32
238710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_58:.*]] = arith.fptosi %[[VAL_47]] : f32 to i32
239710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_59:.*]] = arith.addi %[[VAL_58]], %[[VAL_17]] : i32
240710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_60:.*]] = arith.shli %[[VAL_59]], %[[VAL_16]] : i32
241710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_61:.*]] = arith.bitcast %[[VAL_60]] : i32 to f32
242710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_62:.*]] = arith.mulf %[[VAL_57]], %[[VAL_61]] : f32
243710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_63:.*]] = arith.cmpf ueq, %[[VAL_62]], %[[VAL_1]] : f32
244710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_64:.*]] = arith.subf %[[VAL_62]], %[[VAL_1]] : f32
245710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_65:.*]] = arith.cmpf oeq, %[[VAL_64]], %[[VAL_2]] : f32
246710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_66:.*]] = arith.cmpf ugt, %[[VAL_62]], %[[VAL_20]] : f32
247710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_67:.*]] = arith.select %[[VAL_66]], %[[VAL_62]], %[[VAL_20]] : f32
248710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_68:.*]] = arith.bitcast %[[VAL_67]] : f32 to i32
249710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_69:.*]] = arith.andi %[[VAL_68]], %[[VAL_35]] : i32
250710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_70:.*]] = arith.ori %[[VAL_69]], %[[VAL_36]] : i32
251710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_71:.*]] = arith.bitcast %[[VAL_70]] : i32 to f32
252710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_72:.*]] = arith.bitcast %[[VAL_67]] : f32 to i32
253710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_73:.*]] = arith.shrui %[[VAL_72]], %[[VAL_16]] : i32
254710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_74:.*]] = arith.sitofp %[[VAL_73]] : i32 to f32
255710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_75:.*]] = arith.subf %[[VAL_74]], %[[VAL_34]] : f32
256710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_76:.*]] = arith.cmpf olt, %[[VAL_71]], %[[VAL_24]] : f32
257710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_77:.*]] = arith.select %[[VAL_76]], %[[VAL_71]], %[[VAL_18]] : f32
258710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_78:.*]] = arith.subf %[[VAL_71]], %[[VAL_1]] : f32
259710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_79:.*]] = arith.select %[[VAL_76]], %[[VAL_1]], %[[VAL_18]] : f32
260710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_80:.*]] = arith.subf %[[VAL_75]], %[[VAL_79]] : f32
261710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_81:.*]] = arith.addf %[[VAL_78]], %[[VAL_77]] : f32
262710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_82:.*]] = arith.mulf %[[VAL_81]], %[[VAL_81]] : f32
263710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_83:.*]] = arith.mulf %[[VAL_82]], %[[VAL_81]] : f32
264710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_84:.*]] = math.fma %[[VAL_25]], %[[VAL_81]], %[[VAL_26]] : f32
265710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_85:.*]] = math.fma %[[VAL_28]], %[[VAL_81]], %[[VAL_29]] : f32
266710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_86:.*]] = math.fma %[[VAL_31]], %[[VAL_81]], %[[VAL_32]] : f32
267710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_87:.*]] = math.fma %[[VAL_84]], %[[VAL_81]], %[[VAL_27]] : f32
268710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_88:.*]] = math.fma %[[VAL_85]], %[[VAL_81]], %[[VAL_30]] : f32
269710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_89:.*]] = math.fma %[[VAL_86]], %[[VAL_81]], %[[VAL_33]] : f32
270710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_90:.*]] = math.fma %[[VAL_87]], %[[VAL_83]], %[[VAL_88]] : f32
271710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_91:.*]] = math.fma %[[VAL_90]], %[[VAL_83]], %[[VAL_89]] : f32
272710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_92:.*]] = arith.mulf %[[VAL_91]], %[[VAL_83]] : f32
273710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_93:.*]] = math.fma %[[VAL_19]], %[[VAL_82]], %[[VAL_92]] : f32
274710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_94:.*]] = arith.addf %[[VAL_81]], %[[VAL_93]] : f32
275710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_95:.*]] = math.fma %[[VAL_80]], %[[VAL_37]], %[[VAL_94]] : f32
276710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_96:.*]] = arith.cmpf ult, %[[VAL_62]], %[[VAL_18]] : f32
277710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_97:.*]] = arith.cmpf oeq, %[[VAL_62]], %[[VAL_18]] : f32
278710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_98:.*]] = arith.cmpf oeq, %[[VAL_62]], %[[VAL_22]] : f32
279710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_99:.*]] = arith.select %[[VAL_98]], %[[VAL_22]], %[[VAL_95]] : f32
280710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_100:.*]] = arith.select %[[VAL_96]], %[[VAL_23]], %[[VAL_99]] : f32
281710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_101:.*]] = arith.select %[[VAL_97]], %[[VAL_21]], %[[VAL_100]] : f32
282710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_102:.*]] = arith.cmpf oeq, %[[VAL_101]], %[[VAL_62]] : f32
283710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_103:.*]] = arith.divf %[[X]], %[[VAL_101]] : f32
284710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_104:.*]] = arith.mulf %[[VAL_64]], %[[VAL_103]] : f32
285710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_105:.*]] = arith.select %[[VAL_102]], %[[VAL_62]], %[[VAL_104]] : f32
286710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_106:.*]] = arith.select %[[VAL_65]], %[[VAL_2]], %[[VAL_105]] : f32
287710dc728SRobert Suderman// CHECK-DAG:       %[[VAL_107:.*]] = arith.select %[[VAL_63]], %[[X]], %[[VAL_106]] : f32
288710dc728SRobert Suderman// CHECK-DAG:       return %[[VAL_107]] : f32
2893c952ab2SEmilio Cota// CHECK:         }
2900254b0bcSRiver Riddlefunc.func @expm1_scalar(%arg0: f32) -> f32 {
2913c952ab2SEmilio Cota  %0 = math.expm1 %arg0 : f32
2923c952ab2SEmilio Cota  return %0 : f32
2933c952ab2SEmilio Cota}
2943c952ab2SEmilio Cota
2953c952ab2SEmilio Cota// CHECK-LABEL:   func @expm1_vector(
29696cee297SAlexander Belyaev// CHECK-SAME:                       %[[VAL_0:.*]]: vector<8x8xf32>) -> vector<8x8xf32> {
2973c952ab2SEmilio Cota// CHECK-NOT:       exp
2983c952ab2SEmilio Cota// CHECK-NOT:       log
2993c952ab2SEmilio Cota// CHECK-NOT:       expm1
3000254b0bcSRiver Riddlefunc.func @expm1_vector(%arg0: vector<8x8xf32>) -> vector<8x8xf32> {
30196cee297SAlexander Belyaev  %0 = math.expm1 %arg0 : vector<8x8xf32>
30296cee297SAlexander Belyaev  return %0 : vector<8x8xf32>
3033c952ab2SEmilio Cota}
3043c952ab2SEmilio Cota
305e74bcecdSBenjamin Maxwell// CHECK-LABEL:   func @expm1_scalable_vector(
306e74bcecdSBenjamin Maxwell// CHECK-SAME:                       %{{.*}}: vector<8x[8]xf32>) -> vector<8x[8]xf32> {
307e74bcecdSBenjamin Maxwell// CHECK-NOT:       vector<8x8xf32>
308e74bcecdSBenjamin Maxwell// CHECK-NOT:       exp
309e74bcecdSBenjamin Maxwell// CHECK-NOT:       log
310e74bcecdSBenjamin Maxwell// CHECK-NOT:       expm1
311e74bcecdSBenjamin Maxwell// CHECK-COUNT-127: vector<8x[8]x{{(i32)|(f32)|(i1)}}>
312e74bcecdSBenjamin Maxwell// CHECK-NOT:       vector<8x8xf32>
313e74bcecdSBenjamin Maxwell// CHECK-NOT:       exp
314e74bcecdSBenjamin Maxwell// CHECK-NOT:       log
315e74bcecdSBenjamin Maxwell// CHECK-NOT:       expm1
316e74bcecdSBenjamin Maxwellfunc.func @expm1_scalable_vector(%arg0: vector<8x[8]xf32>) -> vector<8x[8]xf32> {
317e74bcecdSBenjamin Maxwell  %0 = math.expm1 %arg0 : vector<8x[8]xf32>
318e74bcecdSBenjamin Maxwell  return %0 : vector<8x[8]xf32>
319e74bcecdSBenjamin Maxwell}
320e74bcecdSBenjamin Maxwell
3213c952ab2SEmilio Cota// CHECK-LABEL:   func @log_scalar(
3223c952ab2SEmilio Cota// CHECK-SAME:                             %[[X:.*]]: f32) -> f32 {
323bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 0.000000e+00 : f32
324bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32
325bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant -5.000000e-01 : f32
326bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 1.17549435E-38 : f32
327bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant 0xFF800000 : f32
328bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 0x7F800000 : f32
329bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 0x7FC00000 : f32
330bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant 0.707106769 : f32
331bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 0.0703768358 : f32
332bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant -0.115146101 : f32
333bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 0.116769984 : f32
334bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant -0.12420141 : f32
335bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 0.142493233 : f32
336bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant -0.166680574 : f32
337bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 0.200007141 : f32
338bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant -0.24999994 : f32
339bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_17:.*]] = arith.constant 0.333333313 : f32
340bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_18:.*]] = arith.constant 1.260000e+02 : f32
341bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_19:.*]] = arith.constant -2139095041 : i32
342bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_20:.*]] = arith.constant 1056964608 : i32
343bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_21:.*]] = arith.constant 23 : i32
344bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_22:.*]] = arith.constant 0.693147182 : f32
345f5efe280STres Popp// CHECK:           %[[VAL_23:.*]] = arith.cmpf ugt, %[[X]], %[[VAL_4]] : f32
346dec8af70SRiver Riddle// CHECK:           %[[VAL_24:.*]] = arith.select %[[VAL_23]], %[[X]], %[[VAL_4]] : f32
3473c952ab2SEmilio Cota// CHECK-NOT:       frexp
348a54f4eaeSMogball// CHECK:           %[[VAL_25:.*]] = arith.bitcast %[[VAL_24]] : f32 to i32
349a54f4eaeSMogball// CHECK:           %[[VAL_26:.*]] = arith.andi %[[VAL_25]], %[[VAL_19]] : i32
350a54f4eaeSMogball// CHECK:           %[[VAL_27:.*]] = arith.ori %[[VAL_26]], %[[VAL_20]] : i32
351a54f4eaeSMogball// CHECK:           %[[VAL_28:.*]] = arith.bitcast %[[VAL_27]] : i32 to f32
352a54f4eaeSMogball// CHECK:           %[[VAL_29:.*]] = arith.bitcast %[[VAL_24]] : f32 to i32
353a54f4eaeSMogball// CHECK:           %[[VAL_30:.*]] = arith.shrui %[[VAL_29]], %[[VAL_21]] : i32
354a54f4eaeSMogball// CHECK:           %[[VAL_31:.*]] = arith.sitofp %[[VAL_30]] : i32 to f32
355a54f4eaeSMogball// CHECK:           %[[VAL_32:.*]] = arith.subf %[[VAL_31]], %[[VAL_18]] : f32
356a54f4eaeSMogball// CHECK:           %[[VAL_33:.*]] = arith.cmpf olt, %[[VAL_28]], %[[VAL_8]] : f32
357dec8af70SRiver Riddle// CHECK:           %[[VAL_34:.*]] = arith.select %[[VAL_33]], %[[VAL_28]], %[[VAL_1]] : f32
358a54f4eaeSMogball// CHECK:           %[[VAL_35:.*]] = arith.subf %[[VAL_28]], %[[VAL_2]] : f32
359dec8af70SRiver Riddle// CHECK:           %[[VAL_36:.*]] = arith.select %[[VAL_33]], %[[VAL_2]], %[[VAL_1]] : f32
360a54f4eaeSMogball// CHECK:           %[[VAL_37:.*]] = arith.subf %[[VAL_32]], %[[VAL_36]] : f32
361a54f4eaeSMogball// CHECK:           %[[VAL_38:.*]] = arith.addf %[[VAL_35]], %[[VAL_34]] : f32
362a54f4eaeSMogball// CHECK:           %[[VAL_39:.*]] = arith.mulf %[[VAL_38]], %[[VAL_38]] : f32
363a54f4eaeSMogball// CHECK:           %[[VAL_40:.*]] = arith.mulf %[[VAL_39]], %[[VAL_38]] : f32
364a54f4eaeSMogball// CHECK:           %[[VAL_41:.*]] = math.fma %[[VAL_9]], %[[VAL_38]], %[[VAL_10]] : f32
365a54f4eaeSMogball// CHECK:           %[[VAL_42:.*]] = math.fma %[[VAL_12]], %[[VAL_38]], %[[VAL_13]] : f32
366a54f4eaeSMogball// CHECK:           %[[VAL_43:.*]] = math.fma %[[VAL_15]], %[[VAL_38]], %[[VAL_16]] : f32
367a54f4eaeSMogball// CHECK:           %[[VAL_44:.*]] = math.fma %[[VAL_41]], %[[VAL_38]], %[[VAL_11]] : f32
368a54f4eaeSMogball// CHECK:           %[[VAL_45:.*]] = math.fma %[[VAL_42]], %[[VAL_38]], %[[VAL_14]] : f32
369a54f4eaeSMogball// CHECK:           %[[VAL_46:.*]] = math.fma %[[VAL_43]], %[[VAL_38]], %[[VAL_17]] : f32
370a54f4eaeSMogball// CHECK:           %[[VAL_47:.*]] = math.fma %[[VAL_44]], %[[VAL_40]], %[[VAL_45]] : f32
371a54f4eaeSMogball// CHECK:           %[[VAL_48:.*]] = math.fma %[[VAL_47]], %[[VAL_40]], %[[VAL_46]] : f32
372a54f4eaeSMogball// CHECK:           %[[VAL_49:.*]] = arith.mulf %[[VAL_48]], %[[VAL_40]] : f32
373a54f4eaeSMogball// CHECK:           %[[VAL_50:.*]] = math.fma %[[VAL_3]], %[[VAL_39]], %[[VAL_49]] : f32
374a54f4eaeSMogball// CHECK:           %[[VAL_51:.*]] = arith.addf %[[VAL_38]], %[[VAL_50]] : f32
375a54f4eaeSMogball// CHECK:           %[[VAL_52:.*]] = math.fma %[[VAL_37]], %[[VAL_22]], %[[VAL_51]] : f32
376a54f4eaeSMogball// CHECK:           %[[VAL_53:.*]] = arith.cmpf ult, %[[X]], %[[VAL_1]] : f32
377a54f4eaeSMogball// CHECK:           %[[VAL_54:.*]] = arith.cmpf oeq, %[[X]], %[[VAL_1]] : f32
378a54f4eaeSMogball// CHECK:           %[[VAL_55:.*]] = arith.cmpf oeq, %[[X]], %[[VAL_6]] : f32
379dec8af70SRiver Riddle// CHECK:           %[[VAL_56:.*]] = arith.select %[[VAL_55]], %[[VAL_6]], %[[VAL_52]] : f32
380dec8af70SRiver Riddle// CHECK:           %[[VAL_57:.*]] = arith.select %[[VAL_53]], %[[VAL_7]], %[[VAL_56]] : f32
381dec8af70SRiver Riddle// CHECK:           %[[VAL_58:.*]] = arith.select %[[VAL_54]], %[[VAL_5]], %[[VAL_57]] : f32
382c1ebefdfSBenjamin Kramer// CHECK:           return %[[VAL_58]] : f32
3833c952ab2SEmilio Cota// CHECK:         }
3840254b0bcSRiver Riddlefunc.func @log_scalar(%arg0: f32) -> f32 {
3853c952ab2SEmilio Cota  %0 = math.log %arg0 : f32
3863c952ab2SEmilio Cota  return %0 : f32
3873c952ab2SEmilio Cota}
3883c952ab2SEmilio Cota
3893c952ab2SEmilio Cota// CHECK-LABEL:   func @log_vector(
3903c952ab2SEmilio Cota// CHECK-SAME:                     %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {
391a54f4eaeSMogball// CHECK:           %[[CST_LN2:.*]] = arith.constant dense<0.693147182> : vector<8xf32>
392c1ebefdfSBenjamin Kramer// CHECK-COUNT-5:   select
393dec8af70SRiver Riddle// CHECK:           %[[VAL_71:.*]] = arith.select
3943c952ab2SEmilio Cota// CHECK:           return %[[VAL_71]] : vector<8xf32>
3953c952ab2SEmilio Cota// CHECK:         }
3960254b0bcSRiver Riddlefunc.func @log_vector(%arg0: vector<8xf32>) -> vector<8xf32> {
3973c952ab2SEmilio Cota  %0 = math.log %arg0 : vector<8xf32>
3983c952ab2SEmilio Cota  return %0 : vector<8xf32>
3993c952ab2SEmilio Cota}
4003c952ab2SEmilio Cota
401e74bcecdSBenjamin Maxwell// CHECK-LABEL:   func @log_scalable_vector(
402e74bcecdSBenjamin Maxwell// CHECK-SAME:                     %{{.*}}: vector<[8]xf32>) -> vector<[8]xf32> {
403e74bcecdSBenjamin Maxwell// CHECK:           %[[CST_LN2:.*]] = arith.constant dense<0.693147182> : vector<[8]xf32>
404e74bcecdSBenjamin Maxwell// CHECK-COUNT-5:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
405e74bcecdSBenjamin Maxwell// CHECK:           %[[VAL_71:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
406e74bcecdSBenjamin Maxwell// CHECK:           return %[[VAL_71]] : vector<[8]xf32>
407e74bcecdSBenjamin Maxwell// CHECK:         }
408e74bcecdSBenjamin Maxwellfunc.func @log_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {
409e74bcecdSBenjamin Maxwell  %0 = math.log %arg0 : vector<[8]xf32>
410e74bcecdSBenjamin Maxwell  return %0 : vector<[8]xf32>
411e74bcecdSBenjamin Maxwell}
412e74bcecdSBenjamin Maxwell
4133c952ab2SEmilio Cota// CHECK-LABEL:   func @log2_scalar(
4143c952ab2SEmilio Cota// CHECK-SAME:                      %[[VAL_0:.*]]: f32) -> f32 {
415a54f4eaeSMogball// CHECK:           %[[CST_LOG2E:.*]] = arith.constant 1.44269502 : f32
4163c952ab2SEmilio Cota// CHECK-COUNT-5:   select
417dec8af70SRiver Riddle// CHECK:           %[[VAL_65:.*]] = arith.select
4183c952ab2SEmilio Cota// CHECK:           return %[[VAL_65]] : f32
4193c952ab2SEmilio Cota// CHECK:         }
4200254b0bcSRiver Riddlefunc.func @log2_scalar(%arg0: f32) -> f32 {
4213c952ab2SEmilio Cota  %0 = math.log2 %arg0 : f32
4223c952ab2SEmilio Cota  return %0 : f32
4233c952ab2SEmilio Cota}
4243c952ab2SEmilio Cota
4253c952ab2SEmilio Cota// CHECK-LABEL:   func @log2_vector(
4263c952ab2SEmilio Cota// CHECK-SAME:                      %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {
427a54f4eaeSMogball// CHECK:           %[[CST_LOG2E:.*]] = arith.constant dense<1.44269502> : vector<8xf32>
428c1ebefdfSBenjamin Kramer// CHECK-COUNT-5:   select
429dec8af70SRiver Riddle// CHECK:           %[[VAL_71:.*]] = arith.select
4303c952ab2SEmilio Cota// CHECK:           return %[[VAL_71]] : vector<8xf32>
4313c952ab2SEmilio Cota// CHECK:         }
4320254b0bcSRiver Riddlefunc.func @log2_vector(%arg0: vector<8xf32>) -> vector<8xf32> {
4333c952ab2SEmilio Cota  %0 = math.log2 %arg0 : vector<8xf32>
4343c952ab2SEmilio Cota  return %0 : vector<8xf32>
4353c952ab2SEmilio Cota}
4363c952ab2SEmilio Cota
437e74bcecdSBenjamin Maxwell// CHECK-LABEL:   func @log2_scalable_vector(
438e74bcecdSBenjamin Maxwell// CHECK-SAME:                      %{{.*}}: vector<[8]xf32>) -> vector<[8]xf32> {
439e74bcecdSBenjamin Maxwell// CHECK:           %[[CST_LOG2E:.*]] = arith.constant dense<1.44269502> : vector<[8]xf32>
440e74bcecdSBenjamin Maxwell// CHECK-COUNT-5:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
441e74bcecdSBenjamin Maxwell// CHECK:           %[[VAL_71:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
442e74bcecdSBenjamin Maxwell// CHECK:           return %[[VAL_71]] : vector<[8]xf32>
443e74bcecdSBenjamin Maxwell// CHECK:         }
444e74bcecdSBenjamin Maxwellfunc.func @log2_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {
445e74bcecdSBenjamin Maxwell  %0 = math.log2 %arg0 : vector<[8]xf32>
446e74bcecdSBenjamin Maxwell  return %0 : vector<[8]xf32>
447e74bcecdSBenjamin Maxwell}
448e74bcecdSBenjamin Maxwell
4493c952ab2SEmilio Cota// CHECK-LABEL:   func @log1p_scalar(
4503c952ab2SEmilio Cota// CHECK-SAME:                       %[[X:.*]]: f32) -> f32 {
451a54f4eaeSMogball// CHECK:           %[[CST_ONE:.*]] = arith.constant 1.000000e+00 : f32
452a54f4eaeSMogball// CHECK:           %[[U:.*]] = arith.addf %[[X]], %[[CST_ONE]] : f32
453a54f4eaeSMogball// CHECK:           %[[U_SMALL:.*]] = arith.cmpf oeq, %[[U]], %[[CST_ONE]] : f32
4543c952ab2SEmilio Cota// CHECK-NOT:       log
4553c952ab2SEmilio Cota// CHECK-COUNT-5:   select
456dec8af70SRiver Riddle// CHECK:           %[[LOG_U:.*]] = arith.select
457a54f4eaeSMogball// CHECK:           %[[U_INF:.*]] = arith.cmpf oeq, %[[U]], %[[LOG_U]] : f32
458a54f4eaeSMogball// CHECK:           %[[VAL_69:.*]] = arith.subf %[[U]], %[[CST_ONE]] : f32
459a54f4eaeSMogball// CHECK:           %[[VAL_70:.*]] = arith.divf %[[LOG_U]], %[[VAL_69]] : f32
460a54f4eaeSMogball// CHECK:           %[[LOG_LARGE:.*]] = arith.mulf %[[X]], %[[VAL_70]] : f32
461a54f4eaeSMogball// CHECK:           %[[VAL_72:.*]] = arith.ori %[[U_SMALL]], %[[U_INF]]  : i1
462dec8af70SRiver Riddle// CHECK:           %[[APPROX:.*]] = arith.select %[[VAL_72]], %[[X]], %[[LOG_LARGE]] : f32
4633c952ab2SEmilio Cota// CHECK:           return %[[APPROX]] : f32
4643c952ab2SEmilio Cota// CHECK:         }
4650254b0bcSRiver Riddlefunc.func @log1p_scalar(%arg0: f32) -> f32 {
4663c952ab2SEmilio Cota  %0 = math.log1p %arg0 : f32
4673c952ab2SEmilio Cota  return %0 : f32
4683c952ab2SEmilio Cota}
4693c952ab2SEmilio Cota
4703c952ab2SEmilio Cota// CHECK-LABEL:   func @log1p_vector(
4713c952ab2SEmilio Cota// CHECK-SAME:                       %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {
472a54f4eaeSMogball// CHECK:           %[[CST_ONE:.*]] = arith.constant dense<1.000000e+00> : vector<8xf32>
473c1ebefdfSBenjamin Kramer// CHECK-COUNT-6:   select
474dec8af70SRiver Riddle// CHECK:           %[[VAL_79:.*]] = arith.select
4753c952ab2SEmilio Cota// CHECK:           return %[[VAL_79]] : vector<8xf32>
4763c952ab2SEmilio Cota// CHECK:         }
4770254b0bcSRiver Riddlefunc.func @log1p_vector(%arg0: vector<8xf32>) -> vector<8xf32> {
4783c952ab2SEmilio Cota  %0 = math.log1p %arg0 : vector<8xf32>
4793c952ab2SEmilio Cota  return %0 : vector<8xf32>
4803c952ab2SEmilio Cota}
4813c952ab2SEmilio Cota
482e74bcecdSBenjamin Maxwell// CHECK-LABEL:   func @log1p_scalable_vector(
483e74bcecdSBenjamin Maxwell// CHECK-SAME:                       %[[VAL_0:.*]]: vector<[8]xf32>) -> vector<[8]xf32> {
484e74bcecdSBenjamin Maxwell// CHECK:           %[[CST_ONE:.*]] = arith.constant dense<1.000000e+00> : vector<[8]xf32>
485e74bcecdSBenjamin Maxwell// CHECK-COUNT-6:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
486e74bcecdSBenjamin Maxwell// CHECK:           %[[VAL_79:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
487e74bcecdSBenjamin Maxwell// CHECK:           return %[[VAL_79]] : vector<[8]xf32>
488e74bcecdSBenjamin Maxwell// CHECK:         }
489e74bcecdSBenjamin Maxwellfunc.func @log1p_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {
490e74bcecdSBenjamin Maxwell  %0 = math.log1p %arg0 : vector<[8]xf32>
491e74bcecdSBenjamin Maxwell  return %0 : vector<[8]xf32>
492e74bcecdSBenjamin Maxwell}
4933c952ab2SEmilio Cota
4943c952ab2SEmilio Cota// CHECK-LABEL:   func @tanh_scalar(
4953c952ab2SEmilio Cota// CHECK-SAME:                      %[[VAL_0:.*]]: f32) -> f32 {
496bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant -7.99881172 : f32
497bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 7.99881172 : f32
498bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 4.000000e-04 : f32
499bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 0.00489352457 : f32
500bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant 6.37261954E-4 : f32
501bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 1.48572235E-5 : f32
502bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 5.12229725E-8 : f32
503bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant -8.60467184E-11 : f32
504bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 2.00018794E-13 : f32
505bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant -2.76076837E-16 : f32
506bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 0.00489352504 : f32
507bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 0.00226843474 : f32
508bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 1.18534706E-4 : f32
509bb6d5c22SMatthias Springer// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 1.19825836E-6 : f32
510f5efe280STres Popp// CHECK:           %[[VAL_15:.*]] = arith.cmpf ult, %[[VAL_0]], %[[VAL_2]] : f32
511dec8af70SRiver Riddle// CHECK:           %[[VAL_16:.*]] = arith.select %[[VAL_15]], %[[VAL_0]], %[[VAL_2]] : f32
512f5efe280STres Popp// CHECK:           %[[VAL_17:.*]] = arith.cmpf ugt, %[[VAL_16]], %[[VAL_1]] : f32
513dec8af70SRiver Riddle// CHECK:           %[[VAL_18:.*]] = arith.select %[[VAL_17]], %[[VAL_16]], %[[VAL_1]] : f32
51400f7096dSJeff Niu// CHECK:           %[[VAL_19:.*]] = math.absf %[[VAL_0]] : f32
515a54f4eaeSMogball// CHECK:           %[[VAL_20:.*]] = arith.cmpf olt, %[[VAL_19]], %[[VAL_3]] : f32
516a54f4eaeSMogball// CHECK:           %[[VAL_21:.*]] = arith.mulf %[[VAL_18]], %[[VAL_18]] : f32
517a54f4eaeSMogball// CHECK:           %[[VAL_22:.*]] = math.fma %[[VAL_21]], %[[VAL_10]], %[[VAL_9]] : f32
518a54f4eaeSMogball// CHECK:           %[[VAL_23:.*]] = math.fma %[[VAL_21]], %[[VAL_22]], %[[VAL_8]] : f32
519a54f4eaeSMogball// CHECK:           %[[VAL_24:.*]] = math.fma %[[VAL_21]], %[[VAL_23]], %[[VAL_7]] : f32
520a54f4eaeSMogball// CHECK:           %[[VAL_25:.*]] = math.fma %[[VAL_21]], %[[VAL_24]], %[[VAL_6]] : f32
521a54f4eaeSMogball// CHECK:           %[[VAL_26:.*]] = math.fma %[[VAL_21]], %[[VAL_25]], %[[VAL_5]] : f32
522a54f4eaeSMogball// CHECK:           %[[VAL_27:.*]] = math.fma %[[VAL_21]], %[[VAL_26]], %[[VAL_4]] : f32
523a54f4eaeSMogball// CHECK:           %[[VAL_28:.*]] = arith.mulf %[[VAL_18]], %[[VAL_27]] : f32
524a54f4eaeSMogball// CHECK:           %[[VAL_29:.*]] = math.fma %[[VAL_21]], %[[VAL_14]], %[[VAL_13]] : f32
525a54f4eaeSMogball// CHECK:           %[[VAL_30:.*]] = math.fma %[[VAL_21]], %[[VAL_29]], %[[VAL_12]] : f32
526a54f4eaeSMogball// CHECK:           %[[VAL_31:.*]] = math.fma %[[VAL_21]], %[[VAL_30]], %[[VAL_11]] : f32
527a54f4eaeSMogball// CHECK:           %[[VAL_32:.*]] = arith.divf %[[VAL_28]], %[[VAL_31]] : f32
528dec8af70SRiver Riddle// CHECK:           %[[VAL_33:.*]] = arith.select %[[VAL_20]], %[[VAL_18]], %[[VAL_32]] : f32
5293c952ab2SEmilio Cota// CHECK:           return %[[VAL_33]] : f32
5303c952ab2SEmilio Cota// CHECK:         }
5310254b0bcSRiver Riddlefunc.func @tanh_scalar(%arg0: f32) -> f32 {
5323c952ab2SEmilio Cota  %0 = math.tanh %arg0 : f32
5333c952ab2SEmilio Cota  return %0 : f32
5343c952ab2SEmilio Cota}
5353c952ab2SEmilio Cota
5363c952ab2SEmilio Cota// CHECK-LABEL:   func @tanh_vector(
5373c952ab2SEmilio Cota// CHECK-SAME:                      %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {
538bf32bb7eSEugene Zhulenev// CHECK:           %[[VAL_1:.*]] = arith.constant dense<-7.99881172> : vector<8xf32>
5393c952ab2SEmilio Cota// CHECK-NOT:       tanh
5403c952ab2SEmilio Cota// CHECK-COUNT-2:   select
541dec8af70SRiver Riddle// CHECK:           %[[VAL_33:.*]] = arith.select
5423c952ab2SEmilio Cota// CHECK:           return %[[VAL_33]] : vector<8xf32>
5433c952ab2SEmilio Cota// CHECK:         }
5440254b0bcSRiver Riddlefunc.func @tanh_vector(%arg0: vector<8xf32>) -> vector<8xf32> {
5453c952ab2SEmilio Cota  %0 = math.tanh %arg0 : vector<8xf32>
5463c952ab2SEmilio Cota  return %0 : vector<8xf32>
547ea7f211bSAhmed Taei}
54835553d45SEmilio Cota
549e74bcecdSBenjamin Maxwell// CHECK-LABEL:   func @tanh_scalable_vector(
550e74bcecdSBenjamin Maxwell// CHECK-SAME:                      %[[VAL_0:.*]]: vector<[8]xf32>) -> vector<[8]xf32> {
551e74bcecdSBenjamin Maxwell// CHECK:           %[[VAL_1:.*]] = arith.constant dense<-7.99881172> : vector<[8]xf32>
552e74bcecdSBenjamin Maxwell// CHECK-NOT:       tanh
553e74bcecdSBenjamin Maxwell// CHECK-COUNT-2:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
554e74bcecdSBenjamin Maxwell// CHECK:           %[[VAL_33:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>
555e74bcecdSBenjamin Maxwell// CHECK:           return %[[VAL_33]] : vector<[8]xf32>
556e74bcecdSBenjamin Maxwell// CHECK:         }
557e74bcecdSBenjamin Maxwellfunc.func @tanh_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {
558e74bcecdSBenjamin Maxwell  %0 = math.tanh %arg0 : vector<[8]xf32>
559e74bcecdSBenjamin Maxwell  return %0 : vector<[8]xf32>
560e74bcecdSBenjamin Maxwell}
561e74bcecdSBenjamin Maxwell
56235553d45SEmilio Cota// We only approximate rsqrt for vectors and when the AVX2 option is enabled.
56335553d45SEmilio Cota// CHECK-LABEL:   func @rsqrt_scalar
56435553d45SEmilio Cota// AVX2-LABEL:    func @rsqrt_scalar
56535553d45SEmilio Cota// CHECK:           math.rsqrt
56635553d45SEmilio Cota// AVX2:            math.rsqrt
5670254b0bcSRiver Riddlefunc.func @rsqrt_scalar(%arg0: f32) -> f32 {
56835553d45SEmilio Cota  %0 = math.rsqrt %arg0 : f32
56935553d45SEmilio Cota  return %0 : f32
57035553d45SEmilio Cota}
57135553d45SEmilio Cota
572627fa0b9SEugene Zhulenev// CHECK-LABEL:   func @rsqrt_vector_8xf32
57335553d45SEmilio Cota// CHECK:           math.rsqrt
574627fa0b9SEugene Zhulenev// AVX2-LABEL:    func @rsqrt_vector_8xf32(
57535553d45SEmilio Cota// AVX2-SAME:       %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {
57635553d45SEmilio Cota// AVX2:   %[[VAL_1:.*]] = arith.constant dense<0x7F800000> : vector<8xf32>
57735553d45SEmilio Cota// AVX2:   %[[VAL_2:.*]] = arith.constant dense<1.500000e+00> : vector<8xf32>
57835553d45SEmilio Cota// AVX2:   %[[VAL_3:.*]] = arith.constant dense<-5.000000e-01> : vector<8xf32>
57935553d45SEmilio Cota// AVX2:   %[[VAL_4:.*]] = arith.constant dense<1.17549435E-38> : vector<8xf32>
58035553d45SEmilio Cota// AVX2:   %[[VAL_5:.*]] = arith.mulf %[[VAL_0]], %[[VAL_3]] : vector<8xf32>
58135553d45SEmilio Cota// AVX2:   %[[VAL_6:.*]] = arith.cmpf olt, %[[VAL_0]], %[[VAL_4]] : vector<8xf32>
58235553d45SEmilio Cota// AVX2:   %[[VAL_7:.*]] = arith.cmpf oeq, %[[VAL_0]], %[[VAL_1]] : vector<8xf32>
58335553d45SEmilio Cota// AVX2:   %[[VAL_8:.*]] = arith.ori %[[VAL_6]], %[[VAL_7]] : vector<8xi1>
58435553d45SEmilio Cota// AVX2:   %[[VAL_9:.*]] = x86vector.avx.rsqrt %[[VAL_0]] : vector<8xf32>
58535553d45SEmilio Cota// AVX2:   %[[VAL_10:.*]] = arith.mulf %[[VAL_5]], %[[VAL_9]] : vector<8xf32>
58635553d45SEmilio Cota// AVX2:   %[[VAL_11:.*]] = math.fma %[[VAL_9]], %[[VAL_10]], %[[VAL_2]] : vector<8xf32>
58735553d45SEmilio Cota// AVX2:   %[[VAL_12:.*]] = arith.mulf %[[VAL_9]], %[[VAL_11]] : vector<8xf32>
588dec8af70SRiver Riddle// AVX2:   %[[VAL_13:.*]] = arith.select %[[VAL_8]], %[[VAL_9]], %[[VAL_12]] : vector<8xi1>, vector<8xf32>
58935553d45SEmilio Cota// AVX2:   return %[[VAL_13]] : vector<8xf32>
59035553d45SEmilio Cota// AVX2: }
5910254b0bcSRiver Riddlefunc.func @rsqrt_vector_8xf32(%arg0: vector<8xf32>) -> vector<8xf32> {
59235553d45SEmilio Cota  %0 = math.rsqrt %arg0 : vector<8xf32>
59335553d45SEmilio Cota  return %0 : vector<8xf32>
59435553d45SEmilio Cota}
595627fa0b9SEugene Zhulenev
596627fa0b9SEugene Zhulenev// Virtual vector width is not a multiple of an AVX2 vector width.
597627fa0b9SEugene Zhulenev//
598627fa0b9SEugene Zhulenev// CHECK-LABEL:  func @rsqrt_vector_5xf32
599627fa0b9SEugene Zhulenev// CHECK:          math.rsqrt
600627fa0b9SEugene Zhulenev// AVX2-LABEL:   func @rsqrt_vector_5xf32
601627fa0b9SEugene Zhulenev// AVX2:           math.rsqrt
6020254b0bcSRiver Riddlefunc.func @rsqrt_vector_5xf32(%arg0: vector<5xf32>) -> vector<5xf32> {
603627fa0b9SEugene Zhulenev  %0 = math.rsqrt %arg0 : vector<5xf32>
604627fa0b9SEugene Zhulenev  return %0 : vector<5xf32>
605627fa0b9SEugene Zhulenev}
606627fa0b9SEugene Zhulenev
607627fa0b9SEugene Zhulenev// One dimensional virtual vector expanded and unrolled into multiple AVX2-sized
608627fa0b9SEugene Zhulenev// vectors.
609627fa0b9SEugene Zhulenev//
610627fa0b9SEugene Zhulenev// CHECK-LABEL: func @rsqrt_vector_16xf32
611627fa0b9SEugene Zhulenev// CHECK:         math.rsqrt
612627fa0b9SEugene Zhulenev// AVX2-LABEL:  func @rsqrt_vector_16xf32(
613627fa0b9SEugene Zhulenev// AVX2-SAME:     %[[ARG:.*]]: vector<16xf32>
614627fa0b9SEugene Zhulenev// AVX2-SAME:   ) -> vector<16xf32>
615627fa0b9SEugene Zhulenev// AVX2:          %[[INIT:.*]] = arith.constant dense<0.000000e+00> : vector<2x8xf32>
616627fa0b9SEugene Zhulenev// AVX2:          %[[EXPAND:.*]] = vector.shape_cast %[[ARG]] : vector<16xf32> to vector<2x8xf32>
617627fa0b9SEugene Zhulenev// AVX2:          %[[VEC0:.*]] = vector.extract %[[EXPAND]][0]
618627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT0:.*]] = x86vector.avx.rsqrt %[[VEC0]]
619627fa0b9SEugene Zhulenev// AVX2:          %[[VEC1:.*]] = vector.extract %[[EXPAND]][1]
620627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT1:.*]] = x86vector.avx.rsqrt %[[VEC1]]
621627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT0:.*]] = vector.insert %[[RSQRT0]], %[[INIT]] [0]
622627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT1:.*]] = vector.insert %[[RSQRT1]], %[[RESULT0]] [1]
623627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT:.*]] = vector.shape_cast %[[RESULT1]] : vector<2x8xf32> to vector<16xf32>
6240254b0bcSRiver Riddlefunc.func @rsqrt_vector_16xf32(%arg0: vector<16xf32>) -> vector<16xf32> {
625627fa0b9SEugene Zhulenev  %0 = math.rsqrt %arg0 : vector<16xf32>
626627fa0b9SEugene Zhulenev  return %0 : vector<16xf32>
627627fa0b9SEugene Zhulenev}
628627fa0b9SEugene Zhulenev
629627fa0b9SEugene Zhulenev// Two dimensional virtual vector unrolled into multiple AVX2-sized vectors.
630627fa0b9SEugene Zhulenev//
631627fa0b9SEugene Zhulenev// CHECK-LABEL: func @rsqrt_vector_2x8xf32
632627fa0b9SEugene Zhulenev// CHECK:         math.rsqrt
633627fa0b9SEugene Zhulenev// AVX2-LABEL:  func @rsqrt_vector_2x8xf32(
634627fa0b9SEugene Zhulenev// AVX2-SAME:     %[[ARG:.*]]: vector<2x8xf32>
635627fa0b9SEugene Zhulenev// AVX2-SAME:   ) -> vector<2x8xf32>
636627fa0b9SEugene Zhulenev// AVX2:          %[[INIT:.*]] = arith.constant dense<0.000000e+00> : vector<2x8xf32>
637627fa0b9SEugene Zhulenev// AVX2-NOT:      vector.shape_cast
638627fa0b9SEugene Zhulenev// AVX2:          %[[VEC0:.*]] = vector.extract %[[ARG]][0]
639627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT0:.*]] = x86vector.avx.rsqrt %[[VEC0]]
640627fa0b9SEugene Zhulenev// AVX2:          %[[VEC1:.*]] = vector.extract %[[ARG]][1]
641627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT1:.*]] = x86vector.avx.rsqrt %[[VEC1]]
642627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT0:.*]] = vector.insert %[[RSQRT0]], %[[INIT]] [0]
643627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT1:.*]] = vector.insert %[[RSQRT1]], %[[RESULT0]] [1]
644627fa0b9SEugene Zhulenev// AVX2-NOT:      vector.shape_cast
6450254b0bcSRiver Riddlefunc.func @rsqrt_vector_2x8xf32(%arg0: vector<2x8xf32>) -> vector<2x8xf32> {
646627fa0b9SEugene Zhulenev  %0 = math.rsqrt %arg0 : vector<2x8xf32>
647627fa0b9SEugene Zhulenev  return %0 : vector<2x8xf32>
648627fa0b9SEugene Zhulenev}
649627fa0b9SEugene Zhulenev
650627fa0b9SEugene Zhulenev// Two dimensional virtual vector expanded and unrolled into multiple AVX2-sized
651627fa0b9SEugene Zhulenev// vectors.
652627fa0b9SEugene Zhulenev//
653627fa0b9SEugene Zhulenev// CHECK-LABEL: func @rsqrt_vector_2x16xf32
654627fa0b9SEugene Zhulenev// CHECK:         math.rsqrt
655627fa0b9SEugene Zhulenev// AVX2-LABEL:  func @rsqrt_vector_2x16xf32(
656627fa0b9SEugene Zhulenev// AVX2-SAME:     %[[ARG:.*]]: vector<2x16xf32>
657627fa0b9SEugene Zhulenev// AVX2-SAME:   ) -> vector<2x16xf32>
658627fa0b9SEugene Zhulenev// AVX2:          %[[INIT:.*]] = arith.constant dense<0.000000e+00> : vector<2x2x8xf32>
659627fa0b9SEugene Zhulenev// AVX2:          %[[EXPAND:.*]] = vector.shape_cast %[[ARG]] : vector<2x16xf32> to vector<2x2x8xf32>
660627fa0b9SEugene Zhulenev// AVX2:          %[[VEC00:.*]] = vector.extract %[[EXPAND]][0, 0]
661627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT00:.*]] = x86vector.avx.rsqrt %[[VEC00]]
662627fa0b9SEugene Zhulenev// AVX2:          %[[VEC01:.*]] = vector.extract %[[EXPAND]][0, 1]
663627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT01:.*]] = x86vector.avx.rsqrt %[[VEC01]]
664627fa0b9SEugene Zhulenev// AVX2:          %[[VEC10:.*]] = vector.extract %[[EXPAND]][1, 0]
665627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT10:.*]] = x86vector.avx.rsqrt %[[VEC10]]
666627fa0b9SEugene Zhulenev// AVX2:          %[[VEC11:.*]] = vector.extract %[[EXPAND]][1, 1]
667627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT11:.*]] = x86vector.avx.rsqrt %[[VEC11]]
668627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT0:.*]] = vector.insert %[[RSQRT00]], %[[INIT]] [0, 0]
669627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT1:.*]] = vector.insert %[[RSQRT01]], %[[RESULT0]] [0, 1]
670627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT2:.*]] = vector.insert %[[RSQRT10]], %[[RESULT1]] [1, 0]
671627fa0b9SEugene Zhulenev// AVX2:          %[[RESULT3:.*]] = vector.insert %[[RSQRT11]], %[[RESULT2]] [1, 1]
672627fa0b9SEugene Zhulenev// AVX2:          %[[RSQRT:.*]] = vector.shape_cast %[[RESULT3]] : vector<2x2x8xf32> to vector<2x16xf32>
6730254b0bcSRiver Riddlefunc.func @rsqrt_vector_2x16xf32(%arg0: vector<2x16xf32>) -> vector<2x16xf32> {
674627fa0b9SEugene Zhulenev  %0 = math.rsqrt %arg0 : vector<2x16xf32>
675627fa0b9SEugene Zhulenev  return %0 : vector<2x16xf32>
676627fa0b9SEugene Zhulenev}
6772f9f9afaSRob Suderman
6782f9f9afaSRob Suderman// CHECK-LABEL: @atan_scalar
6790bedb667SRobert Suderman// CHECK-SAME:      %[[VAL_0:.*]]: f32) -> f32 {
6800bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 1.000000e+00 : f32
6810bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 6.600000e-01 : f32
6820bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 2.41421366 : f32
6830bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant -0.875060856 : f32
6840bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant -16.1575375 : f32
6850bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant -75.0085601 : f32
6860bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant -122.886665 : f32
6870bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant -64.8502197 : f32
6880bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 24.8584652 : f32
6890bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 165.027008 : f32
6900bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 432.881073 : f32
6910bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 485.390411 : f32
6920bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 194.550659 : f32
6930bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 0.785398185 : f32
6940bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 1.57079637 : f32
6950bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_16:.*]] = math.absf %[[VAL_0]] : f32
6960bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_17:.*]] = arith.cmpf ogt, %[[VAL_16]], %[[VAL_2]] : f32
6970bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_18:.*]] = arith.addf %[[VAL_16]], %[[VAL_1]] : f32
6980bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_19:.*]] = arith.subf %[[VAL_16]], %[[VAL_1]] : f32
6990bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_20:.*]] = arith.select %[[VAL_17]], %[[VAL_19]], %[[VAL_16]] : f32
7000bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_21:.*]] = arith.select %[[VAL_17]], %[[VAL_18]], %[[VAL_1]] : f32
7010bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_22:.*]] = arith.cmpf ogt, %[[VAL_16]], %[[VAL_3]] : f32
7020bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_23:.*]] = arith.select %[[VAL_22]], %[[VAL_1]], %[[VAL_20]] : f32
7030bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_24:.*]] = arith.select %[[VAL_22]], %[[VAL_16]], %[[VAL_21]] : f32
7040bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_25:.*]] = arith.divf %[[VAL_23]], %[[VAL_24]] : f32
7050bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_26:.*]] = arith.mulf %[[VAL_25]], %[[VAL_25]] : f32
7060bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_27:.*]] = math.fma %[[VAL_26]], %[[VAL_4]], %[[VAL_5]] : f32
7070bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_28:.*]] = math.fma %[[VAL_26]], %[[VAL_27]], %[[VAL_6]] : f32
7080bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_29:.*]] = math.fma %[[VAL_26]], %[[VAL_28]], %[[VAL_7]] : f32
7090bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_30:.*]] = math.fma %[[VAL_26]], %[[VAL_29]], %[[VAL_8]] : f32
7100bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_31:.*]] = arith.mulf %[[VAL_30]], %[[VAL_26]] : f32
7110bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_32:.*]] = math.fma %[[VAL_26]], %[[VAL_9]], %[[VAL_10]] : f32
7120bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_33:.*]] = math.fma %[[VAL_26]], %[[VAL_32]], %[[VAL_11]] : f32
7130bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_34:.*]] = math.fma %[[VAL_26]], %[[VAL_33]], %[[VAL_12]] : f32
7140bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_35:.*]] = math.fma %[[VAL_26]], %[[VAL_34]], %[[VAL_13]] : f32
7150bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_36:.*]] = arith.divf %[[VAL_31]], %[[VAL_35]] : f32
7160bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_37:.*]] = math.fma %[[VAL_36]], %[[VAL_25]], %[[VAL_25]] : f32
7170bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_38:.*]] = arith.addf %[[VAL_37]], %[[VAL_14]] : f32
7180bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_39:.*]] = arith.select %[[VAL_17]], %[[VAL_38]], %[[VAL_37]] : f32
7190bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_40:.*]] = arith.subf %[[VAL_15]], %[[VAL_37]] : f32
7200bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_41:.*]] = arith.select %[[VAL_22]], %[[VAL_40]], %[[VAL_39]] : f32
7210bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_42:.*]] = math.copysign %[[VAL_41]], %[[VAL_0]] : f32
7220bedb667SRobert Suderman// CHECK:           return %[[VAL_42]] : f3
7230254b0bcSRiver Riddlefunc.func @atan_scalar(%arg0: f32) -> f32 {
7242f9f9afaSRob Suderman  %0 = math.atan %arg0 : f32
7252f9f9afaSRob Suderman  return %0 : f32
7262f9f9afaSRob Suderman}
7272f9f9afaSRob Suderman
7282f9f9afaSRob Suderman
7292f9f9afaSRob Suderman// CHECK-LABEL: @atan2_scalar
7300bedb667SRobert Suderman// CHECK-SAME:      %[[VAL_0:.*]]: f16,
7310bedb667SRobert Suderman// CHECK-SAME:      %[[VAL_1:.*]]: f16)
7320bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32
7330bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 6.600000e-01 : f32
7340bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 2.41421366 : f32
7350bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant -0.875060856 : f32
7360bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant -16.1575375 : f32
7370bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant -75.0085601 : f32
7380bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant -122.886665 : f32
7390bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant -64.8502197 : f32
7400bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 24.8584652 : f32
7410bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 165.027008 : f32
7420bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 432.881073 : f32
7430bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 485.390411 : f32
7440bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 194.550659 : f32
7450bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 0.785398185 : f32
7460bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant 1.57079637 : f32
7470bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_17:.*]] = arith.constant 0.000000e+00 : f32
7480bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_18:.*]] = arith.constant 3.14159274 : f32
7490bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_19:.*]] = arith.constant -1.57079637 : f32
7500bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_20:.*]] = arith.constant 0x7FC00000 : f32
7510bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_21:.*]] = arith.extf %[[VAL_0]] : f16 to f32
7520bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_22:.*]] = arith.extf %[[VAL_1]] : f16 to f32
7530bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_23:.*]] = arith.divf %[[VAL_21]], %[[VAL_22]] : f32
7540bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_24:.*]] = math.absf %[[VAL_23]] : f32
7550bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_25:.*]] = arith.cmpf ogt, %[[VAL_24]], %[[VAL_3]] : f32
7560bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_26:.*]] = arith.addf %[[VAL_24]], %[[VAL_2]] : f32
7570bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_27:.*]] = arith.subf %[[VAL_24]], %[[VAL_2]] : f32
7580bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_28:.*]] = arith.select %[[VAL_25]], %[[VAL_27]], %[[VAL_24]] : f32
7590bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_29:.*]] = arith.select %[[VAL_25]], %[[VAL_26]], %[[VAL_2]] : f32
7600bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_30:.*]] = arith.cmpf ogt, %[[VAL_24]], %[[VAL_4]] : f32
7610bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_31:.*]] = arith.select %[[VAL_30]], %[[VAL_2]], %[[VAL_28]] : f32
7620bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_32:.*]] = arith.select %[[VAL_30]], %[[VAL_24]], %[[VAL_29]] : f32
7630bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_33:.*]] = arith.divf %[[VAL_31]], %[[VAL_32]] : f32
7640bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_34:.*]] = arith.mulf %[[VAL_33]], %[[VAL_33]] : f32
7650bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_35:.*]] = math.fma %[[VAL_34]], %[[VAL_5]], %[[VAL_6]] : f32
7660bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_36:.*]] = math.fma %[[VAL_34]], %[[VAL_35]], %[[VAL_7]] : f32
7670bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_37:.*]] = math.fma %[[VAL_34]], %[[VAL_36]], %[[VAL_8]] : f32
7680bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_38:.*]] = math.fma %[[VAL_34]], %[[VAL_37]], %[[VAL_9]] : f32
7690bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_39:.*]] = arith.mulf %[[VAL_38]], %[[VAL_34]] : f32
7700bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_40:.*]] = math.fma %[[VAL_34]], %[[VAL_10]], %[[VAL_11]] : f32
7710bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_41:.*]] = math.fma %[[VAL_34]], %[[VAL_40]], %[[VAL_12]] : f32
7720bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_42:.*]] = math.fma %[[VAL_34]], %[[VAL_41]], %[[VAL_13]] : f32
7730bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_43:.*]] = math.fma %[[VAL_34]], %[[VAL_42]], %[[VAL_14]] : f32
7740bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_44:.*]] = arith.divf %[[VAL_39]], %[[VAL_43]] : f32
7750bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_45:.*]] = math.fma %[[VAL_44]], %[[VAL_33]], %[[VAL_33]] : f32
7760bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_46:.*]] = arith.addf %[[VAL_45]], %[[VAL_15]] : f32
7770bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_47:.*]] = arith.select %[[VAL_25]], %[[VAL_46]], %[[VAL_45]] : f32
7780bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_48:.*]] = arith.subf %[[VAL_16]], %[[VAL_45]] : f32
7790bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_49:.*]] = arith.select %[[VAL_30]], %[[VAL_48]], %[[VAL_47]] : f32
7800bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_50:.*]] = math.copysign %[[VAL_49]], %[[VAL_23]] : f32
7810bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_51:.*]] = arith.addf %[[VAL_50]], %[[VAL_18]] : f32
7820bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_52:.*]] = arith.subf %[[VAL_50]], %[[VAL_18]] : f32
7830bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_53:.*]] = arith.cmpf ogt, %[[VAL_50]], %[[VAL_17]] : f32
7840bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_54:.*]] = arith.select %[[VAL_53]], %[[VAL_52]], %[[VAL_51]] : f32
7850bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_55:.*]] = arith.cmpf ogt, %[[VAL_22]], %[[VAL_17]] : f32
7860bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_56:.*]] = arith.select %[[VAL_55]], %[[VAL_50]], %[[VAL_54]] : f32
7870bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_57:.*]] = arith.cmpf oeq, %[[VAL_22]], %[[VAL_17]] : f32
7880bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_58:.*]] = arith.cmpf ogt, %[[VAL_21]], %[[VAL_17]] : f32
7890bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_59:.*]] = arith.andi %[[VAL_57]], %[[VAL_58]] : i1
7900bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_60:.*]] = arith.select %[[VAL_59]], %[[VAL_16]], %[[VAL_56]] : f32
7910bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_61:.*]] = arith.cmpf olt, %[[VAL_21]], %[[VAL_17]] : f32
7920bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_62:.*]] = arith.andi %[[VAL_57]], %[[VAL_61]] : i1
7930bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_63:.*]] = arith.select %[[VAL_62]], %[[VAL_19]], %[[VAL_60]] : f32
7940bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_64:.*]] = arith.cmpf oeq, %[[VAL_21]], %[[VAL_17]] : f32
7950bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_65:.*]] = arith.andi %[[VAL_57]], %[[VAL_64]] : i1
7960bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_66:.*]] = arith.select %[[VAL_65]], %[[VAL_20]], %[[VAL_63]] : f32
7970bedb667SRobert Suderman// CHECK-DAG:       %[[VAL_67:.*]] = arith.truncf %[[VAL_66]] : f32 to f16
7980bedb667SRobert Suderman// CHECK:           return %[[VAL_67]] : f1
7990254b0bcSRiver Riddlefunc.func @atan2_scalar(%arg0: f16, %arg1: f16) -> f16 {
800bbddd19eSJacques Pienaar  %0 = math.atan2 %arg0, %arg1 : f16
801bbddd19eSJacques Pienaar  return %0 : f16
8022f9f9afaSRob Suderman}
8036b538810SRobert Suderman
8046b538810SRobert Suderman// CHECK-LABEL: @cbrt_vector
8056b538810SRobert Suderman// CHECK-SAME: %[[ARG0:.+]]: vector<4xf32>
8066b538810SRobert Suderman
8076b538810SRobert Suderman// CHECK: %[[TWO_INT:.+]] = arith.constant dense<2>
8086b538810SRobert Suderman// CHECK: %[[FOUR_INT:.+]] = arith.constant dense<4>
8096b538810SRobert Suderman// CHECK: %[[EIGHT_INT:.+]] = arith.constant dense<8>
8106b538810SRobert Suderman// CHECK: %[[MAGIC:.+]] = arith.constant dense<709965728>
8116b538810SRobert Suderman// CHECK: %[[THIRD_FP:.+]] = arith.constant dense<0.333333343> : vector<4xf32>
8126b538810SRobert Suderman// CHECK: %[[TWO_FP:.+]] = arith.constant dense<2.000000e+00> : vector<4xf32>
8136b538810SRobert Suderman// CHECK: %[[ZERO_FP:.+]] = arith.constant dense<0.000000e+00> : vector<4xf32>
8146b538810SRobert Suderman
8156b538810SRobert Suderman// CHECK: %[[ABS:.+]] = math.absf %[[ARG0]] : vector<4xf32>
8166b538810SRobert Suderman
8176b538810SRobert Suderman// Perform the initial approximation:
8186b538810SRobert Suderman// CHECK: %[[CAST:.+]] = arith.bitcast %[[ABS]] : vector<4xf32> to vector<4xi32>
8196b538810SRobert Suderman// CHECK: %[[SH_TWO:.+]] = arith.shrsi %[[CAST]], %[[TWO_INT]]
8206b538810SRobert Suderman// CHECK: %[[SH_FOUR:.+]] = arith.shrsi %[[CAST]], %[[FOUR_INT]]
8216b538810SRobert Suderman// CHECK: %[[APPROX0:.+]] = arith.addi %[[SH_TWO]], %[[SH_FOUR]]
8226b538810SRobert Suderman// CHECK: %[[SH_FOUR:.+]] = arith.shrsi %[[APPROX0]], %[[FOUR_INT]]
8236b538810SRobert Suderman// CHECK: %[[APPROX1:.+]] = arith.addi %[[APPROX0]], %[[SH_FOUR]]
8246b538810SRobert Suderman// CHECK: %[[SH_EIGHT:.+]] = arith.shrsi %[[APPROX1]], %[[EIGHT_INT]]
8256b538810SRobert Suderman// CHECK: %[[APPROX2:.+]] = arith.addi %[[APPROX1]], %[[SH_EIGHT]]
8266b538810SRobert Suderman// CHECK: %[[FIX:.+]] = arith.addi %[[APPROX2]], %[[MAGIC]]
8276b538810SRobert Suderman// CHECK: %[[BCAST:.+]] = arith.bitcast %[[FIX]]
8286b538810SRobert Suderman
8296b538810SRobert Suderman// First Newton Step:
8306b538810SRobert Suderman// CHECK: %[[SQR:.+]] = arith.mulf %[[BCAST]], %[[BCAST]]
8316b538810SRobert Suderman// CHECK: %[[DOUBLE:.+]] = arith.mulf %[[BCAST]], %[[TWO_FP]]
8326b538810SRobert Suderman// CHECK: %[[DIV:.+]] = arith.divf %[[ABS]], %[[SQR]]
8336b538810SRobert Suderman// CHECK: %[[ADD:.+]] = arith.addf %[[DOUBLE]], %[[DIV]]
8346b538810SRobert Suderman// CHECK: %[[APPROX3:.+]] = arith.mulf %[[ADD]], %[[THIRD_FP]]
8356b538810SRobert Suderman
8366b538810SRobert Suderman// Second Newton Step:
8376b538810SRobert Suderman// CHECK: %[[SQR:.+]] = arith.mulf %[[APPROX3]], %[[APPROX3]]
8386b538810SRobert Suderman// CHECK: %[[DOUBLE:.+]] = arith.mulf %[[APPROX3]], %[[TWO_FP]]
8396b538810SRobert Suderman// CHECK: %[[DIV:.+]] = arith.divf %[[ABS]], %[[SQR]]
8406b538810SRobert Suderman// CHECK: %[[ADD:.+]] = arith.addf %[[DOUBLE]], %[[DIV]]
8416b538810SRobert Suderman// CHECK: %[[APPROX4:.+]] = arith.mulf %[[ADD]], %[[THIRD_FP]]
8426b538810SRobert Suderman
8436b538810SRobert Suderman// Check for zero special case and copy the sign:
8446b538810SRobert Suderman// CHECK: %[[CMP:.+]] = arith.cmpf oeq, %[[ABS]], %[[ZERO_FP]]
8456b538810SRobert Suderman// CHECK: %[[SEL:.+]] = arith.select %[[CMP]], %[[ZERO_FP]], %[[APPROX4]]
8466b538810SRobert Suderman// CHECK: %[[SIGN:.+]] = math.copysign %[[SEL]], %[[ARG0]]
8476b538810SRobert Suderman// CHECK: return %[[SIGN]]
8486b538810SRobert Suderman
8496b538810SRobert Sudermanfunc.func @cbrt_vector(%arg0: vector<4xf32>) -> vector<4xf32> {
8506b538810SRobert Suderman  %0 = "math.cbrt"(%arg0) : (vector<4xf32>) -> vector<4xf32>
8516b538810SRobert Suderman  func.return %0 : vector<4xf32>
8526b538810SRobert Suderman}
85357e1943eSRobert Suderman
85457e1943eSRobert Suderman
85557e1943eSRobert Suderman// CHECK-LABEL: @math_f16
85657e1943eSRobert Sudermanfunc.func @math_f16(%arg0 : vector<4xf16>) -> vector<4xf16> {
85757e1943eSRobert Suderman
85857e1943eSRobert Suderman  // CHECK-NOT: math.atan
85957e1943eSRobert Suderman  %0 = "math.atan"(%arg0) : (vector<4xf16>) -> vector<4xf16>
86057e1943eSRobert Suderman
86157e1943eSRobert Suderman  // CHECK-NOT: math.atan2
86257e1943eSRobert Suderman  %1 = "math.atan2"(%0, %arg0) : (vector<4xf16>, vector<4xf16>) -> vector<4xf16>
86357e1943eSRobert Suderman
86457e1943eSRobert Suderman  // CHECK-NOT: math.tanh
86557e1943eSRobert Suderman  %2 = "math.tanh"(%1) : (vector<4xf16>) -> vector<4xf16>
86657e1943eSRobert Suderman
86757e1943eSRobert Suderman  // CHECK-NOT: math.log
86857e1943eSRobert Suderman  %3 = "math.log"(%2) : (vector<4xf16>) -> vector<4xf16>
86957e1943eSRobert Suderman
87057e1943eSRobert Suderman  // CHECK-NOT: math.log2
87157e1943eSRobert Suderman  %4 = "math.log2"(%3) : (vector<4xf16>) -> vector<4xf16>
87257e1943eSRobert Suderman
87357e1943eSRobert Suderman  // CHECK-NOT: math.log1p
87457e1943eSRobert Suderman  %5 = "math.log1p"(%4) : (vector<4xf16>) -> vector<4xf16>
87557e1943eSRobert Suderman
87657e1943eSRobert Suderman  // CHECK-NOT: math.erf
87757e1943eSRobert Suderman  %6 = "math.erf"(%5) : (vector<4xf16>) -> vector<4xf16>
87857e1943eSRobert Suderman
87957e1943eSRobert Suderman  // CHECK-NOT: math.exp
88057e1943eSRobert Suderman  %7 = "math.exp"(%6) : (vector<4xf16>) -> vector<4xf16>
88157e1943eSRobert Suderman
88257e1943eSRobert Suderman  // CHECK-NOT: math.expm1
88357e1943eSRobert Suderman  %8 = "math.expm1"(%7) : (vector<4xf16>) -> vector<4xf16>
88457e1943eSRobert Suderman
88557e1943eSRobert Suderman  // CHECK-NOT: math.cbrt
88657e1943eSRobert Suderman  %9 = "math.cbrt"(%8) : (vector<4xf16>) -> vector<4xf16>
88757e1943eSRobert Suderman
88857e1943eSRobert Suderman  // CHECK-NOT: math.sin
88957e1943eSRobert Suderman  %10 = "math.sin"(%9) : (vector<4xf16>) -> vector<4xf16>
89057e1943eSRobert Suderman
89157e1943eSRobert Suderman  // CHECK-NOT: math.cos
89257e1943eSRobert Suderman  %11 = "math.cos"(%10) : (vector<4xf16>) -> vector<4xf16>
89357e1943eSRobert Suderman
89457e1943eSRobert Suderman  return %11 : vector<4xf16>
89557e1943eSRobert Suderman}
89657e1943eSRobert Suderman
897*72f36217SKunwar Grover// CHECK-LABEL: @math_zero_rank
898*72f36217SKunwar Groverfunc.func @math_zero_rank(%arg0 : vector<f16>) -> vector<f16> {
899*72f36217SKunwar Grover
900*72f36217SKunwar Grover  // CHECK-NOT: math.atan
901*72f36217SKunwar Grover  %0 = "math.atan"(%arg0) : (vector<f16>) -> vector<f16>
902*72f36217SKunwar Grover
903*72f36217SKunwar Grover  // CHECK-NOT: math.atan2
904*72f36217SKunwar Grover  %1 = "math.atan2"(%0, %arg0) : (vector<f16>, vector<f16>) -> vector<f16>
905*72f36217SKunwar Grover
906*72f36217SKunwar Grover  // CHECK-NOT: math.tanh
907*72f36217SKunwar Grover  %2 = "math.tanh"(%1) : (vector<f16>) -> vector<f16>
908*72f36217SKunwar Grover
909*72f36217SKunwar Grover  // CHECK-NOT: math.log
910*72f36217SKunwar Grover  %3 = "math.log"(%2) : (vector<f16>) -> vector<f16>
911*72f36217SKunwar Grover
912*72f36217SKunwar Grover  // CHECK-NOT: math.log2
913*72f36217SKunwar Grover  %4 = "math.log2"(%3) : (vector<f16>) -> vector<f16>
914*72f36217SKunwar Grover
915*72f36217SKunwar Grover  // CHECK-NOT: math.log1p
916*72f36217SKunwar Grover  %5 = "math.log1p"(%4) : (vector<f16>) -> vector<f16>
917*72f36217SKunwar Grover
918*72f36217SKunwar Grover  // CHECK-NOT: math.erf
919*72f36217SKunwar Grover  %6 = "math.erf"(%5) : (vector<f16>) -> vector<f16>
920*72f36217SKunwar Grover
921*72f36217SKunwar Grover  // CHECK-NOT: math.exp
922*72f36217SKunwar Grover  %7 = "math.exp"(%6) : (vector<f16>) -> vector<f16>
923*72f36217SKunwar Grover
924*72f36217SKunwar Grover  // CHECK-NOT: math.expm1
925*72f36217SKunwar Grover  %8 = "math.expm1"(%7) : (vector<f16>) -> vector<f16>
926*72f36217SKunwar Grover
927*72f36217SKunwar Grover  // CHECK-NOT: math.cbrt
928*72f36217SKunwar Grover  %9 = "math.cbrt"(%8) : (vector<f16>) -> vector<f16>
929*72f36217SKunwar Grover
930*72f36217SKunwar Grover  // CHECK-NOT: math.sin
931*72f36217SKunwar Grover  %10 = "math.sin"(%9) : (vector<f16>) -> vector<f16>
932*72f36217SKunwar Grover
933*72f36217SKunwar Grover  // CHECK-NOT: math.cos
934*72f36217SKunwar Grover  %11 = "math.cos"(%10) : (vector<f16>) -> vector<f16>
935*72f36217SKunwar Grover
936*72f36217SKunwar Grover  return %11 : vector<f16>
937*72f36217SKunwar Grover}
93857e1943eSRobert Suderman
93957e1943eSRobert Suderman// AVX2-LABEL: @rsqrt_f16
94057e1943eSRobert Sudermanfunc.func @rsqrt_f16(%arg0 : vector<2x8xf16>) -> vector<2x8xf16> {
94157e1943eSRobert Suderman  // AVX2-NOT: math.rsqrt
94257e1943eSRobert Suderman  %0 = "math.rsqrt"(%arg0) : (vector<2x8xf16>) -> vector<2x8xf16>
94357e1943eSRobert Suderman  return %0 : vector<2x8xf16>
94457e1943eSRobert Suderman}
945