mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 14:16:08 +00:00

Using the nonans FMF and the DAG.isKnownNeverNaN on the inputs. Reviewed By: fakepaper56 Differential Revision: https://reviews.llvm.org/D156748
193 lines
6.3 KiB
LLVM
193 lines
6.3 KiB
LLVM
; 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
|
|
}
|