149429783SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 249429783SCraig Topper; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zfh \ 349429783SCraig Topper; RUN: -verify-machineinstrs -target-abi ilp32f | \ 449429783SCraig Topper; RUN: FileCheck -check-prefixes=CHECKIZFH %s 549429783SCraig Topper; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zfh \ 649429783SCraig Topper; RUN: -verify-machineinstrs -target-abi lp64f | \ 749429783SCraig Topper; RUN: FileCheck -check-prefixes=CHECKIZFH %s 849429783SCraig Topper; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zhinx \ 949429783SCraig Topper; RUN: -verify-machineinstrs -target-abi ilp32 | \ 1049429783SCraig Topper; RUN: FileCheck -check-prefixes=CHECKIZHINX %s 1149429783SCraig Topper; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zhinx \ 1249429783SCraig Topper; RUN: -verify-machineinstrs -target-abi lp64 | \ 1349429783SCraig Topper; RUN: FileCheck -check-prefixes=CHECKIZHINX %s 1449429783SCraig Topper 1549429783SCraig Topperdeclare half @llvm.minimum.f16(half, half) 1649429783SCraig Topper 1749429783SCraig Topperdefine half @fminimum_f16(half %a, half %b) nounwind { 1849429783SCraig Topper; CHECKIZFH-LABEL: fminimum_f16: 1949429783SCraig Topper; CHECKIZFH: # %bb.0: 2049429783SCraig Topper; CHECKIZFH-NEXT: feq.h a0, fa0, fa0 2149429783SCraig Topper; CHECKIZFH-NEXT: fmv.h fa5, fa1 2249429783SCraig Topper; CHECKIZFH-NEXT: beqz a0, .LBB0_3 2349429783SCraig Topper; CHECKIZFH-NEXT: # %bb.1: 2449429783SCraig Topper; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 2549429783SCraig Topper; CHECKIZFH-NEXT: beqz a0, .LBB0_4 2649429783SCraig Topper; CHECKIZFH-NEXT: .LBB0_2: 2749429783SCraig Topper; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa5 2849429783SCraig Topper; CHECKIZFH-NEXT: ret 2949429783SCraig Topper; CHECKIZFH-NEXT: .LBB0_3: 3049429783SCraig Topper; CHECKIZFH-NEXT: fmv.h fa5, fa0 3149429783SCraig Topper; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 3249429783SCraig Topper; CHECKIZFH-NEXT: bnez a0, .LBB0_2 3349429783SCraig Topper; CHECKIZFH-NEXT: .LBB0_4: 3449429783SCraig Topper; CHECKIZFH-NEXT: fmin.h fa0, fa1, fa5 3549429783SCraig Topper; CHECKIZFH-NEXT: ret 3649429783SCraig Topper; 3749429783SCraig Topper; CHECKIZHINX-LABEL: fminimum_f16: 3849429783SCraig Topper; CHECKIZHINX: # %bb.0: 3949429783SCraig Topper; CHECKIZHINX-NEXT: feq.h a3, a0, a0 4049429783SCraig Topper; CHECKIZHINX-NEXT: mv a2, a1 4149429783SCraig Topper; CHECKIZHINX-NEXT: beqz a3, .LBB0_3 4249429783SCraig Topper; CHECKIZHINX-NEXT: # %bb.1: 4349429783SCraig Topper; CHECKIZHINX-NEXT: feq.h a3, a1, a1 4449429783SCraig Topper; CHECKIZHINX-NEXT: beqz a3, .LBB0_4 4549429783SCraig Topper; CHECKIZHINX-NEXT: .LBB0_2: 4649429783SCraig Topper; CHECKIZHINX-NEXT: fmin.h a0, a0, a2 4749429783SCraig Topper; CHECKIZHINX-NEXT: ret 4849429783SCraig Topper; CHECKIZHINX-NEXT: .LBB0_3: 4949429783SCraig Topper; CHECKIZHINX-NEXT: mv a2, a0 5049429783SCraig Topper; CHECKIZHINX-NEXT: feq.h a3, a1, a1 5149429783SCraig Topper; CHECKIZHINX-NEXT: bnez a3, .LBB0_2 5249429783SCraig Topper; CHECKIZHINX-NEXT: .LBB0_4: 5349429783SCraig Topper; CHECKIZHINX-NEXT: fmin.h a0, a1, a2 5449429783SCraig Topper; CHECKIZHINX-NEXT: ret 5549429783SCraig Topper %1 = call half @llvm.minimum.f16(half %a, half %b) 5649429783SCraig Topper ret half %1 5749429783SCraig Topper} 5849429783SCraig Topper 5949429783SCraig Topperdeclare half @llvm.maximum.f16(half, half) 6049429783SCraig Topper 6149429783SCraig Topperdefine half @fmaximum_f16(half %a, half %b) nounwind { 6249429783SCraig Topper; CHECKIZFH-LABEL: fmaximum_f16: 6349429783SCraig Topper; CHECKIZFH: # %bb.0: 6449429783SCraig Topper; CHECKIZFH-NEXT: feq.h a0, fa0, fa0 6549429783SCraig Topper; CHECKIZFH-NEXT: fmv.h fa5, fa1 6649429783SCraig Topper; CHECKIZFH-NEXT: beqz a0, .LBB1_3 6749429783SCraig Topper; CHECKIZFH-NEXT: # %bb.1: 6849429783SCraig Topper; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 6949429783SCraig Topper; CHECKIZFH-NEXT: beqz a0, .LBB1_4 7049429783SCraig Topper; CHECKIZFH-NEXT: .LBB1_2: 7149429783SCraig Topper; CHECKIZFH-NEXT: fmax.h fa0, fa0, fa5 7249429783SCraig Topper; CHECKIZFH-NEXT: ret 7349429783SCraig Topper; CHECKIZFH-NEXT: .LBB1_3: 7449429783SCraig Topper; CHECKIZFH-NEXT: fmv.h fa5, fa0 7549429783SCraig Topper; CHECKIZFH-NEXT: feq.h a0, fa1, fa1 7649429783SCraig Topper; CHECKIZFH-NEXT: bnez a0, .LBB1_2 7749429783SCraig Topper; CHECKIZFH-NEXT: .LBB1_4: 7849429783SCraig Topper; CHECKIZFH-NEXT: fmax.h fa0, fa1, fa5 7949429783SCraig Topper; CHECKIZFH-NEXT: ret 8049429783SCraig Topper; 8149429783SCraig Topper; CHECKIZHINX-LABEL: fmaximum_f16: 8249429783SCraig Topper; CHECKIZHINX: # %bb.0: 8349429783SCraig Topper; CHECKIZHINX-NEXT: feq.h a3, a0, a0 8449429783SCraig Topper; CHECKIZHINX-NEXT: mv a2, a1 8549429783SCraig Topper; CHECKIZHINX-NEXT: beqz a3, .LBB1_3 8649429783SCraig Topper; CHECKIZHINX-NEXT: # %bb.1: 8749429783SCraig Topper; CHECKIZHINX-NEXT: feq.h a3, a1, a1 8849429783SCraig Topper; CHECKIZHINX-NEXT: beqz a3, .LBB1_4 8949429783SCraig Topper; CHECKIZHINX-NEXT: .LBB1_2: 9049429783SCraig Topper; CHECKIZHINX-NEXT: fmax.h a0, a0, a2 9149429783SCraig Topper; CHECKIZHINX-NEXT: ret 9249429783SCraig Topper; CHECKIZHINX-NEXT: .LBB1_3: 9349429783SCraig Topper; CHECKIZHINX-NEXT: mv a2, a0 9449429783SCraig Topper; CHECKIZHINX-NEXT: feq.h a3, a1, a1 9549429783SCraig Topper; CHECKIZHINX-NEXT: bnez a3, .LBB1_2 9649429783SCraig Topper; CHECKIZHINX-NEXT: .LBB1_4: 9749429783SCraig Topper; CHECKIZHINX-NEXT: fmax.h a0, a1, a2 9849429783SCraig Topper; CHECKIZHINX-NEXT: ret 9949429783SCraig Topper %1 = call half @llvm.maximum.f16(half %a, half %b) 10049429783SCraig Topper ret half %1 10149429783SCraig Topper} 102*048458f9SCraig Topper 103*048458f9SCraig Topperdefine half @fminimum_nnan_f16(half %a, half %b) nounwind { 104*048458f9SCraig Topper; CHECKIZFH-LABEL: fminimum_nnan_f16: 105*048458f9SCraig Topper; CHECKIZFH: # %bb.0: 106*048458f9SCraig Topper; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa1 107*048458f9SCraig Topper; CHECKIZFH-NEXT: ret 108*048458f9SCraig Topper; 109*048458f9SCraig Topper; CHECKIZHINX-LABEL: fminimum_nnan_f16: 110*048458f9SCraig Topper; CHECKIZHINX: # %bb.0: 111*048458f9SCraig Topper; CHECKIZHINX-NEXT: fmin.h a0, a0, a1 112*048458f9SCraig Topper; CHECKIZHINX-NEXT: ret 113*048458f9SCraig Topper %1 = call nnan half @llvm.minimum.f16(half %a, half %b) 114*048458f9SCraig Topper ret half %1 115*048458f9SCraig Topper} 116*048458f9SCraig Topper 117*048458f9SCraig Topperdefine half @fmaximum_nnan_f16(half %a, half %b) nounwind { 118*048458f9SCraig Topper; CHECKIZFH-LABEL: fmaximum_nnan_f16: 119*048458f9SCraig Topper; CHECKIZFH: # %bb.0: 120*048458f9SCraig Topper; CHECKIZFH-NEXT: fmax.h fa0, fa0, fa1 121*048458f9SCraig Topper; CHECKIZFH-NEXT: ret 122*048458f9SCraig Topper; 123*048458f9SCraig Topper; CHECKIZHINX-LABEL: fmaximum_nnan_f16: 124*048458f9SCraig Topper; CHECKIZHINX: # %bb.0: 125*048458f9SCraig Topper; CHECKIZHINX-NEXT: fmax.h a0, a0, a1 126*048458f9SCraig Topper; CHECKIZHINX-NEXT: ret 127*048458f9SCraig Topper %1 = call nnan half @llvm.maximum.f16(half %a, half %b) 128*048458f9SCraig Topper ret half %1 129*048458f9SCraig Topper} 130*048458f9SCraig Topper 131*048458f9SCraig Topperdefine half @fminimum_nnan_attr_f16(half %a, half %b) nounwind "no-nans-fp-math"="true" { 132*048458f9SCraig Topper; CHECKIZFH-LABEL: fminimum_nnan_attr_f16: 133*048458f9SCraig Topper; CHECKIZFH: # %bb.0: 134*048458f9SCraig Topper; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa1 135*048458f9SCraig Topper; CHECKIZFH-NEXT: ret 136*048458f9SCraig Topper; 137*048458f9SCraig Topper; CHECKIZHINX-LABEL: fminimum_nnan_attr_f16: 138*048458f9SCraig Topper; CHECKIZHINX: # %bb.0: 139*048458f9SCraig Topper; CHECKIZHINX-NEXT: fmin.h a0, a0, a1 140*048458f9SCraig Topper; CHECKIZHINX-NEXT: ret 141*048458f9SCraig Topper %1 = call half @llvm.minimum.f16(half %a, half %b) 142*048458f9SCraig Topper ret half %1 143*048458f9SCraig Topper} 144*048458f9SCraig Topper 145*048458f9SCraig Topperdefine half @fminimum_nnan_op_f16(half %a, half %b) nounwind { 146*048458f9SCraig Topper; CHECKIZFH-LABEL: fminimum_nnan_op_f16: 147*048458f9SCraig Topper; CHECKIZFH: # %bb.0: 148*048458f9SCraig Topper; CHECKIZFH-NEXT: feq.h a0, fa0, fa0 149*048458f9SCraig Topper; CHECKIZFH-NEXT: bnez a0, .LBB5_2 150*048458f9SCraig Topper; CHECKIZFH-NEXT: # %bb.1: 151*048458f9SCraig Topper; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa0 152*048458f9SCraig Topper; CHECKIZFH-NEXT: ret 153*048458f9SCraig Topper; CHECKIZFH-NEXT: .LBB5_2: 154*048458f9SCraig Topper; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa0 155*048458f9SCraig Topper; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa5 156*048458f9SCraig Topper; CHECKIZFH-NEXT: ret 157*048458f9SCraig Topper; 158*048458f9SCraig Topper; CHECKIZHINX-LABEL: fminimum_nnan_op_f16: 159*048458f9SCraig Topper; CHECKIZHINX: # %bb.0: 160*048458f9SCraig Topper; CHECKIZHINX-NEXT: feq.h a1, a0, a0 161*048458f9SCraig Topper; CHECKIZHINX-NEXT: bnez a1, .LBB5_2 162*048458f9SCraig Topper; CHECKIZHINX-NEXT: # %bb.1: 163*048458f9SCraig Topper; CHECKIZHINX-NEXT: fmin.h a0, a0, a0 164*048458f9SCraig Topper; CHECKIZHINX-NEXT: ret 165*048458f9SCraig Topper; CHECKIZHINX-NEXT: .LBB5_2: 166*048458f9SCraig Topper; CHECKIZHINX-NEXT: fadd.h a1, a0, a0 167*048458f9SCraig Topper; CHECKIZHINX-NEXT: fmin.h a0, a0, a1 168*048458f9SCraig Topper; CHECKIZHINX-NEXT: ret 169*048458f9SCraig Topper %c = fadd nnan half %a, %a 170*048458f9SCraig Topper %1 = call half @llvm.minimum.f16(half %a, half %c) 171*048458f9SCraig Topper ret half %1 172*048458f9SCraig Topper} 173*048458f9SCraig Topper 174*048458f9SCraig Topperdefine half @fmaximum_nnan_op_f16(half %a, half %b) nounwind { 175*048458f9SCraig Topper; CHECKIZFH-LABEL: fmaximum_nnan_op_f16: 176*048458f9SCraig Topper; CHECKIZFH: # %bb.0: 177*048458f9SCraig Topper; CHECKIZFH-NEXT: fadd.h fa5, fa0, fa1 178*048458f9SCraig Topper; CHECKIZFH-NEXT: fsub.h fa4, fa0, fa1 179*048458f9SCraig Topper; CHECKIZFH-NEXT: fmax.h fa0, fa5, fa4 180*048458f9SCraig Topper; CHECKIZFH-NEXT: ret 181*048458f9SCraig Topper; 182*048458f9SCraig Topper; CHECKIZHINX-LABEL: fmaximum_nnan_op_f16: 183*048458f9SCraig Topper; CHECKIZHINX: # %bb.0: 184*048458f9SCraig Topper; CHECKIZHINX-NEXT: fadd.h a2, a0, a1 185*048458f9SCraig Topper; CHECKIZHINX-NEXT: fsub.h a0, a0, a1 186*048458f9SCraig Topper; CHECKIZHINX-NEXT: fmax.h a0, a2, a0 187*048458f9SCraig Topper; CHECKIZHINX-NEXT: ret 188*048458f9SCraig Topper %c = fadd nnan half %a, %b 189*048458f9SCraig Topper %d = fsub nnan half %a, %b 190*048458f9SCraig Topper %1 = call half @llvm.maximum.f16(half %c, half %d) 191*048458f9SCraig Topper ret half %1 192*048458f9SCraig Topper} 193