; Test that floating-point instructions that set cc are used to ; eliminate compares for load complement, load negative and load ; positive. ; ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s ; Load complement (sign-bit flipped). ; Test f32 define float @f1(float %a, float %b, float %f) { ; CHECK-LABEL: f1: ; CHECK: ltebr ; CHECK-NEXT: ber %r14 %neg = fsub float -0.0, %f %cond = fcmp oeq float %neg, 0.0 %res = select i1 %cond, float %a, float %b ret float %res } ; Test f64 define double @f2(double %a, double %b, double %f) { ; CHECK-LABEL: f2: ; CHECK: ltdbr ; CHECK-NEXT: ber %r14 %neg = fsub double -0.0, %f %cond = fcmp oeq double %neg, 0.0 %res = select i1 %cond, double %a, double %b ret double %res } ; Negation of floating-point absolute. ; Test f32 declare float @llvm.fabs.f32(float %f) define float @f3(float %a, float %b, float %f) { ; CHECK-LABEL: f3: ; CHECK: lpebr ; CHECK-NEXT: ber %r14 %abs = call float @llvm.fabs.f32(float %f) %neg = fsub float -0.0, %abs %cond = fcmp oeq float %neg, 0.0 %res = select i1 %cond, float %a, float %b ret float %res } ; Test f64 declare double @llvm.fabs.f64(double %f) define double @f4(double %a, double %b, double %f) { ; CHECK-LABEL: f4: ; CHECK: lpdbr ; CHECK-NEXT: ber %r14 %abs = call double @llvm.fabs.f64(double %f) %neg = fsub double -0.0, %abs %cond = fcmp oeq double %neg, 0.0 %res = select i1 %cond, double %a, double %b ret double %res } ; Absolute floating-point value. ; Test f32 define float @f5(float %a, float %b, float %f) { ; CHECK-LABEL: f5: ; CHECK: lpebr ; CHECK-NEXT: ber %r14 %abs = call float @llvm.fabs.f32(float %f) %cond = fcmp oeq float %abs, 0.0 %res = select i1 %cond, float %a, float %b ret float %res } ; Test f64 define double @f6(double %a, double %b, double %f) { ; CHECK-LABEL: f6: ; CHECK: lpdbr ; CHECK-NEXT: ber %r14 %abs = call double @llvm.fabs.f64(double %f) %cond = fcmp oeq double %abs, 0.0 %res = select i1 %cond, double %a, double %b ret double %res }