| ; 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) |