blob: e940d4686fbddbb2c9e8a3ec4405fd27fe03aff5 [file] [edit]
; RUN: llc -mtriple=mips64el -mcpu=r5900 < %s | FileCheck %s
;
; R5900 FPU does not implement IEEE 754 NaN or infinity. Arithmetic operations
; use software libcall fallbacks by default for IEEE correctness. Hardware FPU
; instructions are used when per-instruction nnan+ninf flags guarantee no NaN
; or infinity inputs/outputs.
define float @test_fadd(float %a, float %b) {
; CHECK-LABEL: test_fadd:
; CHECK: jal __addsf3
%result = fadd float %a, %b
ret float %result
}
define float @test_fsub(float %a, float %b) {
; CHECK-LABEL: test_fsub:
; CHECK: jal __subsf3
%result = fsub float %a, %b
ret float %result
}
define float @test_fmul(float %a, float %b) {
; CHECK-LABEL: test_fmul:
; CHECK: jal __mulsf3
%result = fmul float %a, %b
ret float %result
}
define float @test_fdiv(float %a, float %b) {
; CHECK-LABEL: test_fdiv:
; CHECK: jal __divsf3
%result = fdiv float %a, %b
ret float %result
}
define float @test_fsqrt(float %a) {
; CHECK-LABEL: test_fsqrt:
; CHECK: jal sqrtf
%result = call float @llvm.sqrt.f32(float %a)
ret float %result
}
; Per-instruction nnan+ninf flags select hardware directly.
define float @test_fadd_nnan_ninf(float %a, float %b) {
; CHECK-LABEL: test_fadd_nnan_ninf:
; CHECK: add.s
%result = fadd nnan ninf float %a, %b
ret float %result
}
define float @test_fsub_nnan_ninf(float %a, float %b) {
; CHECK-LABEL: test_fsub_nnan_ninf:
; CHECK: sub.s
%result = fsub nnan ninf float %a, %b
ret float %result
}
define float @test_fmul_nnan_ninf(float %a, float %b) {
; CHECK-LABEL: test_fmul_nnan_ninf:
; CHECK: mul.s
%result = fmul nnan ninf float %a, %b
ret float %result
}
define float @test_fdiv_nnan_ninf(float %a, float %b) {
; CHECK-LABEL: test_fdiv_nnan_ninf:
; CHECK: div.s
%result = fdiv nnan ninf float %a, %b
ret float %result
}
define float @test_fsqrt_nnan_ninf(float %a) {
; CHECK-LABEL: test_fsqrt_nnan_ninf:
; CHECK: sqrt.s
%result = call nnan ninf float @llvm.sqrt.f32(float %a)
ret float %result
}
declare float @llvm.sqrt.f32(float)