; RUN: llc < %s -march=xcore | FileCheck %s
declare double @llvm.cos.f64(double)
declare double @llvm.exp.f64(double)
declare double @llvm.exp2.f64(double)
declare double @llvm.log.f64(double)
declare double @llvm.log10.f64(double)
declare double @llvm.log2.f64(double)
declare double @llvm.pow.f64(double, double)
declare double @llvm.powi.f64(double, i32)
declare double @llvm.sin.f64(double)
declare double @llvm.sqrt.f64(double)

define double @cos(double %F) {
; CHECK: cos:
; CHECK: bl cos
        %result = call double @llvm.cos.f64(double %F)
	ret double %result
}

declare float @llvm.cos.f32(float)

; CHECK: cosf:
; CHECK: bl cosf
define float @cosf(float %F) {
        %result = call float @llvm.cos.f32(float %F)
	ret float %result
}

define double @exp(double %F) {
; CHECK: exp:
; CHECK: bl exp
        %result = call double @llvm.exp.f64(double %F)
	ret double %result
}

declare float @llvm.exp.f32(float)

define float @expf(float %F) {
; CHECK: expf:
; CHECK: bl expf
        %result = call float @llvm.exp.f32(float %F)
	ret float %result
}

define double @exp2(double %F) {
; CHECK: exp2:
; CHECK: bl exp2
        %result = call double @llvm.exp2.f64(double %F)
	ret double %result
}

declare float @llvm.exp2.f32(float)

define float @exp2f(float %F) {
; CHECK: exp2f:
; CHECK: bl exp2f
        %result = call float @llvm.exp2.f32(float %F)
	ret float %result
}

define double @log(double %F) {
; CHECK: log:
; CHECK: bl log
        %result = call double @llvm.log.f64(double %F)
	ret double %result
}

declare float @llvm.log.f32(float)

define float @logf(float %F) {
; CHECK: logf:
; CHECK: bl logf
        %result = call float @llvm.log.f32(float %F)
	ret float %result
}

define double @log10(double %F) {
; CHECK: log10:
; CHECK: bl log10
        %result = call double @llvm.log10.f64(double %F)
	ret double %result
}

declare float @llvm.log10.f32(float)

define float @log10f(float %F) {
; CHECK: log10f:
; CHECK: bl log10f
        %result = call float @llvm.log10.f32(float %F)
	ret float %result
}

define double @log2(double %F) {
; CHECK: log2:
; CHECK: bl log2
        %result = call double @llvm.log2.f64(double %F)
	ret double %result
}

declare float @llvm.log2.f32(float)

define float @log2f(float %F) {
; CHECK: log2f:
; CHECK: bl log2f
        %result = call float @llvm.log2.f32(float %F)
	ret float %result
}

define double @pow(double %F, double %power) {
; CHECK: pow:
; CHECK: bl pow
        %result = call double @llvm.pow.f64(double %F, double %power)
	ret double %result
}

declare float @llvm.pow.f32(float, float)

define float @powf(float %F, float %power) {
; CHECK: powf:
; CHECK: bl powf
        %result = call float @llvm.pow.f32(float %F, float %power)
	ret float %result
}

define double @powi(double %F, i32 %power) {
; CHECK: powi:
; CHECK: bl __powidf2
        %result = call double @llvm.powi.f64(double %F, i32 %power)
	ret double %result
}

declare float @llvm.powi.f32(float, i32)

define float @powif(float %F, i32 %power) {
; CHECK: powif:
; CHECK: bl __powisf2
        %result = call float @llvm.powi.f32(float %F, i32 %power)
	ret float %result
}

define double @sin(double %F) {
; CHECK: sin:
; CHECK: bl sin
        %result = call double @llvm.sin.f64(double %F)
	ret double %result
}

declare float @llvm.sin.f32(float)

define float @sinf(float %F) {
; CHECK: sinf:
; CHECK: bl sinf
        %result = call float @llvm.sin.f32(float %F)
	ret float %result
}

define double @sqrt(double %F) {
; CHECK: sqrt:
; CHECK: bl sqrt
        %result = call double @llvm.sqrt.f64(double %F)
	ret double %result
}

declare float @llvm.sqrt.f32(float)

define float @sqrtf(float %F) {
; CHECK: sqrtf:
; CHECK: bl sqrtf
        %result = call float @llvm.sqrt.f32(float %F)
	ret float %result
}
