|  | ; Test that library calls are emitted for LLVM IR intrinsics | 
|  | ; | 
|  | ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s | 
|  |  | 
|  | define float @f1(float %x, i32 %y) { | 
|  | ; CHECK-LABEL: f1: | 
|  | ; CHECK: brasl %r14, __powisf2@PLT | 
|  | %tmp = call float @llvm.powi.f32(float %x, i32 %y) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f2(double %x, i32 %y) { | 
|  | ; CHECK-LABEL: f2: | 
|  | ; CHECK: brasl %r14, __powidf2@PLT | 
|  | %tmp = call double @llvm.powi.f64(double %x, i32 %y) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f3(fp128 %x, i32 %y) { | 
|  | ; CHECK-LABEL: f3: | 
|  | ; CHECK: brasl %r14, __powitf2@PLT | 
|  | %tmp = call fp128 @llvm.powi.f128(fp128 %x, i32 %y) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f4(float %x, float %y) { | 
|  | ; CHECK-LABEL: f4: | 
|  | ; CHECK: brasl %r14, powf@PLT | 
|  | %tmp = call float @llvm.pow.f32(float %x, float %y) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f5(double %x, double %y) { | 
|  | ; CHECK-LABEL: f5: | 
|  | ; CHECK: brasl %r14, pow@PLT | 
|  | %tmp = call double @llvm.pow.f64(double %x, double %y) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f6(fp128 %x, fp128 %y) { | 
|  | ; CHECK-LABEL: f6: | 
|  | ; CHECK: brasl %r14, powl@PLT | 
|  | %tmp = call fp128 @llvm.pow.f128(fp128 %x, fp128 %y) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f7(float %x) { | 
|  | ; CHECK-LABEL: f7: | 
|  | ; CHECK: brasl %r14, sinf@PLT | 
|  | %tmp = call float @llvm.sin.f32(float %x) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f8(double %x) { | 
|  | ; CHECK-LABEL: f8: | 
|  | ; CHECK: brasl %r14, sin@PLT | 
|  | %tmp = call double @llvm.sin.f64(double %x) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f9(fp128 %x) { | 
|  | ; CHECK-LABEL: f9: | 
|  | ; CHECK: brasl %r14, sinl@PLT | 
|  | %tmp = call fp128 @llvm.sin.f128(fp128 %x) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f10(float %x) { | 
|  | ; CHECK-LABEL: f10: | 
|  | ; CHECK: brasl %r14, cosf@PLT | 
|  | %tmp = call float @llvm.cos.f32(float %x) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f11(double %x) { | 
|  | ; CHECK-LABEL: f11: | 
|  | ; CHECK: brasl %r14, cos@PLT | 
|  | %tmp = call double @llvm.cos.f64(double %x) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f12(fp128 %x) { | 
|  | ; CHECK-LABEL: f12: | 
|  | ; CHECK: brasl %r14, cosl@PLT | 
|  | %tmp = call fp128 @llvm.cos.f128(fp128 %x) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f13(float %x) { | 
|  | ; CHECK-LABEL: f13: | 
|  | ; CHECK: brasl %r14, expf@PLT | 
|  | %tmp = call float @llvm.exp.f32(float %x) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f14(double %x) { | 
|  | ; CHECK-LABEL: f14: | 
|  | ; CHECK: brasl %r14, exp@PLT | 
|  | %tmp = call double @llvm.exp.f64(double %x) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f15(fp128 %x) { | 
|  | ; CHECK-LABEL: f15: | 
|  | ; CHECK: brasl %r14, expl@PLT | 
|  | %tmp = call fp128 @llvm.exp.f128(fp128 %x) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f16(float %x) { | 
|  | ; CHECK-LABEL: f16: | 
|  | ; CHECK: brasl %r14, exp2f@PLT | 
|  | %tmp = call float @llvm.exp2.f32(float %x) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f17(double %x) { | 
|  | ; CHECK-LABEL: f17: | 
|  | ; CHECK: brasl %r14, exp2@PLT | 
|  | %tmp = call double @llvm.exp2.f64(double %x) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f18(fp128 %x) { | 
|  | ; CHECK-LABEL: f18: | 
|  | ; CHECK: brasl %r14, exp2l@PLT | 
|  | %tmp = call fp128 @llvm.exp2.f128(fp128 %x) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f19(float %x) { | 
|  | ; CHECK-LABEL: f19: | 
|  | ; CHECK: brasl %r14, logf@PLT | 
|  | %tmp = call float @llvm.log.f32(float %x) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f20(double %x) { | 
|  | ; CHECK-LABEL: f20: | 
|  | ; CHECK: brasl %r14, log@PLT | 
|  | %tmp = call double @llvm.log.f64(double %x) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f21(fp128 %x) { | 
|  | ; CHECK-LABEL: f21: | 
|  | ; CHECK: brasl %r14, logl@PLT | 
|  | %tmp = call fp128 @llvm.log.f128(fp128 %x) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f22(float %x) { | 
|  | ; CHECK-LABEL: f22: | 
|  | ; CHECK: brasl %r14, log2f@PLT | 
|  | %tmp = call float @llvm.log2.f32(float %x) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f23(double %x) { | 
|  | ; CHECK-LABEL: f23: | 
|  | ; CHECK: brasl %r14, log2@PLT | 
|  | %tmp = call double @llvm.log2.f64(double %x) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f24(fp128 %x) { | 
|  | ; CHECK-LABEL: f24: | 
|  | ; CHECK: brasl %r14, log2l@PLT | 
|  | %tmp = call fp128 @llvm.log2.f128(fp128 %x) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f25(float %x) { | 
|  | ; CHECK-LABEL: f25: | 
|  | ; CHECK: brasl %r14, log10f@PLT | 
|  | %tmp = call float @llvm.log10.f32(float %x) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f26(double %x) { | 
|  | ; CHECK-LABEL: f26: | 
|  | ; CHECK: brasl %r14, log10@PLT | 
|  | %tmp = call double @llvm.log10.f64(double %x) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f27(fp128 %x) { | 
|  | ; CHECK-LABEL: f27: | 
|  | ; CHECK: brasl %r14, log10l@PLT | 
|  | %tmp = call fp128 @llvm.log10.f128(fp128 %x) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f28(float %x, float %y) { | 
|  | ; CHECK-LABEL: f28: | 
|  | ; CHECK: brasl %r14, fminf@PLT | 
|  | %tmp = call float @llvm.minnum.f32(float %x, float %y) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f29(double %x, double %y) { | 
|  | ; CHECK-LABEL: f29: | 
|  | ; CHECK: brasl %r14, fmin@PLT | 
|  | %tmp = call double @llvm.minnum.f64(double %x, double %y) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f30(fp128 %x, fp128 %y) { | 
|  | ; CHECK-LABEL: f30: | 
|  | ; CHECK: brasl %r14, fminl@PLT | 
|  | %tmp = call fp128 @llvm.minnum.f128(fp128 %x, fp128 %y) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | define float @f31(float %x, float %y) { | 
|  | ; CHECK-LABEL: f31: | 
|  | ; CHECK: brasl %r14, fmaxf@PLT | 
|  | %tmp = call float @llvm.maxnum.f32(float %x, float %y) | 
|  | ret float %tmp | 
|  | } | 
|  |  | 
|  | define double @f32(double %x, double %y) { | 
|  | ; CHECK-LABEL: f32: | 
|  | ; CHECK: brasl %r14, fmax@PLT | 
|  | %tmp = call double @llvm.maxnum.f64(double %x, double %y) | 
|  | ret double %tmp | 
|  | } | 
|  |  | 
|  | define fp128 @f33(fp128 %x, fp128 %y) { | 
|  | ; CHECK-LABEL: f33: | 
|  | ; CHECK: brasl %r14, fmaxl@PLT | 
|  | %tmp = call fp128 @llvm.maxnum.f128(fp128 %x, fp128 %y) | 
|  | ret fp128 %tmp | 
|  | } | 
|  |  | 
|  | declare float @llvm.powi.f32(float, i32) | 
|  | declare double @llvm.powi.f64(double, i32) | 
|  | declare fp128 @llvm.powi.f128(fp128, i32) | 
|  | declare float @llvm.pow.f32(float, float) | 
|  | declare double @llvm.pow.f64(double, double) | 
|  | declare fp128 @llvm.pow.f128(fp128, fp128) | 
|  |  | 
|  | declare float @llvm.sin.f32(float) | 
|  | declare double @llvm.sin.f64(double) | 
|  | declare fp128 @llvm.sin.f128(fp128) | 
|  | declare float @llvm.cos.f32(float) | 
|  | declare double @llvm.cos.f64(double) | 
|  | declare fp128 @llvm.cos.f128(fp128) | 
|  |  | 
|  | declare float @llvm.exp.f32(float) | 
|  | declare double @llvm.exp.f64(double) | 
|  | declare fp128 @llvm.exp.f128(fp128) | 
|  | declare float @llvm.exp2.f32(float) | 
|  | declare double @llvm.exp2.f64(double) | 
|  | declare fp128 @llvm.exp2.f128(fp128) | 
|  |  | 
|  | declare float @llvm.log.f32(float) | 
|  | declare double @llvm.log.f64(double) | 
|  | declare fp128 @llvm.log.f128(fp128) | 
|  | declare float @llvm.log2.f32(float) | 
|  | declare double @llvm.log2.f64(double) | 
|  | declare fp128 @llvm.log2.f128(fp128) | 
|  | declare float @llvm.log10.f32(float) | 
|  | declare double @llvm.log10.f64(double) | 
|  | declare fp128 @llvm.log10.f128(fp128) | 
|  |  | 
|  | declare float @llvm.minnum.f32(float, float) | 
|  | declare double @llvm.minnum.f64(double, double) | 
|  | declare fp128 @llvm.minnum.f128(fp128, fp128) | 
|  | declare float @llvm.maxnum.f32(float, float) | 
|  | declare double @llvm.maxnum.f64(double, double) | 
|  | declare fp128 @llvm.maxnum.f128(fp128, fp128) | 
|  |  |