| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s |
| |
| define float @pseudo_fmin_float(float %x, float %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_float: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: wfminsb %f0, %f0, %f2, 2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call i1 @llvm.experimental.constrained.fcmps(float %x, float %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select i1 %cmp, float %x, float %y |
| ret float %sel |
| } |
| |
| define float @pseudo_fmin_float_wrong_fcmp(float %x, float %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_float_wrong_fcmp: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: cebr %f0, %f2 |
| ; CHECK-NEXT: blr %r14 |
| ; CHECK-NEXT: .LBB1_1: |
| ; CHECK-NEXT: ldr %f0, %f2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call i1 @llvm.experimental.constrained.fcmp(float %x, float %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select i1 %cmp, float %x, float %y |
| ret float %sel |
| } |
| |
| define float @pseudo_fmin_float_wrong_pred1(float %x, float %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_float_wrong_pred1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: kebr %f0, %f2 |
| ; CHECK-NEXT: bler %r14 |
| ; CHECK-NEXT: .LBB2_1: |
| ; CHECK-NEXT: ldr %f0, %f2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call i1 @llvm.experimental.constrained.fcmps(float %x, float %y, metadata !"ole", metadata !"fpexcept.strict") strictfp |
| %sel = select i1 %cmp, float %x, float %y |
| ret float %sel |
| } |
| |
| define float @pseudo_fmin_float_wrong_pred2(float %x, float %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_float_wrong_pred2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: kebr %f0, %f2 |
| ; CHECK-NEXT: bnher %r14 |
| ; CHECK-NEXT: .LBB3_1: |
| ; CHECK-NEXT: ldr %f0, %f2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call i1 @llvm.experimental.constrained.fcmps(float %x, float %y, metadata !"ult", metadata !"fpexcept.strict") strictfp |
| %sel = select i1 %cmp, float %x, float %y |
| ret float %sel |
| } |
| |
| define double @pseudo_fmin_double(double %x, double %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_double: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: wfmindb %f0, %f0, %f2, 2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call i1 @llvm.experimental.constrained.fcmps(double %x, double %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select i1 %cmp, double %x, double %y |
| ret double %sel |
| } |
| |
| define fp128 @pseudo_fmin_fp128(fp128 %x, fp128 %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_fp128: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vl %v0, 0(%r4), 3 |
| ; CHECK-NEXT: vl %v1, 0(%r3), 3 |
| ; CHECK-NEXT: wfminxb %v0, %v1, %v0, 2 |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call i1 @llvm.experimental.constrained.fcmps(fp128 %x, fp128 %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select i1 %cmp, fp128 %x, fp128 %y |
| ret fp128 %sel |
| } |
| |
| define half @pseudo_fmin_half(half %x, half %y) strictfp nounwind { |
| ; CHECK-LABEL: pseudo_fmin_half: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: stmg %r14, %r15, 112(%r15) |
| ; CHECK-NEXT: aghi %r15, -192 |
| ; CHECK-NEXT: std %f8, 184(%r15) # 8-byte Spill |
| ; CHECK-NEXT: std %f9, 176(%r15) # 8-byte Spill |
| ; CHECK-NEXT: std %f10, 168(%r15) # 8-byte Spill |
| ; CHECK-NEXT: std %f11, 160(%r15) # 8-byte Spill |
| ; CHECK-NEXT: ldr %f8, %f0 |
| ; CHECK-NEXT: ldr %f0, %f2 |
| ; CHECK-NEXT: ldr %f9, %f2 |
| ; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT |
| ; CHECK-NEXT: ldr %f10, %f0 |
| ; CHECK-NEXT: ldr %f0, %f8 |
| ; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT |
| ; CHECK-NEXT: ldr %f11, %f0 |
| ; CHECK-NEXT: ldr %f0, %f8 |
| ; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT |
| ; CHECK-NEXT: ldr %f8, %f0 |
| ; CHECK-NEXT: ldr %f0, %f9 |
| ; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT |
| ; CHECK-NEXT: kebr %f11, %f10 |
| ; CHECK-NEXT: jl .LBB6_2 |
| ; CHECK-NEXT: # %bb.1: |
| ; CHECK-NEXT: ldr %f8, %f0 |
| ; CHECK-NEXT: .LBB6_2: |
| ; CHECK-NEXT: ldr %f0, %f8 |
| ; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT |
| ; CHECK-NEXT: ld %f8, 184(%r15) # 8-byte Reload |
| ; CHECK-NEXT: ld %f9, 176(%r15) # 8-byte Reload |
| ; CHECK-NEXT: ld %f10, 168(%r15) # 8-byte Reload |
| ; CHECK-NEXT: ld %f11, 160(%r15) # 8-byte Reload |
| ; CHECK-NEXT: lmg %r14, %r15, 304(%r15) |
| ; CHECK-NEXT: br %r14 |
| %cmp = call i1 @llvm.experimental.constrained.fcmps(half %x, half %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select i1 %cmp, half %x, half %y |
| ret half %sel |
| } |
| |
| define <4 x float> @pseudo_fmin_v4f32(<4 x float> %x, <4 x float> %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_v4f32: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vfminsb %v24, %v24, %v26, 2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call <4 x i1> @llvm.experimental.constrained.fcmps(<4 x float> %x, <4 x float> %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select <4 x i1> %cmp, <4 x float> %x, <4 x float> %y |
| ret <4 x float> %sel |
| } |
| |
| define <2 x double> @pseudo_fmin_v2f64(<2 x double> %x, <2 x double> %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_v2f64: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vfmindb %v24, %v24, %v26, 2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call <2 x i1> @llvm.experimental.constrained.fcmps(<2 x double> %x, <2 x double> %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select <2 x i1> %cmp, <2 x double> %x, <2 x double> %y |
| ret <2 x double> %sel |
| } |
| |
| define <4 x double> @pseudo_fmin_v4f64(<4 x double> %x, <4 x double> %y) strictfp { |
| ; CHECK-LABEL: pseudo_fmin_v4f64: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vfmindb %v24, %v24, %v28, 2 |
| ; CHECK-NEXT: vfmindb %v26, %v26, %v30, 2 |
| ; CHECK-NEXT: br %r14 |
| %cmp = call <4 x i1> @llvm.experimental.constrained.fcmps(<4 x double> %x, <4 x double> %y, metadata !"olt", metadata !"fpexcept.strict") strictfp |
| %sel = select <4 x i1> %cmp, <4 x double> %x, <4 x double> %y |
| ret <4 x double> %sel |
| } |