brintos

brintos / llvm-project-archived public Read only

0
0
Text · 61.1 KiB · bf7c413 Raw
1055 lines · plain
1// RUN: mlir-opt %s -test-math-polynomial-approximation | FileCheck %s2// RUN: mlir-opt %s -test-math-polynomial-approximation=enable-avx2 \3// RUN: | FileCheck --check-prefix=AVX2 %s4 5// Check that all math functions lowered to approximations built from6// standard operations (add, mul, fma, shift, etc...).7 8// CHECK-LABEL: func @erf_scalar(9// CHECK-SAME:    %[[val_arg0:.*]]: f32) -> f32 {10// CHECK-DAG:     %[[val_cst:.*]] = arith.constant 0.000000e+00 : f3211// CHECK-DAG:     %[[val_cst_0:.*]] = arith.constant 1.000000e+00 : f3212// CHECK-DAG:     %[[val_cst_1:.*]] = arith.constant 1.12837911 : f3213// CHECK-DAG:     %[[val_cst_2:.*]] = arith.constant -0.523018539 : f3214// CHECK-DAG:     %[[val_cst_3:.*]] = arith.constant 0.209741712 : f3215// CHECK-DAG:     %[[val_cst_4:.*]] = arith.constant 0.0258146804 : f3216// CHECK-DAG:     %[[val_cst_5:.*]] = arith.constant 1.12750685 : f3217// CHECK-DAG:     %[[val_cst_6:.*]] = arith.constant -0.364721417 : f3218// CHECK-DAG:     %[[val_cst_7:.*]] = arith.constant 0.118407398 : f3219// CHECK-DAG:     %[[val_cst_8:.*]] = arith.constant 0.0370645523 : f3220// CHECK-DAG:     %[[val_cst_9:.*]] = arith.constant -0.00330093061 : f3221// CHECK-DAG:     %[[val_cst_10:.*]] = arith.constant 0.00351961935 : f3222// CHECK-DAG:     %[[val_cst_11:.*]] = arith.constant -0.00141373626 : f3223// CHECK-DAG:     %[[val_cst_12:.*]] = arith.constant 2.53447099E-4 : f3224// CHECK-DAG:     %[[val_cst_13:.*]] = arith.constant -1.71048032E-5 : f3225// CHECK-DAG:     %[[val_cst_14:.*]] = arith.constant -0.463513821 : f3226// CHECK-DAG:     %[[val_cst_15:.*]] = arith.constant 0.519230127 : f3227// CHECK-DAG:     %[[val_cst_16:.*]] = arith.constant -0.131808966 : f3228// CHECK-DAG:     %[[val_cst_17:.*]] = arith.constant 0.0739796459 : f3229// CHECK-DAG:     %[[val_cst_18:.*]] = arith.constant -3.276070e-01 : f3230// CHECK-DAG:     %[[val_cst_19:.*]] = arith.constant 0.448369086 : f3231// CHECK-DAG:     %[[val_cst_20:.*]] = arith.constant -0.0883462652 : f3232// CHECK-DAG:     %[[val_cst_21:.*]] = arith.constant 0.0572442785 : f3233// CHECK-DAG:     %[[val_cst_22:.*]] = arith.constant -2.0606916 : f3234// CHECK-DAG:     %[[val_cst_23:.*]] = arith.constant 1.62705934 : f3235// CHECK-DAG:     %[[val_cst_24:.*]] = arith.constant -0.583389878 : f3236// CHECK-DAG:     %[[val_cst_25:.*]] = arith.constant 0.0821908935 : f3237// CHECK-DAG:     %[[val_cst_26:.*]] = arith.constant 8.000000e-01 : f3238// CHECK-DAG:     %[[val_cst_27:.*]] = arith.constant 2.000000e+00 : f3239// CHECK-DAG:     %[[val_cst_28:.*]] = arith.constant 3.750000e+00 : f3240// CHECK:         %[[val_0:.*]] = arith.cmpf olt, %[[val_arg0]], %[[val_cst]] : f3241// CHECK:         %[[val_1:.*]] = arith.negf %[[val_arg0]] : f3242// CHECK:         %[[val_2:.*]] = arith.select %[[val_0]], %[[val_1]], %[[val_arg0]] : f3243// CHECK:         %[[val_3:.*]] = arith.cmpf olt, %[[val_2]], %[[val_cst_26]] : f3244// CHECK:         %[[val_4:.*]] = arith.select %[[val_3]], %[[val_cst_1]], %[[val_cst_5]] : f3245// CHECK:         %[[val_5:.*]] = arith.select %[[val_3]], %[[val_cst_14]], %[[val_cst_18]] : f3246// CHECK:         %[[val_6:.*]] = arith.select %[[val_3]], %[[val_cst_2]], %[[val_cst_6]] : f3247// CHECK:         %[[val_7:.*]] = arith.select %[[val_3]], %[[val_cst_15]], %[[val_cst_19]] : f3248// CHECK:         %[[val_8:.*]] = arith.select %[[val_3]], %[[val_cst_3]], %[[val_cst_7]] : f3249// CHECK:         %[[val_9:.*]] = arith.select %[[val_3]], %[[val_cst_16]], %[[val_cst_20]] : f3250// CHECK:         %[[val_10:.*]] = arith.select %[[val_3]], %[[val_cst_4]], %[[val_cst_8]] : f3251// CHECK:         %[[val_11:.*]] = arith.select %[[val_3]], %[[val_cst_17]], %[[val_cst_21]] : f3252// CHECK:         %[[val_12:.*]] = arith.cmpf olt, %[[val_2]], %[[val_cst_27]] : f3253// CHECK:         %[[val_13:.*]] = arith.select %[[val_12]], %[[val_cst]], %[[val_cst_9]] : f3254// CHECK:         %[[val_14:.*]] = arith.select %[[val_12]], %[[val_4]], %[[val_cst_10]] : f3255// CHECK:         %[[val_15:.*]] = arith.select %[[val_12]], %[[val_5]], %[[val_cst_22]] : f3256// CHECK:         %[[val_16:.*]] = arith.select %[[val_12]], %[[val_6]], %[[val_cst_11]] : f3257// CHECK:         %[[val_17:.*]] = arith.select %[[val_12]], %[[val_7]], %[[val_cst_23]] : f3258// CHECK:         %[[val_18:.*]] = arith.select %[[val_12]], %[[val_8]], %[[val_cst_12]] : f3259// CHECK:         %[[val_19:.*]] = arith.select %[[val_12]], %[[val_9]], %[[val_cst_24]] : f3260// CHECK:         %[[val_20:.*]] = arith.select %[[val_12]], %[[val_10]], %[[val_cst_13]] : f3261// CHECK:         %[[val_21:.*]] = arith.select %[[val_12]], %[[val_11]], %[[val_cst_25]] : f3262// CHECK:         %[[val_22:.*]] = arith.select %[[val_12]], %[[val_cst]], %[[val_cst_0]] : f3263// CHECK:         %[[val_23:.*]] = arith.cmpf ult, %[[val_2]], %[[val_cst_28]] : f3264// CHECK:         %[[val_24:.*]] = math.fma %[[val_2]], %[[val_20]], %[[val_18]] : f3265// CHECK:         %[[val_25:.*]] = math.fma %[[val_2]], %[[val_24]], %[[val_16]] : f3266// CHECK:         %[[val_26:.*]] = math.fma %[[val_2]], %[[val_25]], %[[val_14]] : f3267// CHECK:         %[[val_27:.*]] = math.fma %[[val_2]], %[[val_26]], %[[val_13]] : f3268// CHECK:         %[[val_28:.*]] = math.fma %[[val_2]], %[[val_21]], %[[val_19]] : f3269// CHECK:         %[[val_29:.*]] = math.fma %[[val_2]], %[[val_28]], %[[val_17]] : f3270// CHECK:         %[[val_30:.*]] = math.fma %[[val_2]], %[[val_29]], %[[val_15]] : f3271// CHECK:         %[[val_31:.*]] = math.fma %[[val_2]], %[[val_30]], %[[val_cst_0]] : f3272// CHECK:         %[[val_32:.*]] = arith.divf %[[val_27]], %[[val_31]] : f3273// CHECK:         %[[val_33:.*]] = arith.addf %[[val_22]], %[[val_32]] : f3274// CHECK:         %[[val_34:.*]] = arith.select %[[val_23]], %[[val_33]], %[[val_cst_0]] : f3275// CHECK:         %[[val_35:.*]] = arith.negf %[[val_34]] : f3276// CHECK:         %[[val_36:.*]] = arith.select %[[val_0]], %[[val_35]], %[[val_34]] : f3277// CHECK:         return %[[val_36]] : f3278// CHECK:       }79func.func @erf_scalar(%arg0: f32) -> f32 {80  %0 = math.erf %arg0 : f3281  return %0 : f3282}83 84// CHECK-LABEL: func @erfc_scalar(85// CHECK-SAME:    %[[val_arg0:.*]]: f32) -> f32 {86// CHECK-DAG:     %[[c127_i32:.*]] = arith.constant 127 : i3287// CHECK-DAG:     %[[c23_i32:.*]] = arith.constant 23 : i3288// CHECK-DAG:     %[[cst:.*]] = arith.constant 1.270000e+02 : f3289// CHECK-DAG:     %[[cst_0:.*]] = arith.constant -1.270000e+02 : f3290// CHECK-DAG:     %[[cst_1:.*]] = arith.constant 8.880000e+01 : f3291// CHECK-DAG:     %[[cst_2:.*]] = arith.constant -8.780000e+01 : f3292// CHECK-DAG:     %[[cst_3:.*]] = arith.constant 0.166666657 : f3293// CHECK-DAG:     %[[cst_4:.*]] = arith.constant 0.0416657962 : f3294// CHECK-DAG:     %[[cst_5:.*]] = arith.constant 0.00833345205 : f3295// CHECK-DAG:     %[[cst_6:.*]] = arith.constant 0.00139819994 : f3296// CHECK-DAG:     %[[cst_7:.*]] = arith.constant 1.98756912E-4 : f3297// CHECK-DAG:     %[[cst_8:.*]] = arith.constant 2.12194442E-4 : f3298// CHECK-DAG:     %[[cst_9:.*]] = arith.constant -0.693359375 : f3299// CHECK-DAG:     %[[cst_10:.*]] = arith.constant 1.44269502 : f32100// CHECK-DAG:     %[[cst_11:.*]] = arith.constant 0.276978403 : f32101// CHECK-DAG:     %[[cst_12:.*]] = arith.constant -0.0927639827 : f32102// CHECK-DAG:     %[[cst_13:.*]] = arith.constant -0.166031361 : f32103// CHECK-DAG:     %[[cst_14:.*]] = arith.constant 0.164055392 : f32104// CHECK-DAG:     %[[cst_15:.*]] = arith.constant -0.0542046614 : f32105// CHECK-DAG:     %[[cst_16:.*]] = arith.constant -8.059920e-03 : f32106// CHECK-DAG:     %[[cst_17:.*]] = arith.constant 0.00863227434 : f32107// CHECK-DAG:     %[[cst_18:.*]] = arith.constant 0.00131355342 : f32108// CHECK-DAG:     %[[cst_19:.*]] = arith.constant -0.0012307521 : f32109// CHECK-DAG:     %[[cst_20:.*]] = arith.constant -4.01139259E-4 : f32110// CHECK-DAG:     %[[cst_true:.*]] = arith.constant true111// CHECK-DAG:     %[[cst_21:.*]] = arith.constant 0.000000e+00 : f32112// CHECK-DAG:     %[[cst_22:.*]] = arith.constant 1.000000e+00 : f32113// CHECK-DAG:     %[[cst_23:.*]] = arith.constant 5.000000e-01 : f32114// CHECK-DAG:     %[[cst_24:.*]] = arith.constant -4.000000e+00 : f32115// CHECK-DAG:     %[[cst_25:.*]] = arith.constant -2.000000e+00 : f32116// CHECK-DAG:     %[[cst_26:.*]] = arith.constant 2.000000e+00 : f32117// CHECK-DAG:     %[[cst_27:.*]] = arith.constant 0x7F800000 : f32118// CHECK-DAG:     %[[cst_28:.*]] = arith.constant 10.0546875 : f32119// CHECK:         %[[val_2:.*]] = math.absf %[[val_arg0]] : f32120// CHECK-NEXT:    %[[val_3:.*]] = arith.addf %[[val_2]], %[[cst_26]] : f32121// CHECK-NEXT:    %[[val_4:.*]] = arith.divf %[[cst_22]], %[[val_3]] : f32122// CHECK-NEXT:    %[[val_5:.*]] = math.fma %[[cst_24]], %[[val_4]], %[[cst_22]] : f32123// CHECK-NEXT:    %[[val_6:.*]] = arith.addf %[[val_5]], %[[cst_22]] : f32124// CHECK-NEXT:    %[[val_7:.*]] = math.fma %[[val_6]], %[[cst_25]], %[[val_2]] : f32125// CHECK-NEXT:    %[[val_8:.*]] = arith.negf %[[val_2]] : f32126// CHECK-NEXT:    %[[val_9:.*]] = math.fma %[[val_8]], %[[val_5]], %[[val_7]] : f32127// CHECK-NEXT:    %[[val_10:.*]] = math.fma %[[val_4]], %[[val_9]], %[[val_5]] : f32128// CHECK-NEXT:    %[[val_11:.*]] = math.fma %[[cst_20]], %[[val_10]], %[[cst_19]] : f32129// CHECK-NEXT:    %[[val_12:.*]] = math.fma %[[val_11]], %[[val_10]], %[[cst_18]] : f32130// CHECK-NEXT:    %[[val_13:.*]] = math.fma %[[val_12]], %[[val_10]], %[[cst_17]] : f32131// CHECK-NEXT:    %[[val_14:.*]] = math.fma %[[val_13]], %[[val_10]], %[[cst_16]] : f32132// CHECK-NEXT:    %[[val_15:.*]] = math.fma %[[val_14]], %[[val_10]], %[[cst_15]] : f32133// CHECK-NEXT:    %[[val_16:.*]] = math.fma %[[val_15]], %[[val_10]], %[[cst_14]] : f32134// CHECK-NEXT:    %[[val_17:.*]] = math.fma %[[val_16]], %[[val_10]], %[[cst_13]] : f32135// CHECK-NEXT:    %[[val_18:.*]] = math.fma %[[val_17]], %[[val_10]], %[[cst_12]] : f32136// CHECK-NEXT:    %[[val_19:.*]] = math.fma %[[val_18]], %[[val_10]], %[[cst_11]] : f32137// CHECK-NEXT:    %[[val_20:.*]] = math.fma %[[cst_26]], %[[val_2]], %[[cst_22]] : f32138// CHECK-NEXT:    %[[val_21:.*]] = arith.divf %[[cst_22]], %[[val_20]] : f32139// CHECK-NEXT:    %[[val_22:.*]] = math.fma %[[val_19]], %[[val_21]], %[[val_21]] : f32140// CHECK-NEXT:    %[[val_23:.*]] = arith.negf %[[val_2]] : f32141// CHECK-NEXT:    %[[val_24:.*]] = math.fma %[[val_22]], %[[val_23]], %[[cst_23]] : f32142// CHECK-NEXT:    %[[val_25:.*]] = arith.subf %[[val_19]], %[[val_22]] : f32143// CHECK-NEXT:    %[[val_26:.*]] = math.fma %[[val_24]], %[[cst_26]], %[[val_25]] : f32144// CHECK-NEXT:    %[[val_27:.*]] = math.fma %[[val_26]], %[[val_21]], %[[val_22]] : f32145// CHECK-NEXT:    %[[val_28:.*]] = arith.mulf %[[val_2]], %[[val_2]] : f32146// CHECK-NEXT:    %[[val_29:.*]] = arith.negf %[[val_28]] : f32147// CHECK-NEXT:    %[[val_30:.*]] = arith.cmpf uge, %[[val_29]], %[[cst_2]] : f32148// CHECK-NEXT:    %[[val_31:.*]] = arith.select %[[val_30]], %[[val_29]], %[[cst_2]] : f32149// CHECK-NEXT:    %[[val_32:.*]] = arith.cmpf ule, %[[val_31]], %[[cst_1]] : f32150// CHECK-NEXT:    %[[val_33:.*]] = arith.select %[[val_32]], %[[val_31]], %[[cst_1]] : f32151// CHECK-NEXT:    %[[val_34:.*]] = math.fma %[[val_33]], %[[cst_10]], %[[cst_23]] : f32152// CHECK-NEXT:    %[[val_35:.*]] = math.floor %[[val_34]] : f32153// CHECK-NEXT:    %[[val_36:.*]] = arith.cmpf uge, %[[val_35]], %[[cst_0]] : f32154// CHECK-NEXT:    %[[val_37:.*]] = arith.select %[[val_36]], %[[val_35]], %[[cst_0]] : f32155// CHECK-NEXT:    %[[val_38:.*]] = arith.cmpf ule, %[[val_37]], %[[cst]] : f32156// CHECK-NEXT:    %[[val_39:.*]] = arith.select %[[val_38]], %[[val_37]], %[[cst]] : f32157// CHECK-NEXT:    %[[val_40:.*]] = math.fma %[[cst_9]], %[[val_39]], %[[val_33]] : f32158// CHECK-NEXT:    %[[val_41:.*]] = math.fma %[[cst_8]], %[[val_39]], %[[val_40]] : f32159// CHECK-NEXT:    %[[val_42:.*]] = math.fma %[[val_41]], %[[cst_7]], %[[cst_6]] : f32160// CHECK-NEXT:    %[[val_43:.*]] = math.fma %[[val_42]], %[[val_41]], %[[cst_5]] : f32161// CHECK-NEXT:    %[[val_44:.*]] = math.fma %[[val_43]], %[[val_41]], %[[cst_4]] : f32162// CHECK-NEXT:    %[[val_45:.*]] = math.fma %[[val_44]], %[[val_41]], %[[cst_3]] : f32163// CHECK-NEXT:    %[[val_46:.*]] = math.fma %[[val_45]], %[[val_41]], %[[cst_23]] : f32164// CHECK-NEXT:    %[[val_47:.*]] = arith.mulf %[[val_41]], %[[val_41]] : f32165// CHECK-NEXT:    %[[val_48:.*]] = math.fma %[[val_46]], %[[val_47]], %[[val_41]] : f32166// CHECK-NEXT:    %[[val_49:.*]] = arith.addf %[[val_48]], %[[cst_22]] : f32167// CHECK-NEXT:    %[[val_50:.*]] = arith.fptosi %[[val_39]] : f32 to i32168// CHECK-NEXT:    %[[val_51:.*]] = arith.addi %[[val_50]], %[[c127_i32]] : i32169// CHECK-NEXT:    %[[val_52:.*]] = arith.shli %[[val_51]], %[[c23_i32]] : i32170// CHECK-NEXT:    %[[val_53:.*]] = arith.bitcast %[[val_52]] : i32 to f32171// CHECK-NEXT:    %[[val_54:.*]] = arith.mulf %[[val_49]], %[[val_53]] : f32172// CHECK-NEXT:    %[[val_55:.*]] = arith.negf %[[val_2]] : f32173// CHECK-NEXT:    %[[val_56:.*]] = math.fma %[[val_55]], %[[val_2]], %[[val_28]] : f32174// CHECK-NEXT:    %[[val_57:.*]] = arith.mulf %[[val_27]], %[[val_54]] : f32175// CHECK-NEXT:    %[[val_58:.*]] = arith.mulf %[[val_57]], %[[val_56]] : f32176// CHECK-NEXT:    %[[val_59:.*]] = math.fma %[[val_27]], %[[val_54]], %[[val_58]] : f32177// CHECK-NEXT:    %[[val_60:.*]] = arith.cmpf olt, %[[val_2]], %[[cst_27]] : f32178// CHECK-NEXT:    %[[val_61:.*]] = arith.xori %[[val_60]], %[[cst_true]] : i1179// CHECK-NEXT:    %[[val_62:.*]] = arith.addf %[[val_arg0]], %[[val_arg0]] : f32180// CHECK-NEXT:    %[[val_63:.*]] = arith.select %[[val_61]], %[[val_62]], %[[val_59]] : f32181// CHECK-NEXT:    %[[val_64:.*]] = arith.cmpf ogt, %[[val_2]], %[[cst_28]] : f32182// CHECK-NEXT:    %[[val_65:.*]] = arith.select %[[val_64]], %[[cst_21]], %[[val_63]] : f32183// CHECK-NEXT:    %[[val_66:.*]] = arith.cmpf olt, %[[val_arg0]], %[[cst_21]] : f32184// CHECK-NEXT:    %[[val_67:.*]] = arith.subf %[[cst_26]], %[[val_65]] : f32185// CHECK-NEXT:    %[[val_68:.*]] = arith.select %[[val_66]], %[[val_67]], %[[val_65]] : f32186// CHECK-NEXT:    return %[[val_68]] : f32187// CHECK-NEXT: }188 189func.func @erfc_scalar(%arg0: f32) -> f32 {190  %0 = math.erfc %arg0 : f32191  return %0 : f32192}193 194// CHECK-LABEL:   func @erf_vector(195// CHECK-SAME:                     %[[arg0:.*]]: vector<8xf32>) -> vector<8xf32> {196// CHECK:           %[[zero:.*]] = arith.constant dense<0.000000e+00> : vector<8xf32>197// CHECK-NOT:       erf198// CHECK-COUNT-20:  select199// CHECK:           %[[res:.*]] = arith.select200// CHECK:           return %[[res]] : vector<8xf32>201// CHECK:         }202func.func @erf_vector(%arg0: vector<8xf32>) -> vector<8xf32> {203  %0 = math.erf %arg0 : vector<8xf32>204  return %0 : vector<8xf32>205}206 207// CHECK-LABEL:   func @erf_scalable_vector(208// CHECK-SAME:                     %[[arg0:.*]]: vector<[8]xf32>) -> vector<[8]xf32> {209// CHECK:           %[[zero:.*]] = arith.constant dense<0.000000e+00> : vector<[8]xf32>210// CHECK-NOT:       erf211// CHECK-NOT:       vector<8xf32>212// CHECK-COUNT-20:  select {{.*}} : vector<[8]xi1>, vector<[8]xf32>213// CHECK:           %[[res:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>214// CHECK:           return %[[res]] : vector<[8]xf32>215// CHECK:         }216func.func @erf_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {217  %0 = math.erf %arg0 : vector<[8]xf32>218  return %0 : vector<[8]xf32>219}220 221// CHECK-LABEL:   func @exp_scalar(222// CHECK-SAME:                     %[[VAL_0:.*]]: f32) -> f32 {223// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 5.000000e-01 : f32224// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32225// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 1.44269502 : f32226// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant -0.693359375 : f32227// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant 2.12194442E-4 : f32228// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 1.98756912E-4 : f32229// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 0.00139819994 : f32230// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant 0.00833345205 : f32231// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 0.0416657962 : f32232// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 0.166666657 : f32233// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant -8.780000e+01 : f32234// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 8.880000e+01 : f32235// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant -1.270000e+02 : f32236// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 1.270000e+02 : f32237// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 23 : i32238// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant 127 : i32239// CHECK-DAG:       %[[VAL_17:.*]] = arith.cmpf uge, %[[VAL_0]], %[[VAL_11]] : f32240// CHECK-DAG:       %[[VAL_18:.*]] = arith.select %[[VAL_17]], %[[VAL_0]], %[[VAL_11]] : f32241// CHECK-DAG:       %[[VAL_19:.*]] = arith.cmpf ule, %[[VAL_18]], %[[VAL_12]] : f32242// CHECK-DAG:       %[[VAL_20:.*]] = arith.select %[[VAL_19]], %[[VAL_18]], %[[VAL_12]] : f32243// CHECK-DAG:       %[[VAL_21:.*]] = math.fma %[[VAL_20]], %[[VAL_3]], %[[VAL_1]] : f32244// CHECK-DAG:       %[[VAL_22:.*]] = math.floor %[[VAL_21]] : f32245// CHECK-DAG:       %[[VAL_23:.*]] = arith.cmpf uge, %[[VAL_22]], %[[VAL_13]] : f32246// CHECK-DAG:       %[[VAL_24:.*]] = arith.select %[[VAL_23]], %[[VAL_22]], %[[VAL_13]] : f32247// CHECK-DAG:       %[[VAL_25:.*]] = arith.cmpf ule, %[[VAL_24]], %[[VAL_14]] : f32248// CHECK-DAG:       %[[VAL_26:.*]] = arith.select %[[VAL_25]], %[[VAL_24]], %[[VAL_14]] : f32249// CHECK-DAG:       %[[VAL_27:.*]] = math.fma %[[VAL_4]], %[[VAL_26]], %[[VAL_20]] : f32250// CHECK-DAG:       %[[VAL_28:.*]] = math.fma %[[VAL_5]], %[[VAL_26]], %[[VAL_27]] : f32251// CHECK-DAG:       %[[VAL_29:.*]] = math.fma %[[VAL_28]], %[[VAL_6]], %[[VAL_7]] : f32252// CHECK-DAG:       %[[VAL_30:.*]] = math.fma %[[VAL_29]], %[[VAL_28]], %[[VAL_8]] : f32253// CHECK-DAG:       %[[VAL_31:.*]] = math.fma %[[VAL_30]], %[[VAL_28]], %[[VAL_9]] : f32254// CHECK-DAG:       %[[VAL_32:.*]] = math.fma %[[VAL_31]], %[[VAL_28]], %[[VAL_10]] : f32255// CHECK-DAG:       %[[VAL_33:.*]] = math.fma %[[VAL_32]], %[[VAL_28]], %[[VAL_1]] : f32256// CHECK-DAG:       %[[VAL_34:.*]] = arith.mulf %[[VAL_28]], %[[VAL_28]] : f32257// CHECK-DAG:       %[[VAL_35:.*]] = math.fma %[[VAL_33]], %[[VAL_34]], %[[VAL_28]] : f32258// CHECK-DAG:       %[[VAL_36:.*]] = arith.addf %[[VAL_35]], %[[VAL_2]] : f32259// CHECK-DAG:       %[[VAL_37:.*]] = arith.fptosi %[[VAL_26]] : f32 to i32260// CHECK-DAG:       %[[VAL_38:.*]] = arith.addi %[[VAL_37]], %[[VAL_16]] : i32261// CHECK-DAG:       %[[VAL_39:.*]] = arith.shli %[[VAL_38]], %[[VAL_15]] : i32262// CHECK-DAG:       %[[VAL_40:.*]] = arith.bitcast %[[VAL_39]] : i32 to f32263// CHECK-DAG:       %[[VAL_41:.*]] = arith.mulf %[[VAL_36]], %[[VAL_40]] : f32264// CHECK:           return %[[VAL_41]] : f32265func.func @exp_scalar(%arg0: f32) -> f32 {266  %0 = math.exp %arg0 : f32267  return %0 : f32268}269 270// CHECK-LABEL:   func @exp_vector(271// CHECK-SAME:                     %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {272// CHECK-NOT:   math.exp273func.func @exp_vector(%arg0: vector<8xf32>) -> vector<8xf32> {274  %0 = math.exp %arg0 : vector<8xf32>275  return %0 : vector<8xf32>276}277 278// CHECK-LABEL:   func @exp_scalable_vector279// CHECK-NOT:      math.exp280// CHECK-NOT:      vector<8xf32>281// CHECK-COUNT-46: vector<[8]x{{(i32)|(f32)}}>282// CHECK-NOT:      vector<8xf32>283// CHECK-NOT:      math.exp284func.func @exp_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {285  %0 = math.exp %arg0 : vector<[8]xf32>286  return %0 : vector<[8]xf32>287}288 289// CHECK-LABEL:   func @expm1_scalar(290// CHECK-SAME:                       %[[X:.*]]: f32) -> f32 {291// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 1.000000e+00 : f32292// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant -1.000000e+00 : f32293// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 5.000000e-01 : f32294// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 1.44269502 : f32295// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant -0.693359375 : f32296// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 2.12194442E-4 : f32297// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 1.98756912E-4 : f32298// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant 0.00139819994 : f32299// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 0.00833345205 : f32300// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 0.0416657962 : f32301// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 0.166666657 : f32302// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant -8.780000e+01 : f32303// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 8.880000e+01 : f32304// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant -1.270000e+02 : f32305// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 1.270000e+02 : f32306// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant 23 : i32307// CHECK-DAG:       %[[VAL_17:.*]] = arith.constant 127 : i32308// CHECK-DAG:       %[[VAL_18:.*]] = arith.constant 0.000000e+00 : f32309// CHECK-DAG:       %[[VAL_19:.*]] = arith.constant -5.000000e-01 : f32310// CHECK-DAG:       %[[VAL_20:.*]] = arith.constant 1.17549435E-38 : f32311// CHECK-DAG:       %[[VAL_21:.*]] = arith.constant 0xFF800000 : f32312// CHECK-DAG:       %[[VAL_22:.*]] = arith.constant 0x7F800000 : f32313// CHECK-DAG:       %[[VAL_23:.*]] = arith.constant 0x7FC00000 : f32314// CHECK-DAG:       %[[VAL_24:.*]] = arith.constant 0.707106769 : f32315// CHECK-DAG:       %[[VAL_25:.*]] = arith.constant 0.0703768358 : f32316// CHECK-DAG:       %[[VAL_26:.*]] = arith.constant -0.115146101 : f32317// CHECK-DAG:       %[[VAL_27:.*]] = arith.constant 0.116769984 : f32318// CHECK-DAG:       %[[VAL_28:.*]] = arith.constant -0.12420141 : f32319// CHECK-DAG:       %[[VAL_29:.*]] = arith.constant 0.142493233 : f32320// CHECK-DAG:       %[[VAL_30:.*]] = arith.constant -0.166680574 : f32321// CHECK-DAG:       %[[VAL_31:.*]] = arith.constant 0.200007141 : f32322// CHECK-DAG:       %[[VAL_32:.*]] = arith.constant -0.24999994 : f32323// CHECK-DAG:       %[[VAL_33:.*]] = arith.constant 0.333333313 : f32324// CHECK-DAG:       %[[VAL_34:.*]] = arith.constant 1.260000e+02 : f32325// CHECK-DAG:       %[[VAL_35:.*]] = arith.constant -2139095041 : i32326// CHECK-DAG:       %[[VAL_36:.*]] = arith.constant 1056964608 : i32327// CHECK-DAG:       %[[VAL_37:.*]] = arith.constant 0.693147182 : f32328// CHECK-DAG:       %[[VAL_38:.*]] = arith.cmpf uge, %[[X]], %[[VAL_12]] : f32329// CHECK-DAG:       %[[VAL_39:.*]] = arith.select %[[VAL_38]], %[[X]], %[[VAL_12]] : f32330// CHECK-DAG:       %[[VAL_40:.*]] = arith.cmpf ule, %[[VAL_39]], %[[VAL_13]] : f32331// CHECK-DAG:       %[[VAL_41:.*]] = arith.select %[[VAL_40]], %[[VAL_39]], %[[VAL_13]] : f32332// CHECK-DAG:       %[[VAL_42:.*]] = math.fma %[[VAL_41]], %[[VAL_4]], %[[VAL_3]] : f32333// CHECK-DAG:       %[[VAL_43:.*]] = math.floor %[[VAL_42]] : f32334// CHECK-DAG:       %[[VAL_44:.*]] = arith.cmpf uge, %[[VAL_43]], %[[VAL_14]] : f32335// CHECK-DAG:       %[[VAL_45:.*]] = arith.select %[[VAL_44]], %[[VAL_43]], %[[VAL_14]] : f32336// CHECK-DAG:       %[[VAL_46:.*]] = arith.cmpf ule, %[[VAL_45]], %[[VAL_15]] : f32337// CHECK-DAG:       %[[VAL_47:.*]] = arith.select %[[VAL_46]], %[[VAL_45]], %[[VAL_15]] : f32338// CHECK-DAG:       %[[VAL_48:.*]] = math.fma %[[VAL_5]], %[[VAL_47]], %[[VAL_41]] : f32339// CHECK-DAG:       %[[VAL_49:.*]] = math.fma %[[VAL_6]], %[[VAL_47]], %[[VAL_48]] : f32340// CHECK-DAG:       %[[VAL_50:.*]] = math.fma %[[VAL_49]], %[[VAL_7]], %[[VAL_8]] : f32341// CHECK-DAG:       %[[VAL_51:.*]] = math.fma %[[VAL_50]], %[[VAL_49]], %[[VAL_9]] : f32342// CHECK-DAG:       %[[VAL_52:.*]] = math.fma %[[VAL_51]], %[[VAL_49]], %[[VAL_10]] : f32343// CHECK-DAG:       %[[VAL_53:.*]] = math.fma %[[VAL_52]], %[[VAL_49]], %[[VAL_11]] : f32344// CHECK-DAG:       %[[VAL_54:.*]] = math.fma %[[VAL_53]], %[[VAL_49]], %[[VAL_3]] : f32345// CHECK-DAG:       %[[VAL_55:.*]] = arith.mulf %[[VAL_49]], %[[VAL_49]] : f32346// CHECK-DAG:       %[[VAL_56:.*]] = math.fma %[[VAL_54]], %[[VAL_55]], %[[VAL_49]] : f32347// CHECK-DAG:       %[[VAL_57:.*]] = arith.addf %[[VAL_56]], %[[VAL_1]] : f32348// CHECK-DAG:       %[[VAL_58:.*]] = arith.fptosi %[[VAL_47]] : f32 to i32349// CHECK-DAG:       %[[VAL_59:.*]] = arith.addi %[[VAL_58]], %[[VAL_17]] : i32350// CHECK-DAG:       %[[VAL_60:.*]] = arith.shli %[[VAL_59]], %[[VAL_16]] : i32351// CHECK-DAG:       %[[VAL_61:.*]] = arith.bitcast %[[VAL_60]] : i32 to f32352// CHECK-DAG:       %[[VAL_62:.*]] = arith.mulf %[[VAL_57]], %[[VAL_61]] : f32353// CHECK-DAG:       %[[VAL_63:.*]] = arith.cmpf ueq, %[[VAL_62]], %[[VAL_1]] : f32354// CHECK-DAG:       %[[VAL_64:.*]] = arith.subf %[[VAL_62]], %[[VAL_1]] : f32355// CHECK-DAG:       %[[VAL_65:.*]] = arith.cmpf oeq, %[[VAL_64]], %[[VAL_2]] : f32356// CHECK-DAG:       %[[VAL_66:.*]] = arith.cmpf ugt, %[[VAL_62]], %[[VAL_20]] : f32357// CHECK-DAG:       %[[VAL_67:.*]] = arith.select %[[VAL_66]], %[[VAL_62]], %[[VAL_20]] : f32358// CHECK-DAG:       %[[VAL_68:.*]] = arith.bitcast %[[VAL_67]] : f32 to i32359// CHECK-DAG:       %[[VAL_69:.*]] = arith.andi %[[VAL_68]], %[[VAL_35]] : i32360// CHECK-DAG:       %[[VAL_70:.*]] = arith.ori %[[VAL_69]], %[[VAL_36]] : i32361// CHECK-DAG:       %[[VAL_71:.*]] = arith.bitcast %[[VAL_70]] : i32 to f32362// CHECK-DAG:       %[[VAL_72:.*]] = arith.bitcast %[[VAL_67]] : f32 to i32363// CHECK-DAG:       %[[VAL_73:.*]] = arith.shrui %[[VAL_72]], %[[VAL_16]] : i32364// CHECK-DAG:       %[[VAL_74:.*]] = arith.sitofp %[[VAL_73]] : i32 to f32365// CHECK-DAG:       %[[VAL_75:.*]] = arith.subf %[[VAL_74]], %[[VAL_34]] : f32366// CHECK-DAG:       %[[VAL_76:.*]] = arith.cmpf olt, %[[VAL_71]], %[[VAL_24]] : f32367// CHECK-DAG:       %[[VAL_77:.*]] = arith.select %[[VAL_76]], %[[VAL_71]], %[[VAL_18]] : f32368// CHECK-DAG:       %[[VAL_78:.*]] = arith.subf %[[VAL_71]], %[[VAL_1]] : f32369// CHECK-DAG:       %[[VAL_79:.*]] = arith.select %[[VAL_76]], %[[VAL_1]], %[[VAL_18]] : f32370// CHECK-DAG:       %[[VAL_80:.*]] = arith.subf %[[VAL_75]], %[[VAL_79]] : f32371// CHECK-DAG:       %[[VAL_81:.*]] = arith.addf %[[VAL_78]], %[[VAL_77]] : f32372// CHECK-DAG:       %[[VAL_82:.*]] = arith.mulf %[[VAL_81]], %[[VAL_81]] : f32373// CHECK-DAG:       %[[VAL_83:.*]] = arith.mulf %[[VAL_82]], %[[VAL_81]] : f32374// CHECK-DAG:       %[[VAL_84:.*]] = math.fma %[[VAL_25]], %[[VAL_81]], %[[VAL_26]] : f32375// CHECK-DAG:       %[[VAL_85:.*]] = math.fma %[[VAL_28]], %[[VAL_81]], %[[VAL_29]] : f32376// CHECK-DAG:       %[[VAL_86:.*]] = math.fma %[[VAL_31]], %[[VAL_81]], %[[VAL_32]] : f32377// CHECK-DAG:       %[[VAL_87:.*]] = math.fma %[[VAL_84]], %[[VAL_81]], %[[VAL_27]] : f32378// CHECK-DAG:       %[[VAL_88:.*]] = math.fma %[[VAL_85]], %[[VAL_81]], %[[VAL_30]] : f32379// CHECK-DAG:       %[[VAL_89:.*]] = math.fma %[[VAL_86]], %[[VAL_81]], %[[VAL_33]] : f32380// CHECK-DAG:       %[[VAL_90:.*]] = math.fma %[[VAL_87]], %[[VAL_83]], %[[VAL_88]] : f32381// CHECK-DAG:       %[[VAL_91:.*]] = math.fma %[[VAL_90]], %[[VAL_83]], %[[VAL_89]] : f32382// CHECK-DAG:       %[[VAL_92:.*]] = arith.mulf %[[VAL_91]], %[[VAL_83]] : f32383// CHECK-DAG:       %[[VAL_93:.*]] = math.fma %[[VAL_19]], %[[VAL_82]], %[[VAL_92]] : f32384// CHECK-DAG:       %[[VAL_94:.*]] = arith.addf %[[VAL_81]], %[[VAL_93]] : f32385// CHECK-DAG:       %[[VAL_95:.*]] = math.fma %[[VAL_80]], %[[VAL_37]], %[[VAL_94]] : f32386// CHECK-DAG:       %[[VAL_96:.*]] = arith.cmpf ult, %[[VAL_62]], %[[VAL_18]] : f32387// CHECK-DAG:       %[[VAL_97:.*]] = arith.cmpf oeq, %[[VAL_62]], %[[VAL_18]] : f32388// CHECK-DAG:       %[[VAL_98:.*]] = arith.cmpf oeq, %[[VAL_62]], %[[VAL_22]] : f32389// CHECK-DAG:       %[[VAL_99:.*]] = arith.select %[[VAL_98]], %[[VAL_22]], %[[VAL_95]] : f32390// CHECK-DAG:       %[[VAL_100:.*]] = arith.select %[[VAL_96]], %[[VAL_23]], %[[VAL_99]] : f32391// CHECK-DAG:       %[[VAL_101:.*]] = arith.select %[[VAL_97]], %[[VAL_21]], %[[VAL_100]] : f32392// CHECK-DAG:       %[[VAL_102:.*]] = arith.cmpf oeq, %[[VAL_101]], %[[VAL_62]] : f32393// CHECK-DAG:       %[[VAL_103:.*]] = arith.divf %[[X]], %[[VAL_101]] : f32394// CHECK-DAG:       %[[VAL_104:.*]] = arith.mulf %[[VAL_64]], %[[VAL_103]] : f32395// CHECK-DAG:       %[[VAL_105:.*]] = arith.select %[[VAL_102]], %[[VAL_62]], %[[VAL_104]] : f32396// CHECK-DAG:       %[[VAL_106:.*]] = arith.select %[[VAL_65]], %[[VAL_2]], %[[VAL_105]] : f32397// CHECK-DAG:       %[[VAL_107:.*]] = arith.select %[[VAL_63]], %[[X]], %[[VAL_106]] : f32398// CHECK-DAG:       return %[[VAL_107]] : f32399// CHECK:         }400func.func @expm1_scalar(%arg0: f32) -> f32 {401  %0 = math.expm1 %arg0 : f32402  return %0 : f32403}404 405// CHECK-LABEL:   func @expm1_vector(406// CHECK-SAME:                       %[[VAL_0:.*]]: vector<8x8xf32>) -> vector<8x8xf32> {407// CHECK-NOT:       exp408// CHECK-NOT:       log409// CHECK-NOT:       expm1410func.func @expm1_vector(%arg0: vector<8x8xf32>) -> vector<8x8xf32> {411  %0 = math.expm1 %arg0 : vector<8x8xf32>412  return %0 : vector<8x8xf32>413}414 415// CHECK-LABEL:   func @expm1_scalable_vector(416// CHECK-SAME:                       %{{.*}}: vector<8x[8]xf32>) -> vector<8x[8]xf32> {417// CHECK-NOT:       vector<8x8xf32>418// CHECK-NOT:       exp419// CHECK-NOT:       log420// CHECK-NOT:       expm1421// CHECK-COUNT-127: vector<8x[8]x{{(i32)|(f32)|(i1)}}>422// CHECK-NOT:       vector<8x8xf32>423// CHECK-NOT:       exp424// CHECK-NOT:       log425// CHECK-NOT:       expm1426func.func @expm1_scalable_vector(%arg0: vector<8x[8]xf32>) -> vector<8x[8]xf32> {427  %0 = math.expm1 %arg0 : vector<8x[8]xf32>428  return %0 : vector<8x[8]xf32>429}430 431// CHECK-LABEL:   func @log_scalar(432// CHECK-SAME:                             %[[X:.*]]: f32) -> f32 {433// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 0.000000e+00 : f32434// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32435// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant -5.000000e-01 : f32436// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 1.17549435E-38 : f32437// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant 0xFF800000 : f32438// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 0x7F800000 : f32439// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 0x7FC00000 : f32440// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant 0.707106769 : f32441// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 0.0703768358 : f32442// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant -0.115146101 : f32443// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 0.116769984 : f32444// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant -0.12420141 : f32445// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 0.142493233 : f32446// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant -0.166680574 : f32447// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 0.200007141 : f32448// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant -0.24999994 : f32449// CHECK-DAG:       %[[VAL_17:.*]] = arith.constant 0.333333313 : f32450// CHECK-DAG:       %[[VAL_18:.*]] = arith.constant 1.260000e+02 : f32451// CHECK-DAG:       %[[VAL_19:.*]] = arith.constant -2139095041 : i32452// CHECK-DAG:       %[[VAL_20:.*]] = arith.constant 1056964608 : i32453// CHECK-DAG:       %[[VAL_21:.*]] = arith.constant 23 : i32454// CHECK-DAG:       %[[VAL_22:.*]] = arith.constant 0.693147182 : f32455// CHECK:           %[[VAL_23:.*]] = arith.cmpf ugt, %[[X]], %[[VAL_4]] : f32456// CHECK:           %[[VAL_24:.*]] = arith.select %[[VAL_23]], %[[X]], %[[VAL_4]] : f32457// CHECK-NOT:       frexp458// CHECK:           %[[VAL_25:.*]] = arith.bitcast %[[VAL_24]] : f32 to i32459// CHECK:           %[[VAL_26:.*]] = arith.andi %[[VAL_25]], %[[VAL_19]] : i32460// CHECK:           %[[VAL_27:.*]] = arith.ori %[[VAL_26]], %[[VAL_20]] : i32461// CHECK:           %[[VAL_28:.*]] = arith.bitcast %[[VAL_27]] : i32 to f32462// CHECK:           %[[VAL_29:.*]] = arith.bitcast %[[VAL_24]] : f32 to i32463// CHECK:           %[[VAL_30:.*]] = arith.shrui %[[VAL_29]], %[[VAL_21]] : i32464// CHECK:           %[[VAL_31:.*]] = arith.sitofp %[[VAL_30]] : i32 to f32465// CHECK:           %[[VAL_32:.*]] = arith.subf %[[VAL_31]], %[[VAL_18]] : f32466// CHECK:           %[[VAL_33:.*]] = arith.cmpf olt, %[[VAL_28]], %[[VAL_8]] : f32467// CHECK:           %[[VAL_34:.*]] = arith.select %[[VAL_33]], %[[VAL_28]], %[[VAL_1]] : f32468// CHECK:           %[[VAL_35:.*]] = arith.subf %[[VAL_28]], %[[VAL_2]] : f32469// CHECK:           %[[VAL_36:.*]] = arith.select %[[VAL_33]], %[[VAL_2]], %[[VAL_1]] : f32470// CHECK:           %[[VAL_37:.*]] = arith.subf %[[VAL_32]], %[[VAL_36]] : f32471// CHECK:           %[[VAL_38:.*]] = arith.addf %[[VAL_35]], %[[VAL_34]] : f32472// CHECK:           %[[VAL_39:.*]] = arith.mulf %[[VAL_38]], %[[VAL_38]] : f32473// CHECK:           %[[VAL_40:.*]] = arith.mulf %[[VAL_39]], %[[VAL_38]] : f32474// CHECK:           %[[VAL_41:.*]] = math.fma %[[VAL_9]], %[[VAL_38]], %[[VAL_10]] : f32475// CHECK:           %[[VAL_42:.*]] = math.fma %[[VAL_12]], %[[VAL_38]], %[[VAL_13]] : f32476// CHECK:           %[[VAL_43:.*]] = math.fma %[[VAL_15]], %[[VAL_38]], %[[VAL_16]] : f32477// CHECK:           %[[VAL_44:.*]] = math.fma %[[VAL_41]], %[[VAL_38]], %[[VAL_11]] : f32478// CHECK:           %[[VAL_45:.*]] = math.fma %[[VAL_42]], %[[VAL_38]], %[[VAL_14]] : f32479// CHECK:           %[[VAL_46:.*]] = math.fma %[[VAL_43]], %[[VAL_38]], %[[VAL_17]] : f32480// CHECK:           %[[VAL_47:.*]] = math.fma %[[VAL_44]], %[[VAL_40]], %[[VAL_45]] : f32481// CHECK:           %[[VAL_48:.*]] = math.fma %[[VAL_47]], %[[VAL_40]], %[[VAL_46]] : f32482// CHECK:           %[[VAL_49:.*]] = arith.mulf %[[VAL_48]], %[[VAL_40]] : f32483// CHECK:           %[[VAL_50:.*]] = math.fma %[[VAL_3]], %[[VAL_39]], %[[VAL_49]] : f32484// CHECK:           %[[VAL_51:.*]] = arith.addf %[[VAL_38]], %[[VAL_50]] : f32485// CHECK:           %[[VAL_52:.*]] = math.fma %[[VAL_37]], %[[VAL_22]], %[[VAL_51]] : f32486// CHECK:           %[[VAL_53:.*]] = arith.cmpf ult, %[[X]], %[[VAL_1]] : f32487// CHECK:           %[[VAL_54:.*]] = arith.cmpf oeq, %[[X]], %[[VAL_1]] : f32488// CHECK:           %[[VAL_55:.*]] = arith.cmpf oeq, %[[X]], %[[VAL_6]] : f32489// CHECK:           %[[VAL_56:.*]] = arith.select %[[VAL_55]], %[[VAL_6]], %[[VAL_52]] : f32490// CHECK:           %[[VAL_57:.*]] = arith.select %[[VAL_53]], %[[VAL_7]], %[[VAL_56]] : f32491// CHECK:           %[[VAL_58:.*]] = arith.select %[[VAL_54]], %[[VAL_5]], %[[VAL_57]] : f32492// CHECK:           return %[[VAL_58]] : f32493// CHECK:         }494func.func @log_scalar(%arg0: f32) -> f32 {495  %0 = math.log %arg0 : f32496  return %0 : f32497}498 499// CHECK-LABEL:   func @log_vector(500// CHECK-SAME:                     %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {501// CHECK:           %[[CST_LN2:.*]] = arith.constant dense<0.693147182> : vector<8xf32>502// CHECK-COUNT-5:   select503// CHECK:           %[[VAL_71:.*]] = arith.select504// CHECK:           return %[[VAL_71]] : vector<8xf32>505// CHECK:         }506func.func @log_vector(%arg0: vector<8xf32>) -> vector<8xf32> {507  %0 = math.log %arg0 : vector<8xf32>508  return %0 : vector<8xf32>509}510 511// CHECK-LABEL:   func @log_scalable_vector(512// CHECK-SAME:                     %{{.*}}: vector<[8]xf32>) -> vector<[8]xf32> {513// CHECK:           %[[CST_LN2:.*]] = arith.constant dense<0.693147182> : vector<[8]xf32>514// CHECK-COUNT-5:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>515// CHECK:           %[[VAL_71:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>516// CHECK:           return %[[VAL_71]] : vector<[8]xf32>517// CHECK:         }518func.func @log_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {519  %0 = math.log %arg0 : vector<[8]xf32>520  return %0 : vector<[8]xf32>521}522 523// CHECK-LABEL:   func @log2_scalar(524// CHECK-SAME:                      %[[VAL_0:.*]]: f32) -> f32 {525// CHECK:           %[[CST_LOG2E:.*]] = arith.constant 1.44269502 : f32526// CHECK-COUNT-5:   select527// CHECK:           %[[VAL_65:.*]] = arith.select528// CHECK:           return %[[VAL_65]] : f32529// CHECK:         }530func.func @log2_scalar(%arg0: f32) -> f32 {531  %0 = math.log2 %arg0 : f32532  return %0 : f32533}534 535// CHECK-LABEL:   func @log2_vector(536// CHECK-SAME:                      %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {537// CHECK:           %[[CST_LOG2E:.*]] = arith.constant dense<1.44269502> : vector<8xf32>538// CHECK-COUNT-5:   select539// CHECK:           %[[VAL_71:.*]] = arith.select540// CHECK:           return %[[VAL_71]] : vector<8xf32>541// CHECK:         }542func.func @log2_vector(%arg0: vector<8xf32>) -> vector<8xf32> {543  %0 = math.log2 %arg0 : vector<8xf32>544  return %0 : vector<8xf32>545}546 547// CHECK-LABEL:   func @log2_scalable_vector(548// CHECK-SAME:                      %{{.*}}: vector<[8]xf32>) -> vector<[8]xf32> {549// CHECK:           %[[CST_LOG2E:.*]] = arith.constant dense<1.44269502> : vector<[8]xf32>550// CHECK-COUNT-5:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>551// CHECK:           %[[VAL_71:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>552// CHECK:           return %[[VAL_71]] : vector<[8]xf32>553// CHECK:         }554func.func @log2_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {555  %0 = math.log2 %arg0 : vector<[8]xf32>556  return %0 : vector<[8]xf32>557}558 559// CHECK-LABEL:   func @log1p_scalar(560// CHECK-SAME:                       %[[X:.*]]: f32) -> f32 {561// CHECK:           %[[CST_ONE:.*]] = arith.constant 1.000000e+00 : f32562// CHECK:           %[[U:.*]] = arith.addf %[[X]], %[[CST_ONE]] : f32563// CHECK:           %[[U_SMALL:.*]] = arith.cmpf oeq, %[[U]], %[[CST_ONE]] : f32564// CHECK-NOT:       log565// CHECK-COUNT-5:   select566// CHECK:           %[[LOG_U:.*]] = arith.select567// CHECK:           %[[U_INF:.*]] = arith.cmpf oeq, %[[U]], %[[LOG_U]] : f32568// CHECK:           %[[VAL_69:.*]] = arith.subf %[[U]], %[[CST_ONE]] : f32569// CHECK:           %[[VAL_70:.*]] = arith.divf %[[LOG_U]], %[[VAL_69]] : f32570// CHECK:           %[[LOG_LARGE:.*]] = arith.mulf %[[X]], %[[VAL_70]] : f32571// CHECK:           %[[VAL_72:.*]] = arith.ori %[[U_SMALL]], %[[U_INF]]  : i1572// CHECK:           %[[APPROX:.*]] = arith.select %[[VAL_72]], %[[X]], %[[LOG_LARGE]] : f32573// CHECK:           return %[[APPROX]] : f32574// CHECK:         }575func.func @log1p_scalar(%arg0: f32) -> f32 {576  %0 = math.log1p %arg0 : f32577  return %0 : f32578}579 580// CHECK-LABEL:   func @log1p_vector(581// CHECK-SAME:                       %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {582// CHECK:           %[[CST_ONE:.*]] = arith.constant dense<1.000000e+00> : vector<8xf32>583// CHECK-COUNT-6:   select584// CHECK:           %[[VAL_79:.*]] = arith.select585// CHECK:           return %[[VAL_79]] : vector<8xf32>586// CHECK:         }587func.func @log1p_vector(%arg0: vector<8xf32>) -> vector<8xf32> {588  %0 = math.log1p %arg0 : vector<8xf32>589  return %0 : vector<8xf32>590}591 592// CHECK-LABEL:   func @log1p_scalable_vector(593// CHECK-SAME:                       %[[VAL_0:.*]]: vector<[8]xf32>) -> vector<[8]xf32> {594// CHECK:           %[[CST_ONE:.*]] = arith.constant dense<1.000000e+00> : vector<[8]xf32>595// CHECK-COUNT-6:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>596// CHECK:           %[[VAL_79:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>597// CHECK:           return %[[VAL_79]] : vector<[8]xf32>598// CHECK:         }599func.func @log1p_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {600  %0 = math.log1p %arg0 : vector<[8]xf32>601  return %0 : vector<[8]xf32>602}603 604// CHECK-LABEL:   func @tanh_scalar(605// CHECK-SAME:                      %[[VAL_0:.*]]: f32) -> f32 {606// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant -7.99881172 : f32607// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 7.99881172 : f32608// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 4.000000e-04 : f32609// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 0.00489352457 : f32610// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant 6.37261954E-4 : f32611// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant 1.48572235E-5 : f32612// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant 5.12229725E-8 : f32613// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant -8.60467184E-11 : f32614// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 2.00018794E-13 : f32615// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant -2.76076837E-16 : f32616// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 0.00489352504 : f32617// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 0.00226843474 : f32618// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 1.18534706E-4 : f32619// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 1.19825836E-6 : f32620// CHECK:           %[[VAL_15:.*]] = arith.cmpf ult, %[[VAL_0]], %[[VAL_2]] : f32621// CHECK:           %[[VAL_16:.*]] = arith.select %[[VAL_15]], %[[VAL_0]], %[[VAL_2]] : f32622// CHECK:           %[[VAL_17:.*]] = arith.cmpf ugt, %[[VAL_16]], %[[VAL_1]] : f32623// CHECK:           %[[VAL_18:.*]] = arith.select %[[VAL_17]], %[[VAL_16]], %[[VAL_1]] : f32624// CHECK:           %[[VAL_19:.*]] = math.absf %[[VAL_0]] : f32625// CHECK:           %[[VAL_20:.*]] = arith.cmpf olt, %[[VAL_19]], %[[VAL_3]] : f32626// CHECK:           %[[VAL_21:.*]] = arith.mulf %[[VAL_18]], %[[VAL_18]] : f32627// CHECK:           %[[VAL_22:.*]] = math.fma %[[VAL_21]], %[[VAL_10]], %[[VAL_9]] : f32628// CHECK:           %[[VAL_23:.*]] = math.fma %[[VAL_21]], %[[VAL_22]], %[[VAL_8]] : f32629// CHECK:           %[[VAL_24:.*]] = math.fma %[[VAL_21]], %[[VAL_23]], %[[VAL_7]] : f32630// CHECK:           %[[VAL_25:.*]] = math.fma %[[VAL_21]], %[[VAL_24]], %[[VAL_6]] : f32631// CHECK:           %[[VAL_26:.*]] = math.fma %[[VAL_21]], %[[VAL_25]], %[[VAL_5]] : f32632// CHECK:           %[[VAL_27:.*]] = math.fma %[[VAL_21]], %[[VAL_26]], %[[VAL_4]] : f32633// CHECK:           %[[VAL_28:.*]] = arith.mulf %[[VAL_18]], %[[VAL_27]] : f32634// CHECK:           %[[VAL_29:.*]] = math.fma %[[VAL_21]], %[[VAL_14]], %[[VAL_13]] : f32635// CHECK:           %[[VAL_30:.*]] = math.fma %[[VAL_21]], %[[VAL_29]], %[[VAL_12]] : f32636// CHECK:           %[[VAL_31:.*]] = math.fma %[[VAL_21]], %[[VAL_30]], %[[VAL_11]] : f32637// CHECK:           %[[VAL_32:.*]] = arith.divf %[[VAL_28]], %[[VAL_31]] : f32638// CHECK:           %[[VAL_33:.*]] = arith.select %[[VAL_20]], %[[VAL_18]], %[[VAL_32]] : f32639// CHECK:           return %[[VAL_33]] : f32640// CHECK:         }641func.func @tanh_scalar(%arg0: f32) -> f32 {642  %0 = math.tanh %arg0 : f32643  return %0 : f32644}645 646// CHECK-LABEL:   func @tanh_vector(647// CHECK-SAME:                      %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {648// CHECK:           %[[VAL_1:.*]] = arith.constant dense<-7.99881172> : vector<8xf32>649// CHECK-NOT:       tanh650// CHECK-COUNT-2:   select651// CHECK:           %[[VAL_33:.*]] = arith.select652// CHECK:           return %[[VAL_33]] : vector<8xf32>653// CHECK:         }654func.func @tanh_vector(%arg0: vector<8xf32>) -> vector<8xf32> {655  %0 = math.tanh %arg0 : vector<8xf32>656  return %0 : vector<8xf32>657}658 659// CHECK-LABEL:   func @tanh_scalable_vector(660// CHECK-SAME:                      %[[VAL_0:.*]]: vector<[8]xf32>) -> vector<[8]xf32> {661// CHECK:           %[[VAL_1:.*]] = arith.constant dense<-7.99881172> : vector<[8]xf32>662// CHECK-NOT:       tanh663// CHECK-COUNT-2:   select {{.*}} : vector<[8]xi1>, vector<[8]xf32>664// CHECK:           %[[VAL_33:.*]] = arith.select {{.*}} : vector<[8]xi1>, vector<[8]xf32>665// CHECK:           return %[[VAL_33]] : vector<[8]xf32>666// CHECK:         }667func.func @tanh_scalable_vector(%arg0: vector<[8]xf32>) -> vector<[8]xf32> {668  %0 = math.tanh %arg0 : vector<[8]xf32>669  return %0 : vector<[8]xf32>670}671 672// We only approximate rsqrt for vectors and when the AVX2 option is enabled.673// CHECK-LABEL:   func @rsqrt_scalar674// AVX2-LABEL:    func @rsqrt_scalar675// CHECK:           math.rsqrt676// AVX2:            math.rsqrt677func.func @rsqrt_scalar(%arg0: f32) -> f32 {678  %0 = math.rsqrt %arg0 : f32679  return %0 : f32680}681 682// CHECK-LABEL:   func @rsqrt_vector_8xf32683// CHECK:           math.rsqrt684// AVX2-LABEL:    func @rsqrt_vector_8xf32(685// AVX2-SAME:       %[[VAL_0:.*]]: vector<8xf32>) -> vector<8xf32> {686// AVX2:   %[[VAL_1:.*]] = arith.constant dense<0x7F800000> : vector<8xf32>687// AVX2:   %[[VAL_2:.*]] = arith.constant dense<1.500000e+00> : vector<8xf32>688// AVX2:   %[[VAL_3:.*]] = arith.constant dense<-5.000000e-01> : vector<8xf32>689// AVX2:   %[[VAL_4:.*]] = arith.constant dense<1.17549435E-38> : vector<8xf32>690// AVX2:   %[[VAL_5:.*]] = arith.mulf %[[VAL_0]], %[[VAL_3]] : vector<8xf32>691// AVX2:   %[[VAL_6:.*]] = arith.cmpf olt, %[[VAL_0]], %[[VAL_4]] : vector<8xf32>692// AVX2:   %[[VAL_7:.*]] = arith.cmpf oeq, %[[VAL_0]], %[[VAL_1]] : vector<8xf32>693// AVX2:   %[[VAL_8:.*]] = arith.ori %[[VAL_6]], %[[VAL_7]] : vector<8xi1>694// AVX2:   %[[VAL_9:.*]] = x86vector.avx.rsqrt %[[VAL_0]] : vector<8xf32>695// AVX2:   %[[VAL_10:.*]] = arith.mulf %[[VAL_5]], %[[VAL_9]] : vector<8xf32>696// AVX2:   %[[VAL_11:.*]] = math.fma %[[VAL_9]], %[[VAL_10]], %[[VAL_2]] : vector<8xf32>697// AVX2:   %[[VAL_12:.*]] = arith.mulf %[[VAL_9]], %[[VAL_11]] : vector<8xf32>698// AVX2:   %[[VAL_13:.*]] = arith.select %[[VAL_8]], %[[VAL_9]], %[[VAL_12]] : vector<8xi1>, vector<8xf32>699// AVX2:   return %[[VAL_13]] : vector<8xf32>700// AVX2: }701func.func @rsqrt_vector_8xf32(%arg0: vector<8xf32>) -> vector<8xf32> {702  %0 = math.rsqrt %arg0 : vector<8xf32>703  return %0 : vector<8xf32>704}705 706// Virtual vector width is not a multiple of an AVX2 vector width.707//708// CHECK-LABEL:  func @rsqrt_vector_5xf32709// CHECK:          math.rsqrt710// AVX2-LABEL:   func @rsqrt_vector_5xf32711// AVX2:           math.rsqrt712func.func @rsqrt_vector_5xf32(%arg0: vector<5xf32>) -> vector<5xf32> {713  %0 = math.rsqrt %arg0 : vector<5xf32>714  return %0 : vector<5xf32>715}716 717// One dimensional virtual vector expanded and unrolled into multiple AVX2-sized718// vectors.719//720// CHECK-LABEL: func @rsqrt_vector_16xf32721// CHECK:         math.rsqrt722// AVX2-LABEL:  func @rsqrt_vector_16xf32(723// AVX2-SAME:     %[[ARG:.*]]: vector<16xf32>724// AVX2-SAME:   ) -> vector<16xf32>725// AVX2:          %[[INIT:.*]] = arith.constant dense<0.000000e+00> : vector<2x8xf32>726// AVX2:          %[[EXPAND:.*]] = vector.shape_cast %[[ARG]] : vector<16xf32> to vector<2x8xf32>727// AVX2:          %[[VEC0:.*]] = vector.extract %[[EXPAND]][0]728// AVX2:          %[[RSQRT0:.*]] = x86vector.avx.rsqrt %[[VEC0]]729// AVX2:          %[[VEC1:.*]] = vector.extract %[[EXPAND]][1]730// AVX2:          %[[RSQRT1:.*]] = x86vector.avx.rsqrt %[[VEC1]]731// AVX2:          %[[RESULT0:.*]] = vector.insert %[[RSQRT0]], %[[INIT]] [0]732// AVX2:          %[[RESULT1:.*]] = vector.insert %[[RSQRT1]], %[[RESULT0]] [1]733// AVX2:          %[[RSQRT:.*]] = vector.shape_cast %[[RESULT1]] : vector<2x8xf32> to vector<16xf32>734func.func @rsqrt_vector_16xf32(%arg0: vector<16xf32>) -> vector<16xf32> {735  %0 = math.rsqrt %arg0 : vector<16xf32>736  return %0 : vector<16xf32>737}738 739// Two dimensional virtual vector unrolled into multiple AVX2-sized vectors.740//741// CHECK-LABEL: func @rsqrt_vector_2x8xf32742// CHECK:         math.rsqrt743// AVX2-LABEL:  func @rsqrt_vector_2x8xf32(744// AVX2-SAME:     %[[ARG:.*]]: vector<2x8xf32>745// AVX2-SAME:   ) -> vector<2x8xf32>746// AVX2:          %[[INIT:.*]] = arith.constant dense<0.000000e+00> : vector<2x8xf32>747// AVX2-NOT:      vector.shape_cast748// AVX2:          %[[VEC0:.*]] = vector.extract %[[ARG]][0]749// AVX2:          %[[RSQRT0:.*]] = x86vector.avx.rsqrt %[[VEC0]]750// AVX2:          %[[VEC1:.*]] = vector.extract %[[ARG]][1]751// AVX2:          %[[RSQRT1:.*]] = x86vector.avx.rsqrt %[[VEC1]]752// AVX2:          %[[RESULT0:.*]] = vector.insert %[[RSQRT0]], %[[INIT]] [0]753// AVX2:          %[[RESULT1:.*]] = vector.insert %[[RSQRT1]], %[[RESULT0]] [1]754// AVX2-NOT:      vector.shape_cast755func.func @rsqrt_vector_2x8xf32(%arg0: vector<2x8xf32>) -> vector<2x8xf32> {756  %0 = math.rsqrt %arg0 : vector<2x8xf32>757  return %0 : vector<2x8xf32>758}759 760// Two dimensional virtual vector expanded and unrolled into multiple AVX2-sized761// vectors.762//763// CHECK-LABEL: func @rsqrt_vector_2x16xf32764// CHECK:         math.rsqrt765// AVX2-LABEL:  func @rsqrt_vector_2x16xf32(766// AVX2-SAME:     %[[ARG:.*]]: vector<2x16xf32>767// AVX2-SAME:   ) -> vector<2x16xf32>768// AVX2:          %[[INIT:.*]] = arith.constant dense<0.000000e+00> : vector<2x2x8xf32>769// AVX2:          %[[EXPAND:.*]] = vector.shape_cast %[[ARG]] : vector<2x16xf32> to vector<2x2x8xf32>770// AVX2:          %[[VEC00:.*]] = vector.extract %[[EXPAND]][0, 0]771// AVX2:          %[[RSQRT00:.*]] = x86vector.avx.rsqrt %[[VEC00]]772// AVX2:          %[[VEC01:.*]] = vector.extract %[[EXPAND]][0, 1]773// AVX2:          %[[RSQRT01:.*]] = x86vector.avx.rsqrt %[[VEC01]]774// AVX2:          %[[VEC10:.*]] = vector.extract %[[EXPAND]][1, 0]775// AVX2:          %[[RSQRT10:.*]] = x86vector.avx.rsqrt %[[VEC10]]776// AVX2:          %[[VEC11:.*]] = vector.extract %[[EXPAND]][1, 1]777// AVX2:          %[[RSQRT11:.*]] = x86vector.avx.rsqrt %[[VEC11]]778// AVX2:          %[[RESULT0:.*]] = vector.insert %[[RSQRT00]], %[[INIT]] [0, 0]779// AVX2:          %[[RESULT1:.*]] = vector.insert %[[RSQRT01]], %[[RESULT0]] [0, 1]780// AVX2:          %[[RESULT2:.*]] = vector.insert %[[RSQRT10]], %[[RESULT1]] [1, 0]781// AVX2:          %[[RESULT3:.*]] = vector.insert %[[RSQRT11]], %[[RESULT2]] [1, 1]782// AVX2:          %[[RSQRT:.*]] = vector.shape_cast %[[RESULT3]] : vector<2x2x8xf32> to vector<2x16xf32>783func.func @rsqrt_vector_2x16xf32(%arg0: vector<2x16xf32>) -> vector<2x16xf32> {784  %0 = math.rsqrt %arg0 : vector<2x16xf32>785  return %0 : vector<2x16xf32>786}787 788// CHECK-LABEL: @atan_scalar789// CHECK-SAME:      %[[VAL_0:.*]]: f32) -> f32 {790// CHECK-DAG:       %[[VAL_1:.*]] = arith.constant 1.000000e+00 : f32791// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 6.600000e-01 : f32792// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 2.41421366 : f32793// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant -0.875060856 : f32794// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant -16.1575375 : f32795// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant -75.0085601 : f32796// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant -122.886665 : f32797// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant -64.8502197 : f32798// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant 24.8584652 : f32799// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 165.027008 : f32800// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 432.881073 : f32801// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 485.390411 : f32802// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 194.550659 : f32803// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 0.785398185 : f32804// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 1.57079637 : f32805// CHECK-DAG:       %[[VAL_16:.*]] = math.absf %[[VAL_0]] : f32806// CHECK-DAG:       %[[VAL_17:.*]] = arith.cmpf ogt, %[[VAL_16]], %[[VAL_2]] : f32807// CHECK-DAG:       %[[VAL_18:.*]] = arith.addf %[[VAL_16]], %[[VAL_1]] : f32808// CHECK-DAG:       %[[VAL_19:.*]] = arith.subf %[[VAL_16]], %[[VAL_1]] : f32809// CHECK-DAG:       %[[VAL_20:.*]] = arith.select %[[VAL_17]], %[[VAL_19]], %[[VAL_16]] : f32810// CHECK-DAG:       %[[VAL_21:.*]] = arith.select %[[VAL_17]], %[[VAL_18]], %[[VAL_1]] : f32811// CHECK-DAG:       %[[VAL_22:.*]] = arith.cmpf ogt, %[[VAL_16]], %[[VAL_3]] : f32812// CHECK-DAG:       %[[VAL_23:.*]] = arith.select %[[VAL_22]], %[[VAL_1]], %[[VAL_20]] : f32813// CHECK-DAG:       %[[VAL_24:.*]] = arith.select %[[VAL_22]], %[[VAL_16]], %[[VAL_21]] : f32814// CHECK-DAG:       %[[VAL_25:.*]] = arith.divf %[[VAL_23]], %[[VAL_24]] : f32815// CHECK-DAG:       %[[VAL_26:.*]] = arith.mulf %[[VAL_25]], %[[VAL_25]] : f32816// CHECK-DAG:       %[[VAL_27:.*]] = math.fma %[[VAL_26]], %[[VAL_4]], %[[VAL_5]] : f32817// CHECK-DAG:       %[[VAL_28:.*]] = math.fma %[[VAL_26]], %[[VAL_27]], %[[VAL_6]] : f32818// CHECK-DAG:       %[[VAL_29:.*]] = math.fma %[[VAL_26]], %[[VAL_28]], %[[VAL_7]] : f32819// CHECK-DAG:       %[[VAL_30:.*]] = math.fma %[[VAL_26]], %[[VAL_29]], %[[VAL_8]] : f32820// CHECK-DAG:       %[[VAL_31:.*]] = arith.mulf %[[VAL_30]], %[[VAL_26]] : f32821// CHECK-DAG:       %[[VAL_32:.*]] = math.fma %[[VAL_26]], %[[VAL_9]], %[[VAL_10]] : f32822// CHECK-DAG:       %[[VAL_33:.*]] = math.fma %[[VAL_26]], %[[VAL_32]], %[[VAL_11]] : f32823// CHECK-DAG:       %[[VAL_34:.*]] = math.fma %[[VAL_26]], %[[VAL_33]], %[[VAL_12]] : f32824// CHECK-DAG:       %[[VAL_35:.*]] = math.fma %[[VAL_26]], %[[VAL_34]], %[[VAL_13]] : f32825// CHECK-DAG:       %[[VAL_36:.*]] = arith.divf %[[VAL_31]], %[[VAL_35]] : f32826// CHECK-DAG:       %[[VAL_37:.*]] = math.fma %[[VAL_36]], %[[VAL_25]], %[[VAL_25]] : f32827// CHECK-DAG:       %[[VAL_38:.*]] = arith.addf %[[VAL_37]], %[[VAL_14]] : f32828// CHECK-DAG:       %[[VAL_39:.*]] = arith.select %[[VAL_17]], %[[VAL_38]], %[[VAL_37]] : f32829// CHECK-DAG:       %[[VAL_40:.*]] = arith.subf %[[VAL_15]], %[[VAL_37]] : f32830// CHECK-DAG:       %[[VAL_41:.*]] = arith.select %[[VAL_22]], %[[VAL_40]], %[[VAL_39]] : f32831// CHECK-DAG:       %[[VAL_42:.*]] = math.copysign %[[VAL_41]], %[[VAL_0]] : f32832// CHECK:           return %[[VAL_42]] : f3833func.func @atan_scalar(%arg0: f32) -> f32 {834  %0 = math.atan %arg0 : f32835  return %0 : f32836}837 838 839// CHECK-LABEL: @atan2_scalar840// CHECK-SAME:      %[[VAL_0:.*]]: f16,841// CHECK-SAME:      %[[VAL_1:.*]]: f16)842// CHECK-DAG:       %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32843// CHECK-DAG:       %[[VAL_3:.*]] = arith.constant 6.600000e-01 : f32844// CHECK-DAG:       %[[VAL_4:.*]] = arith.constant 2.41421366 : f32845// CHECK-DAG:       %[[VAL_5:.*]] = arith.constant -0.875060856 : f32846// CHECK-DAG:       %[[VAL_6:.*]] = arith.constant -16.1575375 : f32847// CHECK-DAG:       %[[VAL_7:.*]] = arith.constant -75.0085601 : f32848// CHECK-DAG:       %[[VAL_8:.*]] = arith.constant -122.886665 : f32849// CHECK-DAG:       %[[VAL_9:.*]] = arith.constant -64.8502197 : f32850// CHECK-DAG:       %[[VAL_10:.*]] = arith.constant 24.8584652 : f32851// CHECK-DAG:       %[[VAL_11:.*]] = arith.constant 165.027008 : f32852// CHECK-DAG:       %[[VAL_12:.*]] = arith.constant 432.881073 : f32853// CHECK-DAG:       %[[VAL_13:.*]] = arith.constant 485.390411 : f32854// CHECK-DAG:       %[[VAL_14:.*]] = arith.constant 194.550659 : f32855// CHECK-DAG:       %[[VAL_15:.*]] = arith.constant 0.785398185 : f32856// CHECK-DAG:       %[[VAL_16:.*]] = arith.constant 1.57079637 : f32857// CHECK-DAG:       %[[VAL_17:.*]] = arith.constant 0.000000e+00 : f32858// CHECK-DAG:       %[[VAL_18:.*]] = arith.constant 3.14159274 : f32859// CHECK-DAG:       %[[VAL_19:.*]] = arith.constant -1.57079637 : f32860// CHECK-DAG:       %[[VAL_20:.*]] = arith.constant 0x7FC00000 : f32861// CHECK-DAG:       %[[VAL_21:.*]] = arith.extf %[[VAL_0]] : f16 to f32862// CHECK-DAG:       %[[VAL_22:.*]] = arith.extf %[[VAL_1]] : f16 to f32863// CHECK-DAG:       %[[VAL_23:.*]] = arith.divf %[[VAL_21]], %[[VAL_22]] : f32864// CHECK-DAG:       %[[VAL_24:.*]] = math.absf %[[VAL_23]] : f32865// CHECK-DAG:       %[[VAL_25:.*]] = arith.cmpf ogt, %[[VAL_24]], %[[VAL_3]] : f32866// CHECK-DAG:       %[[VAL_26:.*]] = arith.addf %[[VAL_24]], %[[VAL_2]] : f32867// CHECK-DAG:       %[[VAL_27:.*]] = arith.subf %[[VAL_24]], %[[VAL_2]] : f32868// CHECK-DAG:       %[[VAL_28:.*]] = arith.select %[[VAL_25]], %[[VAL_27]], %[[VAL_24]] : f32869// CHECK-DAG:       %[[VAL_29:.*]] = arith.select %[[VAL_25]], %[[VAL_26]], %[[VAL_2]] : f32870// CHECK-DAG:       %[[VAL_30:.*]] = arith.cmpf ogt, %[[VAL_24]], %[[VAL_4]] : f32871// CHECK-DAG:       %[[VAL_31:.*]] = arith.select %[[VAL_30]], %[[VAL_2]], %[[VAL_28]] : f32872// CHECK-DAG:       %[[VAL_32:.*]] = arith.select %[[VAL_30]], %[[VAL_24]], %[[VAL_29]] : f32873// CHECK-DAG:       %[[VAL_33:.*]] = arith.divf %[[VAL_31]], %[[VAL_32]] : f32874// CHECK-DAG:       %[[VAL_34:.*]] = arith.mulf %[[VAL_33]], %[[VAL_33]] : f32875// CHECK-DAG:       %[[VAL_35:.*]] = math.fma %[[VAL_34]], %[[VAL_5]], %[[VAL_6]] : f32876// CHECK-DAG:       %[[VAL_36:.*]] = math.fma %[[VAL_34]], %[[VAL_35]], %[[VAL_7]] : f32877// CHECK-DAG:       %[[VAL_37:.*]] = math.fma %[[VAL_34]], %[[VAL_36]], %[[VAL_8]] : f32878// CHECK-DAG:       %[[VAL_38:.*]] = math.fma %[[VAL_34]], %[[VAL_37]], %[[VAL_9]] : f32879// CHECK-DAG:       %[[VAL_39:.*]] = arith.mulf %[[VAL_38]], %[[VAL_34]] : f32880// CHECK-DAG:       %[[VAL_40:.*]] = math.fma %[[VAL_34]], %[[VAL_10]], %[[VAL_11]] : f32881// CHECK-DAG:       %[[VAL_41:.*]] = math.fma %[[VAL_34]], %[[VAL_40]], %[[VAL_12]] : f32882// CHECK-DAG:       %[[VAL_42:.*]] = math.fma %[[VAL_34]], %[[VAL_41]], %[[VAL_13]] : f32883// CHECK-DAG:       %[[VAL_43:.*]] = math.fma %[[VAL_34]], %[[VAL_42]], %[[VAL_14]] : f32884// CHECK-DAG:       %[[VAL_44:.*]] = arith.divf %[[VAL_39]], %[[VAL_43]] : f32885// CHECK-DAG:       %[[VAL_45:.*]] = math.fma %[[VAL_44]], %[[VAL_33]], %[[VAL_33]] : f32886// CHECK-DAG:       %[[VAL_46:.*]] = arith.addf %[[VAL_45]], %[[VAL_15]] : f32887// CHECK-DAG:       %[[VAL_47:.*]] = arith.select %[[VAL_25]], %[[VAL_46]], %[[VAL_45]] : f32888// CHECK-DAG:       %[[VAL_48:.*]] = arith.subf %[[VAL_16]], %[[VAL_45]] : f32889// CHECK-DAG:       %[[VAL_49:.*]] = arith.select %[[VAL_30]], %[[VAL_48]], %[[VAL_47]] : f32890// CHECK-DAG:       %[[VAL_50:.*]] = math.copysign %[[VAL_49]], %[[VAL_23]] : f32891// CHECK-DAG:       %[[VAL_51:.*]] = arith.addf %[[VAL_50]], %[[VAL_18]] : f32892// CHECK-DAG:       %[[VAL_52:.*]] = arith.subf %[[VAL_50]], %[[VAL_18]] : f32893// CHECK-DAG:       %[[VAL_53:.*]] = arith.cmpf ogt, %[[VAL_50]], %[[VAL_17]] : f32894// CHECK-DAG:       %[[VAL_54:.*]] = arith.select %[[VAL_53]], %[[VAL_52]], %[[VAL_51]] : f32895// CHECK-DAG:       %[[VAL_55:.*]] = arith.cmpf ogt, %[[VAL_22]], %[[VAL_17]] : f32896// CHECK-DAG:       %[[VAL_56:.*]] = arith.select %[[VAL_55]], %[[VAL_50]], %[[VAL_54]] : f32897// CHECK-DAG:       %[[VAL_57:.*]] = arith.cmpf oeq, %[[VAL_22]], %[[VAL_17]] : f32898// CHECK-DAG:       %[[VAL_58:.*]] = arith.cmpf ogt, %[[VAL_21]], %[[VAL_17]] : f32899// CHECK-DAG:       %[[VAL_59:.*]] = arith.andi %[[VAL_57]], %[[VAL_58]] : i1900// CHECK-DAG:       %[[VAL_60:.*]] = arith.select %[[VAL_59]], %[[VAL_16]], %[[VAL_56]] : f32901// CHECK-DAG:       %[[VAL_61:.*]] = arith.cmpf olt, %[[VAL_21]], %[[VAL_17]] : f32902// CHECK-DAG:       %[[VAL_62:.*]] = arith.andi %[[VAL_57]], %[[VAL_61]] : i1903// CHECK-DAG:       %[[VAL_63:.*]] = arith.select %[[VAL_62]], %[[VAL_19]], %[[VAL_60]] : f32904// CHECK-DAG:       %[[VAL_64:.*]] = arith.cmpf oeq, %[[VAL_21]], %[[VAL_17]] : f32905// CHECK-DAG:       %[[VAL_65:.*]] = arith.andi %[[VAL_57]], %[[VAL_64]] : i1906// CHECK-DAG:       %[[VAL_66:.*]] = arith.select %[[VAL_65]], %[[VAL_20]], %[[VAL_63]] : f32907// CHECK-DAG:       %[[VAL_67:.*]] = arith.truncf %[[VAL_66]] : f32 to f16908// CHECK:           return %[[VAL_67]] : f1909func.func @atan2_scalar(%arg0: f16, %arg1: f16) -> f16 {910  %0 = math.atan2 %arg0, %arg1 : f16911  return %0 : f16912}913 914// CHECK-LABEL: @cbrt_vector915// CHECK-SAME: %[[ARG0:.+]]: vector<4xf32>916 917// CHECK: %[[TWO_INT:.+]] = arith.constant dense<2>918// CHECK: %[[FOUR_INT:.+]] = arith.constant dense<4>919// CHECK: %[[EIGHT_INT:.+]] = arith.constant dense<8>920// CHECK: %[[MAGIC:.+]] = arith.constant dense<709965728>921// CHECK: %[[THIRD_FP:.+]] = arith.constant dense<0.333333343> : vector<4xf32>922// CHECK: %[[TWO_FP:.+]] = arith.constant dense<2.000000e+00> : vector<4xf32>923// CHECK: %[[ZERO_FP:.+]] = arith.constant dense<0.000000e+00> : vector<4xf32>924 925// CHECK: %[[ABS:.+]] = math.absf %[[ARG0]] : vector<4xf32>926 927// Perform the initial approximation:928// CHECK: %[[CAST:.+]] = arith.bitcast %[[ABS]] : vector<4xf32> to vector<4xi32>929// CHECK: %[[SH_TWO:.+]] = arith.shrsi %[[CAST]], %[[TWO_INT]]930// CHECK: %[[SH_FOUR:.+]] = arith.shrsi %[[CAST]], %[[FOUR_INT]]931// CHECK: %[[APPROX0:.+]] = arith.addi %[[SH_TWO]], %[[SH_FOUR]]932// CHECK: %[[SH_FOUR:.+]] = arith.shrsi %[[APPROX0]], %[[FOUR_INT]]933// CHECK: %[[APPROX1:.+]] = arith.addi %[[APPROX0]], %[[SH_FOUR]]934// CHECK: %[[SH_EIGHT:.+]] = arith.shrsi %[[APPROX1]], %[[EIGHT_INT]]935// CHECK: %[[APPROX2:.+]] = arith.addi %[[APPROX1]], %[[SH_EIGHT]]936// CHECK: %[[FIX:.+]] = arith.addi %[[APPROX2]], %[[MAGIC]]937// CHECK: %[[BCAST:.+]] = arith.bitcast %[[FIX]]938 939// First Newton Step:940// CHECK: %[[SQR:.+]] = arith.mulf %[[BCAST]], %[[BCAST]]941// CHECK: %[[DOUBLE:.+]] = arith.mulf %[[BCAST]], %[[TWO_FP]]942// CHECK: %[[DIV:.+]] = arith.divf %[[ABS]], %[[SQR]]943// CHECK: %[[ADD:.+]] = arith.addf %[[DOUBLE]], %[[DIV]]944// CHECK: %[[APPROX3:.+]] = arith.mulf %[[ADD]], %[[THIRD_FP]]945 946// Second Newton Step:947// CHECK: %[[SQR:.+]] = arith.mulf %[[APPROX3]], %[[APPROX3]]948// CHECK: %[[DOUBLE:.+]] = arith.mulf %[[APPROX3]], %[[TWO_FP]]949// CHECK: %[[DIV:.+]] = arith.divf %[[ABS]], %[[SQR]]950// CHECK: %[[ADD:.+]] = arith.addf %[[DOUBLE]], %[[DIV]]951// CHECK: %[[APPROX4:.+]] = arith.mulf %[[ADD]], %[[THIRD_FP]]952 953// Check for zero special case and copy the sign:954// CHECK: %[[CMP:.+]] = arith.cmpf oeq, %[[ABS]], %[[ZERO_FP]]955// CHECK: %[[SEL:.+]] = arith.select %[[CMP]], %[[ZERO_FP]], %[[APPROX4]]956// CHECK: %[[SIGN:.+]] = math.copysign %[[SEL]], %[[ARG0]]957// CHECK: return %[[SIGN]]958 959func.func @cbrt_vector(%arg0: vector<4xf32>) -> vector<4xf32> {960  %0 = "math.cbrt"(%arg0) : (vector<4xf32>) -> vector<4xf32>961  func.return %0 : vector<4xf32>962}963 964 965// CHECK-LABEL: @math_f16966func.func @math_f16(%arg0 : vector<4xf16>) -> vector<4xf16> {967 968  // CHECK-NOT: math.atan969  %0 = "math.atan"(%arg0) : (vector<4xf16>) -> vector<4xf16>970 971  // CHECK-NOT: math.atan2972  %1 = "math.atan2"(%0, %arg0) : (vector<4xf16>, vector<4xf16>) -> vector<4xf16>973 974  // CHECK-NOT: math.tanh975  %2 = "math.tanh"(%1) : (vector<4xf16>) -> vector<4xf16>976 977  // CHECK-NOT: math.log978  %3 = "math.log"(%2) : (vector<4xf16>) -> vector<4xf16>979 980  // CHECK-NOT: math.log2981  %4 = "math.log2"(%3) : (vector<4xf16>) -> vector<4xf16>982 983  // CHECK-NOT: math.log1p984  %5 = "math.log1p"(%4) : (vector<4xf16>) -> vector<4xf16>985 986  // CHECK-NOT: math.erf987  %6 = "math.erf"(%5) : (vector<4xf16>) -> vector<4xf16>988 989  // CHECK-NOT: math.exp990  %7 = "math.exp"(%6) : (vector<4xf16>) -> vector<4xf16>991 992  // CHECK-NOT: math.expm1993  %8 = "math.expm1"(%7) : (vector<4xf16>) -> vector<4xf16>994 995  // CHECK-NOT: math.cbrt996  %9 = "math.cbrt"(%8) : (vector<4xf16>) -> vector<4xf16>997 998  // CHECK-NOT: math.sin999  %10 = "math.sin"(%9) : (vector<4xf16>) -> vector<4xf16>1000 1001  // CHECK-NOT: math.cos1002  %11 = "math.cos"(%10) : (vector<4xf16>) -> vector<4xf16>1003 1004  return %11 : vector<4xf16>1005}1006 1007// CHECK-LABEL: @math_zero_rank1008func.func @math_zero_rank(%arg0 : vector<f16>) -> vector<f16> {1009 1010  // CHECK-NOT: math.atan1011  %0 = "math.atan"(%arg0) : (vector<f16>) -> vector<f16>1012 1013  // CHECK-NOT: math.atan21014  %1 = "math.atan2"(%0, %arg0) : (vector<f16>, vector<f16>) -> vector<f16>1015 1016  // CHECK-NOT: math.tanh1017  %2 = "math.tanh"(%1) : (vector<f16>) -> vector<f16>1018 1019  // CHECK-NOT: math.log1020  %3 = "math.log"(%2) : (vector<f16>) -> vector<f16>1021 1022  // CHECK-NOT: math.log21023  %4 = "math.log2"(%3) : (vector<f16>) -> vector<f16>1024 1025  // CHECK-NOT: math.log1p1026  %5 = "math.log1p"(%4) : (vector<f16>) -> vector<f16>1027 1028  // CHECK-NOT: math.erf1029  %6 = "math.erf"(%5) : (vector<f16>) -> vector<f16>1030 1031  // CHECK-NOT: math.exp1032  %7 = "math.exp"(%6) : (vector<f16>) -> vector<f16>1033 1034  // CHECK-NOT: math.expm11035  %8 = "math.expm1"(%7) : (vector<f16>) -> vector<f16>1036 1037  // CHECK-NOT: math.cbrt1038  %9 = "math.cbrt"(%8) : (vector<f16>) -> vector<f16>1039 1040  // CHECK-NOT: math.sin1041  %10 = "math.sin"(%9) : (vector<f16>) -> vector<f16>1042 1043  // CHECK-NOT: math.cos1044  %11 = "math.cos"(%10) : (vector<f16>) -> vector<f16>1045 1046  return %11 : vector<f16>1047}1048 1049// AVX2-LABEL: @rsqrt_f161050func.func @rsqrt_f16(%arg0 : vector<2x8xf16>) -> vector<2x8xf16> {1051  // AVX2-NOT: math.rsqrt1052  %0 = "math.rsqrt"(%arg0) : (vector<2x8xf16>) -> vector<2x8xf16>1053  return %0 : vector<2x8xf16>1054}1055