| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zfh \ |
| ; RUN: -verify-machineinstrs -target-abi ilp32f | \ |
| ; RUN: FileCheck -check-prefixes=CHECKIZFH %s |
| ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zfh \ |
| ; RUN: -verify-machineinstrs -target-abi lp64f | \ |
| ; RUN: FileCheck -check-prefixes=CHECKIZFH %s |
| ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zhinx \ |
| ; RUN: -verify-machineinstrs -target-abi ilp32 | \ |
| ; RUN: FileCheck -check-prefixes=CHECKIZHINX %s |
| ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zhinx \ |
| ; RUN: -verify-machineinstrs -target-abi lp64 | \ |
| ; RUN: FileCheck -check-prefixes=CHECKIZHINX %s |
| |
| declare half @llvm.minimum.f16(half, half) |
| |
| define half @fminimum_f16(half %a, half %b) nounwind { |
| ; CHECKIZFH-LABEL: fminimum_f16: |
| ; CHECKIZFH: # %bb.0: |
| ; CHECKIZFH-NEXT: feq.h a0, fa0, fa0 |
| ; CHECKIZFH-NEXT: fmv.h fa5, fa1 |
| ; CHECKIZFH-NEXT: beqz a0, .LBB0_3 |
| ; CHECKIZFH-NEXT: # %bb.1: |
| ; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 |
| ; CHECKIZFH-NEXT: beqz a0, .LBB0_4 |
| ; CHECKIZFH-NEXT: .LBB0_2: |
| ; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa5 |
| ; CHECKIZFH-NEXT: ret |
| ; CHECKIZFH-NEXT: .LBB0_3: |
| ; CHECKIZFH-NEXT: fmv.h fa5, fa0 |
| ; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 |
| ; CHECKIZFH-NEXT: bnez a0, .LBB0_2 |
| ; CHECKIZFH-NEXT: .LBB0_4: |
| ; CHECKIZFH-NEXT: fmin.h fa0, fa1, fa5 |
| ; CHECKIZFH-NEXT: ret |
| ; |
| ; CHECKIZHINX-LABEL: fminimum_f16: |
| ; CHECKIZHINX: # %bb.0: |
| ; CHECKIZHINX-NEXT: feq.h a3, a0, a0 |
| ; CHECKIZHINX-NEXT: mv a2, a1 |
| ; CHECKIZHINX-NEXT: beqz a3, .LBB0_3 |
| ; CHECKIZHINX-NEXT: # %bb.1: |
| ; CHECKIZHINX-NEXT: feq.h a3, a1, a1 |
| ; CHECKIZHINX-NEXT: beqz a3, .LBB0_4 |
| ; CHECKIZHINX-NEXT: .LBB0_2: |
| ; CHECKIZHINX-NEXT: fmin.h a0, a0, a2 |
| ; CHECKIZHINX-NEXT: ret |
| ; CHECKIZHINX-NEXT: .LBB0_3: |
| ; CHECKIZHINX-NEXT: mv a2, a0 |
| ; CHECKIZHINX-NEXT: feq.h a3, a1, a1 |
| ; CHECKIZHINX-NEXT: bnez a3, .LBB0_2 |
| ; CHECKIZHINX-NEXT: .LBB0_4: |
| ; CHECKIZHINX-NEXT: fmin.h a0, a1, a2 |
| ; CHECKIZHINX-NEXT: ret |
| %1 = call half @llvm.minimum.f16(half %a, half %b) |
| ret half %1 |
| } |
| |
| declare half @llvm.maximum.f16(half, half) |
| |
| define half @fmaximum_f16(half %a, half %b) nounwind { |
| ; CHECKIZFH-LABEL: fmaximum_f16: |
| ; CHECKIZFH: # %bb.0: |
| ; CHECKIZFH-NEXT: feq.h a0, fa0, fa0 |
| ; CHECKIZFH-NEXT: fmv.h fa5, fa1 |
| ; CHECKIZFH-NEXT: beqz a0, .LBB1_3 |
| ; CHECKIZFH-NEXT: # %bb.1: |
| ; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 |
| ; CHECKIZFH-NEXT: beqz a0, .LBB1_4 |
| ; CHECKIZFH-NEXT: .LBB1_2: |
| ; CHECKIZFH-NEXT: fmax.h fa0, fa0, fa5 |
| ; CHECKIZFH-NEXT: ret |
| ; CHECKIZFH-NEXT: .LBB1_3: |
| ; CHECKIZFH-NEXT: fmv.h fa5, fa0 |
| ; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 |
| ; CHECKIZFH-NEXT: bnez a0, .LBB1_2 |
| ; CHECKIZFH-NEXT: .LBB1_4: |
| ; CHECKIZFH-NEXT: fmax.h fa0, fa1, fa5 |
| ; CHECKIZFH-NEXT: ret |
| ; |
| ; CHECKIZHINX-LABEL: fmaximum_f16: |
| ; CHECKIZHINX: # %bb.0: |
| ; CHECKIZHINX-NEXT: feq.h a3, a0, a0 |
| ; CHECKIZHINX-NEXT: mv a2, a1 |
| ; CHECKIZHINX-NEXT: beqz a3, .LBB1_3 |
| ; CHECKIZHINX-NEXT: # %bb.1: |
| ; CHECKIZHINX-NEXT: feq.h a3, a1, a1 |
| ; CHECKIZHINX-NEXT: beqz a3, .LBB1_4 |
| ; CHECKIZHINX-NEXT: .LBB1_2: |
| ; CHECKIZHINX-NEXT: fmax.h a0, a0, a2 |
| ; CHECKIZHINX-NEXT: ret |
| ; CHECKIZHINX-NEXT: .LBB1_3: |
| ; CHECKIZHINX-NEXT: mv a2, a0 |
| ; CHECKIZHINX-NEXT: feq.h a3, a1, a1 |
| ; CHECKIZHINX-NEXT: bnez a3, .LBB1_2 |
| ; CHECKIZHINX-NEXT: .LBB1_4: |
| ; CHECKIZHINX-NEXT: fmax.h a0, a1, a2 |
| ; CHECKIZHINX-NEXT: ret |
| %1 = call half @llvm.maximum.f16(half %a, half %b) |
| ret half %1 |
| } |
| |
| define half @fminimum_nnan_f16(half %a, half %b) nounwind { |
| ; CHECKIZFH-LABEL: fminimum_nnan_f16: |
| ; CHECKIZFH: # %bb.0: |
| ; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa1 |
| ; CHECKIZFH-NEXT: ret |
| ; |
| ; CHECKIZHINX-LABEL: fminimum_nnan_f16: |
| ; CHECKIZHINX: # %bb.0: |
| ; CHECKIZHINX-NEXT: fmin.h a0, a0, a1 |
| ; CHECKIZHINX-NEXT: ret |
| %1 = call nnan half @llvm.minimum.f16(half %a, half %b) |
| ret half %1 |
| } |
| |
| define half @fmaximum_nnan_f16(half %a, half %b) nounwind { |
| ; CHECKIZFH-LABEL: fmaximum_nnan_f16: |
| ; CHECKIZFH: # %bb.0: |
| ; CHECKIZFH-NEXT: fmax.h fa0, fa0, fa1 |
| ; CHECKIZFH-NEXT: ret |
| ; |
| ; CHECKIZHINX-LABEL: fmaximum_nnan_f16: |
| ; CHECKIZHINX: # %bb.0: |
| ; CHECKIZHINX-NEXT: fmax.h a0, a0, a1 |
| ; CHECKIZHINX-NEXT: ret |
| %1 = call nnan half @llvm.maximum.f16(half %a, half %b) |
| ret half %1 |
| } |
| |
| define half @fminimum_nnan_attr_f16(half %a, half %b) nounwind "no-nans-fp-math"="true" { |
| ; CHECKIZFH-LABEL: fminimum_nnan_attr_f16: |
| ; CHECKIZFH: # %bb.0: |
| ; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa1 |
| ; CHECKIZFH-NEXT: ret |
| ; |
| ; CHECKIZHINX-LABEL: fminimum_nnan_attr_f16: |
| ; CHECKIZHINX: # %bb.0: |
| ; CHECKIZHINX-NEXT: fmin.h a0, a0, a1 |
| ; CHECKIZHINX-NEXT: ret |
| %1 = call half @llvm.minimum.f16(half %a, half %b) |
| ret half %1 |
| } |
| |
| define half @fminimum_nnan_op_f16(half %a, half %b) nounwind { |
| ; CHECKIZFH-LABEL: fminimum_nnan_op_f16: |
| ; CHECKIZFH: # %bb.0: |
| ; CHECKIZFH-NEXT: feq.h a0, fa0, fa0 |
| ; CHECKIZFH-NEXT: bnez a0, .LBB5_2 |
| ; CHECKIZFH-NEXT: # %bb.1: |
| ; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa0 |
| ; CHECKIZFH-NEXT: ret |
| ; CHECKIZFH-NEXT: .LBB5_2: |
| ; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa0 |
| ; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa5 |
| ; CHECKIZFH-NEXT: ret |
| ; |
| ; CHECKIZHINX-LABEL: fminimum_nnan_op_f16: |
| ; CHECKIZHINX: # %bb.0: |
| ; CHECKIZHINX-NEXT: feq.h a1, a0, a0 |
| ; CHECKIZHINX-NEXT: bnez a1, .LBB5_2 |
| ; CHECKIZHINX-NEXT: # %bb.1: |
| ; CHECKIZHINX-NEXT: fmin.h a0, a0, a0 |
| ; CHECKIZHINX-NEXT: ret |
| ; CHECKIZHINX-NEXT: .LBB5_2: |
| ; CHECKIZHINX-NEXT: fadd.h a1, a0, a0 |
| ; CHECKIZHINX-NEXT: fmin.h a0, a0, a1 |
| ; CHECKIZHINX-NEXT: ret |
| %c = fadd nnan half %a, %a |
| %1 = call half @llvm.minimum.f16(half %a, half %c) |
| ret half %1 |
| } |
| |
| define half @fmaximum_nnan_op_f16(half %a, half %b) nounwind { |
| ; CHECKIZFH-LABEL: fmaximum_nnan_op_f16: |
| ; CHECKIZFH: # %bb.0: |
| ; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa1 |
| ; CHECKIZFH-NEXT: fsub.h fa4, fa0, fa1 |
| ; CHECKIZFH-NEXT: fmax.h fa0, fa5, fa4 |
| ; CHECKIZFH-NEXT: ret |
| ; |
| ; CHECKIZHINX-LABEL: fmaximum_nnan_op_f16: |
| ; CHECKIZHINX: # %bb.0: |
| ; CHECKIZHINX-NEXT: fadd.h a2, a0, a1 |
| ; CHECKIZHINX-NEXT: fsub.h a0, a0, a1 |
| ; CHECKIZHINX-NEXT: fmax.h a0, a2, a0 |
| ; CHECKIZHINX-NEXT: ret |
| %c = fadd nnan half %a, %b |
| %d = fsub nnan half %a, %b |
| %1 = call half @llvm.maximum.f16(half %c, half %d) |
| ret half %1 |
| } |