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