2015-05-08 08:57:22 +08:00
|
|
|
; RUN: llc -march=mips64 -mcpu=mips64r2 -mattr=+soft-float -O2 < %s | FileCheck %s
|
2015-03-23 20:28:13 +08:00
|
|
|
|
|
|
|
define void @foosf() #0 {
|
|
|
|
entry:
|
|
|
|
%in = alloca float, align 4
|
|
|
|
%out = alloca float, align 4
|
|
|
|
store volatile float 0xBFD59E1380000000, float* %in, align 4
|
|
|
|
%in.0.in.0. = load volatile float, float* %in, align 4
|
|
|
|
%rintf = tail call float @rintf(float %in.0.in.0.) #1
|
|
|
|
store volatile float %rintf, float* %out, align 4
|
|
|
|
ret void
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @rintf(float)
|
|
|
|
|
|
|
|
define float @foosf1(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%call = tail call float @roundf(float %0) #2
|
|
|
|
ret float %call
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf1
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @roundf(float) #1
|
|
|
|
|
|
|
|
define float @foosf2(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%call = tail call float @truncf(float %0) #2
|
|
|
|
ret float %call
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf2
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @truncf(float) #1
|
|
|
|
|
|
|
|
define float @foosf3(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%call = tail call float @floorf(float %0) #2
|
|
|
|
ret float %call
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf3
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @floorf(float) #1
|
|
|
|
|
|
|
|
define float @foosf4(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%call = tail call float @nearbyintf(float %0) #2
|
|
|
|
ret float %call
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf4
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @nearbyintf(float) #1
|
|
|
|
|
|
|
|
define float @foosf5(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%mul = fmul float %0, undef
|
|
|
|
ret float %mul
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf5
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
define float @foosf6(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%sub = fsub float %0, undef
|
|
|
|
ret float %sub
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf6
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
define float @foosf7(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%add = fadd float %0, undef
|
|
|
|
ret float %add
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf7
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
define float @foosf8(float* nocapture readonly %a) #0 {
|
|
|
|
entry:
|
|
|
|
%b = alloca float, align 4
|
|
|
|
%b.0.b.0. = load volatile float, float* %b, align 4
|
|
|
|
%0 = load float, float* %a, align 4
|
|
|
|
%div = fdiv float %b.0.b.0., %0
|
|
|
|
ret float %div
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf8
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
define float @foosf9() #0 {
|
|
|
|
entry:
|
|
|
|
%b = alloca float, align 4
|
|
|
|
%b.0.b.0. = load volatile float, float* %b, align 4
|
|
|
|
%conv = fpext float %b.0.b.0. to double
|
|
|
|
%b.0.b.0.3 = load volatile float, float* %b, align 4
|
|
|
|
%conv1 = fpext float %b.0.b.0.3 to double
|
|
|
|
%call = tail call double @pow(double %conv, double %conv1) #1
|
|
|
|
%conv2 = fptrunc double %call to float
|
|
|
|
ret float %conv2
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf9
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare double @pow(double, double) #0
|
|
|
|
|
|
|
|
define float @foosf10() #0 {
|
|
|
|
entry:
|
|
|
|
%a = alloca float, align 4
|
|
|
|
%a.0.a.0. = load volatile float, float* %a, align 4
|
|
|
|
%conv = fpext float %a.0.a.0. to double
|
|
|
|
%call = tail call double @sin(double %conv) #1
|
|
|
|
%conv1 = fptrunc double %call to float
|
|
|
|
ret float %conv1
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf10
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare double @sin(double) #0
|
|
|
|
|
|
|
|
define float @foosf11() #0 {
|
|
|
|
entry:
|
|
|
|
%b = alloca float, align 4
|
|
|
|
%b.0.b.0. = load volatile float, float* %b, align 4
|
|
|
|
%call = tail call float @ceilf(float %b.0.b.0.) #2
|
|
|
|
ret float %call
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf11
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @ceilf(float) #1
|
|
|
|
|
|
|
|
define float @foosf12() #0 {
|
|
|
|
entry:
|
|
|
|
%b = alloca float, align 4
|
|
|
|
%a = alloca float, align 4
|
|
|
|
%b.0.b.0. = load volatile float, float* %b, align 4
|
|
|
|
%a.0.a.0. = load volatile float, float* %a, align 4
|
|
|
|
%call = tail call float @fmaxf(float %b.0.b.0., float %a.0.a.0.) #2
|
|
|
|
ret float %call
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf12
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @fmaxf(float, float) #1
|
|
|
|
|
|
|
|
define float @foosf13() #0 {
|
|
|
|
entry:
|
|
|
|
%b = alloca float, align 4
|
|
|
|
%a = alloca float, align 4
|
|
|
|
%b.0.b.0. = load volatile float, float* %b, align 4
|
|
|
|
%a.0.a.0. = load volatile float, float* %a, align 4
|
|
|
|
%call = tail call float @fminf(float %b.0.b.0., float %a.0.a.0.) #2
|
|
|
|
ret float %call
|
|
|
|
|
|
|
|
; CHECK-LABEL: foosf13
|
|
|
|
; CHECK-NOT: dsll
|
|
|
|
; CHECK-NOT: dsrl
|
|
|
|
; CHECK-NOT: lwu
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @fminf(float, float) #1
|
|
|
|
|
|
|
|
|
|
|
|
attributes #0 = { nounwind "use-soft-float"="true" }
|
|
|
|
attributes #1 = { nounwind readnone "use-soft-float"="true" }
|