1; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -o - %s | FileCheck %s 2; RUN: llc -mtriple=aarch64-linux-android -verify-machineinstrs -o - %s | FileCheck %s 3 4@varfloat = global float 0.0 5@vardouble = global double 0.0 6@varfp128 = global fp128 zeroinitializer 7 8declare float @llvm.cos.f32(float) 9declare double @llvm.cos.f64(double) 10declare fp128 @llvm.cos.f128(fp128) 11 12define void @test_cos(float %float, double %double, fp128 %fp128) { 13; CHECK-LABEL: test_cos: 14 15 %cosfloat = call float @llvm.cos.f32(float %float) 16 store float %cosfloat, float* @varfloat 17; CHECK: bl cosf 18 19 %cosdouble = call double @llvm.cos.f64(double %double) 20 store double %cosdouble, double* @vardouble 21; CHECK: bl cos 22 23 %cosfp128 = call fp128 @llvm.cos.f128(fp128 %fp128) 24 store fp128 %cosfp128, fp128* @varfp128 25; CHECK: bl cosl 26 27 ret void 28} 29 30declare float @llvm.exp.f32(float) 31declare double @llvm.exp.f64(double) 32declare fp128 @llvm.exp.f128(fp128) 33 34define void @test_exp(float %float, double %double, fp128 %fp128) { 35; CHECK-LABEL: test_exp: 36 37 %expfloat = call float @llvm.exp.f32(float %float) 38 store float %expfloat, float* @varfloat 39; CHECK: bl expf 40 41 %expdouble = call double @llvm.exp.f64(double %double) 42 store double %expdouble, double* @vardouble 43; CHECK: bl exp 44 45 %expfp128 = call fp128 @llvm.exp.f128(fp128 %fp128) 46 store fp128 %expfp128, fp128* @varfp128 47; CHECK: bl expl 48 49 ret void 50} 51 52declare float @llvm.exp2.f32(float) 53declare double @llvm.exp2.f64(double) 54declare fp128 @llvm.exp2.f128(fp128) 55 56define void @test_exp2(float %float, double %double, fp128 %fp128) { 57; CHECK-LABEL: test_exp2: 58 59 %exp2float = call float @llvm.exp2.f32(float %float) 60 store float %exp2float, float* @varfloat 61; CHECK: bl exp2f 62 63 %exp2double = call double @llvm.exp2.f64(double %double) 64 store double %exp2double, double* @vardouble 65; CHECK: bl exp2 66 67 %exp2fp128 = call fp128 @llvm.exp2.f128(fp128 %fp128) 68 store fp128 %exp2fp128, fp128* @varfp128 69; CHECK: bl exp2l 70 ret void 71 72} 73 74declare float @llvm.log.f32(float) 75declare double @llvm.log.f64(double) 76declare fp128 @llvm.log.f128(fp128) 77 78define void @test_log(float %float, double %double, fp128 %fp128) { 79; CHECK-LABEL: test_log: 80 81 %logfloat = call float @llvm.log.f32(float %float) 82 store float %logfloat, float* @varfloat 83; CHECK: bl logf 84 85 %logdouble = call double @llvm.log.f64(double %double) 86 store double %logdouble, double* @vardouble 87; CHECK: bl log 88 89 %logfp128 = call fp128 @llvm.log.f128(fp128 %fp128) 90 store fp128 %logfp128, fp128* @varfp128 91; CHECK: bl logl 92 93 ret void 94} 95 96declare float @llvm.log2.f32(float) 97declare double @llvm.log2.f64(double) 98declare fp128 @llvm.log2.f128(fp128) 99 100define void @test_log2(float %float, double %double, fp128 %fp128) { 101; CHECK-LABEL: test_log2: 102 103 %log2float = call float @llvm.log2.f32(float %float) 104 store float %log2float, float* @varfloat 105; CHECK: bl log2f 106 107 %log2double = call double @llvm.log2.f64(double %double) 108 store double %log2double, double* @vardouble 109; CHECK: bl log2 110 111 %log2fp128 = call fp128 @llvm.log2.f128(fp128 %fp128) 112 store fp128 %log2fp128, fp128* @varfp128 113; CHECK: bl log2l 114 ret void 115 116} 117 118declare float @llvm.log10.f32(float) 119declare double @llvm.log10.f64(double) 120declare fp128 @llvm.log10.f128(fp128) 121 122define void @test_log10(float %float, double %double, fp128 %fp128) { 123; CHECK-LABEL: test_log10: 124 125 %log10float = call float @llvm.log10.f32(float %float) 126 store float %log10float, float* @varfloat 127; CHECK: bl log10f 128 129 %log10double = call double @llvm.log10.f64(double %double) 130 store double %log10double, double* @vardouble 131; CHECK: bl log10 132 133 %log10fp128 = call fp128 @llvm.log10.f128(fp128 %fp128) 134 store fp128 %log10fp128, fp128* @varfp128 135; CHECK: bl log10l 136 137 ret void 138} 139 140declare float @llvm.sin.f32(float) 141declare double @llvm.sin.f64(double) 142declare fp128 @llvm.sin.f128(fp128) 143 144define void @test_sin(float %float, double %double, fp128 %fp128) { 145; CHECK-LABEL: test_sin: 146 147 %sinfloat = call float @llvm.sin.f32(float %float) 148 store float %sinfloat, float* @varfloat 149; CHECK: bl sinf 150 151 %sindouble = call double @llvm.sin.f64(double %double) 152 store double %sindouble, double* @vardouble 153; CHECK: bl sin 154 155 %sinfp128 = call fp128 @llvm.sin.f128(fp128 %fp128) 156 store fp128 %sinfp128, fp128* @varfp128 157; CHECK: bl sinl 158 ret void 159 160} 161 162declare float @llvm.pow.f32(float, float) 163declare double @llvm.pow.f64(double, double) 164declare fp128 @llvm.pow.f128(fp128, fp128) 165 166define void @test_pow(float %float, double %double, fp128 %fp128) { 167; CHECK-LABEL: test_pow: 168 169 %powfloat = call float @llvm.pow.f32(float %float, float %float) 170 store float %powfloat, float* @varfloat 171; CHECK: bl powf 172 173 %powdouble = call double @llvm.pow.f64(double %double, double %double) 174 store double %powdouble, double* @vardouble 175; CHECK: bl pow 176 177 %powfp128 = call fp128 @llvm.pow.f128(fp128 %fp128, fp128 %fp128) 178 store fp128 %powfp128, fp128* @varfp128 179; CHECK: bl powl 180 181 ret void 182} 183 184declare float @llvm.powi.f32(float, i32) 185declare double @llvm.powi.f64(double, i32) 186declare fp128 @llvm.powi.f128(fp128, i32) 187 188define void @test_powi(float %float, double %double, i32 %exponent, fp128 %fp128) { 189; CHECK-LABEL: test_powi: 190 191 %powifloat = call float @llvm.powi.f32(float %float, i32 %exponent) 192 store float %powifloat, float* @varfloat 193; CHECK: bl __powisf2 194 195 %powidouble = call double @llvm.powi.f64(double %double, i32 %exponent) 196 store double %powidouble, double* @vardouble 197; CHECK: bl __powidf2 198 199 %powifp128 = call fp128 @llvm.powi.f128(fp128 %fp128, i32 %exponent) 200 store fp128 %powifp128, fp128* @varfp128 201; CHECK: bl __powitf2 202 ret void 203 204} 205 206define void @test_frem(float %float, double %double, fp128 %fp128) { 207; CHECK-LABEL: test_frem: 208 209 %fremfloat = frem float %float, %float 210 store float %fremfloat, float* @varfloat 211; CHECK: bl fmodf 212 213 %fremdouble = frem double %double, %double 214 store double %fremdouble, double* @vardouble 215; CHECK: bl fmod 216 217 %fremfp128 = frem fp128 %fp128, %fp128 218 store fp128 %fremfp128, fp128* @varfp128 219; CHECK: bl fmodl 220 221 ret void 222} 223 224declare fp128 @llvm.fma.f128(fp128, fp128, fp128) 225 226define void @test_fma(fp128 %fp128) { 227; CHECK-LABEL: test_fma: 228 229 %fmafp128 = call fp128 @llvm.fma.f128(fp128 %fp128, fp128 %fp128, fp128 %fp128) 230 store fp128 %fmafp128, fp128* @varfp128 231; CHECK: bl fmal 232 233 ret void 234} 235 236declare fp128 @llvm.fmuladd.f128(fp128, fp128, fp128) 237 238define void @test_fmuladd(fp128 %fp128) { 239; CHECK-LABEL: test_fmuladd: 240 241 %fmuladdfp128 = call fp128 @llvm.fmuladd.f128(fp128 %fp128, fp128 %fp128, fp128 %fp128) 242 store fp128 %fmuladdfp128, fp128* @varfp128 243; CHECK-NOT: bl fmal 244; CHECK: bl __multf3 245; CHECK: bl __addtf3 246 247 ret void 248} 249 250define i32 @test_fptosi32(fp128 %a) { 251; CHECK-LABEL: test_fptosi32: 252; CHECK: bl __fixtfsi 253 %conv.i = fptosi fp128 %a to i32 254 %b = add nsw i32 %conv.i, 48 255 ret i32 %b 256} 257 258define i64 @test_fptosi64(fp128 %a) { 259; CHECK-LABEL: test_fptosi64: 260; CHECK: bl __fixtfdi 261 %conv.i = fptosi fp128 %a to i64 262 %b = add nsw i64 %conv.i, 48 263 ret i64 %b 264} 265 266define i128 @test_fptosi128(fp128 %a) { 267; CHECK-LABEL: test_fptosi128: 268; CHECK: bl __fixtfti 269 %conv.i = fptosi fp128 %a to i128 270 %b = add nsw i128 %conv.i, 48 271 ret i128 %b 272} 273 274define i32 @test_fptoui32(fp128 %a) { 275; CHECK-LABEL: test_fptoui32: 276; CHECK: bl __fixunstfsi 277 %conv.i = fptoui fp128 %a to i32 278 %b = add nsw i32 %conv.i, 48 279 ret i32 %b 280} 281 282define i64 @test_fptoui64(fp128 %a) { 283; CHECK-LABEL: test_fptoui64: 284; CHECK: bl __fixunstfdi 285 %conv.i = fptoui fp128 %a to i64 286 %b = add nsw i64 %conv.i, 48 287 ret i64 %b 288} 289 290define i128 @test_fptoui128(fp128 %a) { 291; CHECK-LABEL: test_fptoui128: 292; CHECK: bl __fixunstfti 293 %conv.i = fptoui fp128 %a to i128 294 %b = add nsw i128 %conv.i, 48 295 ret i128 %b 296} 297 298define void @test_exp_finite(double %double) #0 { 299 %expdouble = call double @llvm.exp.f64(double %double) 300 store double %expdouble, double* @vardouble 301 ; ANDROID-AARCH64-NOT: bl __exp_finite 302 ; CHECK: bl exp 303 304 ret void 305} 306 307define void @test_exp2_finite(double %double) #0 { 308 %expdouble = call double @llvm.exp2.f64(double %double) 309 store double %expdouble, double* @vardouble 310 ; CHECK-NOT: bl __exp2_finite 311 ; CHECK: bl exp2 312 313 ret void 314} 315 316define void @test_log_finite(double %double) #0 { 317 %logdouble = call double @llvm.log.f64(double %double) 318 store double %logdouble, double* @vardouble 319 ; CHECK-NOT: bl __log_finite 320 ; CHECK: bl log 321 ret void 322} 323 324define void @test_log2_finite(double %double) #0 { 325 %log2double = call double @llvm.log2.f64(double %double) 326 store double %log2double, double* @vardouble 327 ; CHECK-NOT: bl __log2_finite 328 ; CHECK: bl log2 329 ret void 330} 331 332define void @test_log10_finite(double %double) #0 { 333 %log10double = call double @llvm.log10.f64(double %double) 334 store double %log10double, double* @vardouble 335 ; CHECK-NOT: bl __log10_finite 336 ; CHECK: bl log10 337 ret void 338} 339 340define void @test_pow_finite(double %double) #0 { 341 %powdouble = call double @llvm.pow.f64(double %double, double %double) 342 store double %powdouble, double* @vardouble 343 ; CHECK-NOT: bl __pow_finite 344 ; CHECK: bl pow 345 ret void 346} 347 348attributes #0 = { "no-infs-fp-math"="true" "no-nans-fp-math"="true" } 349