| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ |
| ; RUN: < %s -mtriple=powerpc64-unknown-linux -mcpu=pwr8 | FileCheck %s \ |
| ; RUN: -check-prefix=P8 |
| ; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ |
| ; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 \ |
| ; RUN: | FileCheck %s -check-prefix=P9 |
| ; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ |
| ; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 -mattr=-vsx | \ |
| ; RUN: FileCheck %s -check-prefix=NOVSX |
| |
| define i32 @test_f32_oeq_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_oeq_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_oeq_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_oeq_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"oeq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ogt_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ogt_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ogt_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ogt_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"ogt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_oge_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_oge_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, lt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_oge_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, lt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_oge_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, lt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"oge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_olt_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_olt_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_olt_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_olt_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"olt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ole_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ole_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, gt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ole_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, gt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ole_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, gt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"ole", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_one_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_one_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, eq |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_one_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, eq |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_one_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, eq |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"one", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ord_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ord_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isel r3, r4, r3, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ord_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isel r3, r4, r3, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ord_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r4, r3, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"ord", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ueq_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ueq_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, eq, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ueq_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, eq, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ueq_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, eq, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"ueq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ugt_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ugt_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, gt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ugt_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, gt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ugt_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, gt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"ugt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_uge_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_uge_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_uge_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_uge_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"uge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ult_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ult_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, lt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ult_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, lt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ult_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, lt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"ult", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ule_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ule_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ule_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ule_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"ule", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_une_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_une_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_une_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_une_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"une", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_uno_q(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_uno_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isel r3, r3, r4, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_uno_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isel r3, r3, r4, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_uno_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r3, r4, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f32( |
| float %f1, float %f2, metadata !"uno", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_oeq_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_oeq_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_oeq_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_oeq_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"oeq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ogt_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ogt_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ogt_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ogt_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"ogt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_oge_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_oge_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, lt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_oge_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, lt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_oge_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, lt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"oge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_olt_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_olt_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_olt_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_olt_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"olt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ole_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ole_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, gt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ole_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, gt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ole_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, gt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"ole", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_one_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_one_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, eq |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_one_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, eq |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_one_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, eq |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"one", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ord_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ord_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isel r3, r4, r3, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ord_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isel r3, r4, r3, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ord_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r4, r3, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"ord", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ueq_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ueq_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, eq, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ueq_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, eq, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ueq_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, eq, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"ueq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ugt_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ugt_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, gt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ugt_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, gt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ugt_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, gt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"ugt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_uge_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_uge_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_uge_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_uge_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"uge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ult_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ult_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, lt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ult_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, lt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ult_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, lt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"ult", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ule_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ule_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ule_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ule_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"ule", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_une_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_une_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_une_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_une_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"une", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_uno_q(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_uno_q: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f2 |
| ; P8-NEXT: isel r3, r3, r4, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_uno_q: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f2 |
| ; P9-NEXT: isel r3, r3, r4, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_uno_q: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r3, r4, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmp.f64( |
| double %f1, double %f2, metadata !"uno", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_oeq_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_oeq_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_oeq_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_oeq_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"oeq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ogt_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ogt_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ogt_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ogt_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"ogt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_oge_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_oge_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, lt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_oge_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, lt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_oge_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, lt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"oge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_olt_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_olt_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_olt_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_olt_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"olt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ole_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ole_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, gt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ole_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, gt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ole_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, gt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"ole", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_one_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_one_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, eq |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_one_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, eq |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_one_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, eq |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"one", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ord_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ord_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isel r3, r4, r3, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ord_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isel r3, r4, r3, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ord_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r4, r3, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"ord", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ueq_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ueq_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, eq, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ueq_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, eq, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ueq_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, eq, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"ueq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ugt_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ugt_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, gt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ugt_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, gt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ugt_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, gt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"ugt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_uge_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_uge_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_uge_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_uge_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"uge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ult_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ult_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, lt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ult_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, lt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ult_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, lt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"ult", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_ule_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_ule_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_ule_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_ule_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"ule", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_une_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_une_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_une_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_une_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"une", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f32_uno_s(i32 %a, i32 %b, float %f1, float %f2) #0 { |
| ; P8-LABEL: test_f32_uno_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isel r3, r3, r4, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f32_uno_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isel r3, r3, r4, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f32_uno_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r3, r4, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f32( |
| float %f1, float %f2, metadata !"uno", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_oeq_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_oeq_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_oeq_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_oeq_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"oeq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ogt_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ogt_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ogt_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ogt_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"ogt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_oge_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_oge_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, lt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_oge_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, lt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_oge_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, lt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"oge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_olt_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_olt_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r3, r4 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_olt_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r3, r4 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_olt_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r3, r4 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"olt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ole_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ole_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, gt |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ole_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, gt |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ole_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, gt |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"ole", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_one_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_one_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: crnor 4*cr5+lt, un, eq |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_one_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: crnor 4*cr5+lt, un, eq |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_one_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, eq |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"one", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ord_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ord_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isel r3, r4, r3, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ord_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isel r3, r4, r3, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ord_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r4, r3, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"ord", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ueq_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ueq_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, eq, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ueq_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, eq, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ueq_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, eq, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"ueq", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ugt_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ugt_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, gt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ugt_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, gt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ugt_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, gt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"ugt", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_uge_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_uge_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isellt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_uge_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isellt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_uge_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isellt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"uge", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ult_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ult_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: cror 4*cr5+lt, lt, un |
| ; P8-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ult_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: cror 4*cr5+lt, lt, un |
| ; P9-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ult_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: cror 4*cr5+lt, lt, un |
| ; NOVSX-NEXT: isel r3, r3, r4, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"ult", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_ule_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_ule_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iselgt r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_ule_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iselgt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_ule_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iselgt r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"ule", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_une_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_une_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: iseleq r3, r4, r3 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_une_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: iseleq r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_une_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: iseleq r3, r4, r3 |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"une", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @test_f64_uno_s(i32 %a, i32 %b, double %f1, double %f2) #0 { |
| ; P8-LABEL: test_f64_uno_s: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f2 |
| ; P8-NEXT: isel r3, r3, r4, un |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_f64_uno_s: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f2 |
| ; P9-NEXT: isel r3, r3, r4, un |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: test_f64_uno_s: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f2 |
| ; NOVSX-NEXT: isel r3, r3, r4, un |
| ; NOVSX-NEXT: blr |
| %cond = call i1 @llvm.experimental.constrained.fcmps.f64( |
| double %f1, double %f2, metadata !"uno", |
| metadata !"fpexcept.strict") #0 |
| %res = select i1 %cond, i32 %a, i32 %b |
| ret i32 %res |
| } |
| |
| define i32 @fcmp_olt_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_olt_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __ltkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_olt_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 0 |
| ; P9-NEXT: li r4, 1 |
| ; P9-NEXT: isellt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_olt_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __ltkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"olt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ole_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ole_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __lekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ole_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: xscmpuqp cr1, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, 4*cr1+un |
| ; P9-NEXT: crnor 4*cr5+gt, gt, 4*cr1+gt |
| ; P9-NEXT: crnand 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ole_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __lekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ole", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ogt_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ogt_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gtkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ogt_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 0 |
| ; P9-NEXT: li r4, 1 |
| ; P9-NEXT: iselgt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ogt_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gtkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_oge_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_oge_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_oge_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: xscmpuqp cr1, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, 4*cr1+un |
| ; P9-NEXT: crnor 4*cr5+gt, lt, 4*cr1+lt |
| ; P9-NEXT: crnand 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_oge_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"oge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_oeq_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_oeq_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __eqkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_oeq_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 0 |
| ; P9-NEXT: li r4, 1 |
| ; P9-NEXT: iseleq r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_oeq_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __eqkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_one_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_one_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -176(r1) |
| ; P8-NEXT: li r3, 128 |
| ; P8-NEXT: std r30, 160(r1) # 8-byte Folded Spill |
| ; P8-NEXT: stxvd2x v30, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: li r3, 144 |
| ; P8-NEXT: vmr v30, v2 |
| ; P8-NEXT: stxvd2x v31, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: vmr v31, v3 |
| ; P8-NEXT: bl __unordkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: vmr v2, v30 |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: vmr v3, v31 |
| ; P8-NEXT: srwi r30, r3, 5 |
| ; P8-NEXT: bl __eqkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: li r4, 144 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: lxvd2x v31, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: li r4, 128 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: lxvd2x v30, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: and r3, r30, r3 |
| ; P8-NEXT: ld r30, 160(r1) # 8-byte Folded Reload |
| ; P8-NEXT: addi r1, r1, 176 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_one_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: xscmpuqp cr1, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, 4*cr1+un |
| ; P9-NEXT: crnor 4*cr5+gt, eq, 4*cr1+eq |
| ; P9-NEXT: crnand 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_one_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r26, -48(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r27, -40(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r28, -32(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r29, -24(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r30, -16(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -80(r1) |
| ; NOVSX-NEXT: mr r30, r6 |
| ; NOVSX-NEXT: mr r29, r5 |
| ; NOVSX-NEXT: mr r28, r4 |
| ; NOVSX-NEXT: mr r27, r3 |
| ; NOVSX-NEXT: bl __unordkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: mr r4, r28 |
| ; NOVSX-NEXT: mr r5, r29 |
| ; NOVSX-NEXT: mr r6, r30 |
| ; NOVSX-NEXT: srwi r26, r3, 5 |
| ; NOVSX-NEXT: mr r3, r27 |
| ; NOVSX-NEXT: bl __eqkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: and r3, r26, r3 |
| ; NOVSX-NEXT: addi r1, r1, 80 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: ld r30, -16(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r29, -24(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r28, -32(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r27, -40(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r26, -48(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"one", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ult_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ult_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ult_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, lt, un |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ult_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ult", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ule_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ule_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gtkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ule_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: iselgt r3, 0, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ule_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gtkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ule", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ugt_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ugt_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __lekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ugt_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, gt, un |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ugt_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __lekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_uge_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_uge_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __ltkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_uge_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: isellt r3, 0, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_uge_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __ltkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"uge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ueq_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ueq_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -176(r1) |
| ; P8-NEXT: li r3, 128 |
| ; P8-NEXT: std r30, 160(r1) # 8-byte Folded Spill |
| ; P8-NEXT: stxvd2x v30, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: li r3, 144 |
| ; P8-NEXT: vmr v30, v2 |
| ; P8-NEXT: stxvd2x v31, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: vmr v31, v3 |
| ; P8-NEXT: bl __eqkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: vmr v2, v30 |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: vmr v3, v31 |
| ; P8-NEXT: srwi r30, r3, 5 |
| ; P8-NEXT: bl __unordkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: li r4, 144 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: lxvd2x v31, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: li r4, 128 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: lxvd2x v30, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: or r3, r3, r30 |
| ; P8-NEXT: ld r30, 160(r1) # 8-byte Folded Reload |
| ; P8-NEXT: addi r1, r1, 176 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ueq_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, eq, un |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ueq_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r26, -48(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r27, -40(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r28, -32(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r29, -24(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r30, -16(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -80(r1) |
| ; NOVSX-NEXT: mr r30, r6 |
| ; NOVSX-NEXT: mr r29, r5 |
| ; NOVSX-NEXT: mr r28, r4 |
| ; NOVSX-NEXT: mr r27, r3 |
| ; NOVSX-NEXT: bl __eqkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: mr r4, r28 |
| ; NOVSX-NEXT: mr r5, r29 |
| ; NOVSX-NEXT: mr r6, r30 |
| ; NOVSX-NEXT: srwi r26, r3, 5 |
| ; NOVSX-NEXT: mr r3, r27 |
| ; NOVSX-NEXT: bl __unordkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: or r3, r3, r26 |
| ; NOVSX-NEXT: addi r1, r1, 80 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: ld r30, -16(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r29, -24(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r28, -32(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r27, -40(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r26, -48(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_une_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmp_une_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __nekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_une_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpuqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: iseleq r3, 0, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_une_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __nekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.f128(fp128 %a, fp128 %b, metadata !"une", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_olt_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_olt_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __ltkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_olt_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 0 |
| ; P9-NEXT: li r4, 1 |
| ; P9-NEXT: isellt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_olt_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __ltkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"olt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ole_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ole_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __lekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ole_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: xscmpoqp cr1, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, 4*cr1+un |
| ; P9-NEXT: crnor 4*cr5+gt, gt, 4*cr1+gt |
| ; P9-NEXT: crnand 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ole_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __lekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ole", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ogt_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ogt_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gtkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ogt_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 0 |
| ; P9-NEXT: li r4, 1 |
| ; P9-NEXT: iselgt r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ogt_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gtkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_oge_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_oge_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_oge_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: xscmpoqp cr1, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, 4*cr1+un |
| ; P9-NEXT: crnor 4*cr5+gt, lt, 4*cr1+lt |
| ; P9-NEXT: crnand 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_oge_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"oge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_oeq_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_oeq_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __eqkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_oeq_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 0 |
| ; P9-NEXT: li r4, 1 |
| ; P9-NEXT: iseleq r3, r4, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_oeq_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __eqkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_one_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_one_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -176(r1) |
| ; P8-NEXT: li r3, 128 |
| ; P8-NEXT: std r30, 160(r1) # 8-byte Folded Spill |
| ; P8-NEXT: stxvd2x v30, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: li r3, 144 |
| ; P8-NEXT: vmr v30, v2 |
| ; P8-NEXT: stxvd2x v31, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: vmr v31, v3 |
| ; P8-NEXT: bl __unordkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: vmr v2, v30 |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: vmr v3, v31 |
| ; P8-NEXT: srwi r30, r3, 5 |
| ; P8-NEXT: bl __eqkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: li r4, 144 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: lxvd2x v31, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: li r4, 128 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: lxvd2x v30, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: and r3, r30, r3 |
| ; P8-NEXT: ld r30, 160(r1) # 8-byte Folded Reload |
| ; P8-NEXT: addi r1, r1, 176 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_one_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: xscmpoqp cr1, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, 4*cr1+un |
| ; P9-NEXT: crnor 4*cr5+gt, eq, 4*cr1+eq |
| ; P9-NEXT: crnand 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_one_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r26, -48(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r27, -40(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r28, -32(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r29, -24(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r30, -16(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -80(r1) |
| ; NOVSX-NEXT: mr r30, r6 |
| ; NOVSX-NEXT: mr r29, r5 |
| ; NOVSX-NEXT: mr r28, r4 |
| ; NOVSX-NEXT: mr r27, r3 |
| ; NOVSX-NEXT: bl __unordkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: mr r4, r28 |
| ; NOVSX-NEXT: mr r5, r29 |
| ; NOVSX-NEXT: mr r6, r30 |
| ; NOVSX-NEXT: srwi r26, r3, 5 |
| ; NOVSX-NEXT: mr r3, r27 |
| ; NOVSX-NEXT: bl __eqkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: and r3, r26, r3 |
| ; NOVSX-NEXT: addi r1, r1, 80 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: ld r30, -16(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r29, -24(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r28, -32(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r27, -40(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r26, -48(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"one", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ult_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ult_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ult_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, lt, un |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ult_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ult", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ule_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ule_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __gtkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ule_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: iselgt r3, 0, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ule_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __gtkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ule", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ugt_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ugt_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __lekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: extsw r3, r3 |
| ; P8-NEXT: neg r3, r3 |
| ; P8-NEXT: rldicl r3, r3, 1, 63 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ugt_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, gt, un |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ugt_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __lekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: extsw r3, r3 |
| ; NOVSX-NEXT: neg r3, r3 |
| ; NOVSX-NEXT: rldicl r3, r3, 1, 63 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_uge_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_uge_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __ltkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_uge_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: isellt r3, 0, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_uge_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __ltkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: rlwinm r3, r3, 1, 31, 31 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"uge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ueq_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ueq_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -176(r1) |
| ; P8-NEXT: li r3, 128 |
| ; P8-NEXT: std r30, 160(r1) # 8-byte Folded Spill |
| ; P8-NEXT: stxvd2x v30, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: li r3, 144 |
| ; P8-NEXT: vmr v30, v2 |
| ; P8-NEXT: stxvd2x v31, r1, r3 # 16-byte Folded Spill |
| ; P8-NEXT: vmr v31, v3 |
| ; P8-NEXT: bl __eqkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: vmr v2, v30 |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: vmr v3, v31 |
| ; P8-NEXT: srwi r30, r3, 5 |
| ; P8-NEXT: bl __unordkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: li r4, 144 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: lxvd2x v31, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: li r4, 128 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: lxvd2x v30, r1, r4 # 16-byte Folded Reload |
| ; P8-NEXT: or r3, r3, r30 |
| ; P8-NEXT: ld r30, 160(r1) # 8-byte Folded Reload |
| ; P8-NEXT: addi r1, r1, 176 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ueq_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, eq, un |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ueq_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r26, -48(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r27, -40(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r28, -32(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r29, -24(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r30, -16(r1) # 8-byte Folded Spill |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -80(r1) |
| ; NOVSX-NEXT: mr r30, r6 |
| ; NOVSX-NEXT: mr r29, r5 |
| ; NOVSX-NEXT: mr r28, r4 |
| ; NOVSX-NEXT: mr r27, r3 |
| ; NOVSX-NEXT: bl __eqkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: mr r4, r28 |
| ; NOVSX-NEXT: mr r5, r29 |
| ; NOVSX-NEXT: mr r6, r30 |
| ; NOVSX-NEXT: srwi r26, r3, 5 |
| ; NOVSX-NEXT: mr r3, r27 |
| ; NOVSX-NEXT: bl __unordkf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: or r3, r3, r26 |
| ; NOVSX-NEXT: addi r1, r1, 80 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: ld r30, -16(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r29, -24(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r28, -32(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r27, -40(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: ld r26, -48(r1) # 8-byte Folded Reload |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_une_f128(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: fcmps_une_f128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: mflr r0 |
| ; P8-NEXT: std r0, 16(r1) |
| ; P8-NEXT: stdu r1, -112(r1) |
| ; P8-NEXT: bl __nekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: cntlzw r3, r3 |
| ; P8-NEXT: srwi r3, r3, 5 |
| ; P8-NEXT: xori r3, r3, 1 |
| ; P8-NEXT: addi r1, r1, 112 |
| ; P8-NEXT: ld r0, 16(r1) |
| ; P8-NEXT: mtlr r0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_une_f128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: xscmpoqp cr0, v2, v3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: iseleq r3, 0, r3 |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_une_f128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: mflr r0 |
| ; NOVSX-NEXT: std r0, 16(r1) |
| ; NOVSX-NEXT: stdu r1, -32(r1) |
| ; NOVSX-NEXT: bl __nekf2 |
| ; NOVSX-NEXT: nop |
| ; NOVSX-NEXT: cntlzw r3, r3 |
| ; NOVSX-NEXT: srwi r3, r3, 5 |
| ; NOVSX-NEXT: xori r3, r3, 1 |
| ; NOVSX-NEXT: addi r1, r1, 32 |
| ; NOVSX-NEXT: ld r0, 16(r1) |
| ; NOVSX-NEXT: mtlr r0 |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.f128(fp128 %a, fp128 %b, metadata !"une", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_olt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_olt_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f3 |
| ; P8-NEXT: fcmpu cr1, f2, f4 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt |
| ; P8-NEXT: crandc 4*cr5+gt, lt, eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_olt_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: fcmpu cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt |
| ; P9-NEXT: crandc 4*cr5+gt, lt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_olt_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f3 |
| ; NOVSX-NEXT: fcmpu cr1, f2, f4 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, lt, eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"olt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ole_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ole_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crnor 4*cr5+lt, un, gt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ole_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, gt |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: crnor 4*cr5+gt, un, gt |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ole_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, gt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ole", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ogt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ogt_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f3 |
| ; P8-NEXT: fcmpu cr1, f2, f4 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt |
| ; P8-NEXT: crandc 4*cr5+gt, gt, eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ogt_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: fcmpu cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt |
| ; P9-NEXT: crandc 4*cr5+gt, gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ogt_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f3 |
| ; NOVSX-NEXT: fcmpu cr1, f2, f4 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, gt, eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_oge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_oge_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crnor 4*cr5+lt, un, lt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_oge_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, lt |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: crnor 4*cr5+gt, un, lt |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_oge_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, lt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_oeq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_oeq_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f1, f3 |
| ; P8-NEXT: fcmpu cr1, f2, f4 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq |
| ; P8-NEXT: crandc 4*cr5+gt, eq, eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_oeq_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: fcmpu cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq |
| ; P9-NEXT: crandc 4*cr5+gt, eq, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_oeq_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f1, f3 |
| ; NOVSX-NEXT: fcmpu cr1, f2, f4 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq |
| ; NOVSX-NEXT: crandc 4*cr5+gt, eq, eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_one_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_one_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crnor 4*cr5+lt, un, eq |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_one_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, eq |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: crnor 4*cr5+gt, un, eq |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_one_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, eq |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"one", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ult_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ult_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: cror 4*cr5+lt, lt, un |
| ; P8-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ult_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: fcmpu cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: cror 4*cr5+lt, 4*cr1+lt, 4*cr1+un |
| ; P9-NEXT: cror 4*cr5+gt, lt, un |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ult_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: cror 4*cr5+lt, lt, un |
| ; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ult", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ule_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ule_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ule_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f2, f4 |
| ; P9-NEXT: fcmpu cr1, f1, f3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt |
| ; P9-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ule_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ule", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ugt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ugt_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: cror 4*cr5+lt, gt, un |
| ; P8-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ugt_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: fcmpu cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: cror 4*cr5+lt, 4*cr1+gt, 4*cr1+un |
| ; P9-NEXT: cror 4*cr5+gt, gt, un |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ugt_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: cror 4*cr5+lt, gt, un |
| ; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_uge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_uge_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_uge_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f2, f4 |
| ; P9-NEXT: fcmpu cr1, f1, f3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt |
| ; P9-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_uge_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"uge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_ueq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_ueq_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: cror 4*cr5+lt, eq, un |
| ; P8-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_ueq_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f1, f3 |
| ; P9-NEXT: fcmpu cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: cror 4*cr5+lt, 4*cr1+eq, 4*cr1+un |
| ; P9-NEXT: cror 4*cr5+gt, eq, un |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_ueq_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: cror 4*cr5+lt, eq, un |
| ; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmp_une_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmp_une_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpu cr0, f2, f4 |
| ; P8-NEXT: fcmpu cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmp_une_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpu cr0, f2, f4 |
| ; P9-NEXT: fcmpu cr1, f1, f3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmp_une_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpu cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpu cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"une", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_olt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_olt_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f3 |
| ; P8-NEXT: fcmpo cr1, f2, f4 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt |
| ; P8-NEXT: crandc 4*cr5+gt, lt, eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_olt_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: fcmpo cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt |
| ; P9-NEXT: crandc 4*cr5+gt, lt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_olt_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f3 |
| ; NOVSX-NEXT: fcmpo cr1, f2, f4 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, lt, eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"olt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ole_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ole_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crnor 4*cr5+lt, un, gt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ole_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, gt |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: crnor 4*cr5+gt, un, gt |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ole_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, gt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ole", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ogt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ogt_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f3 |
| ; P8-NEXT: fcmpo cr1, f2, f4 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt |
| ; P8-NEXT: crandc 4*cr5+gt, gt, eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ogt_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: fcmpo cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt |
| ; P9-NEXT: crandc 4*cr5+gt, gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ogt_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f3 |
| ; NOVSX-NEXT: fcmpo cr1, f2, f4 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, gt, eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_oge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_oge_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crnor 4*cr5+lt, un, lt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_oge_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, lt |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: crnor 4*cr5+gt, un, lt |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_oge_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, lt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_oeq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_oeq_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f1, f3 |
| ; P8-NEXT: fcmpo cr1, f2, f4 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq |
| ; P8-NEXT: crandc 4*cr5+gt, eq, eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_oeq_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: fcmpo cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq |
| ; P9-NEXT: crandc 4*cr5+gt, eq, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_oeq_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f1, f3 |
| ; NOVSX-NEXT: fcmpo cr1, f2, f4 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq |
| ; NOVSX-NEXT: crandc 4*cr5+gt, eq, eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_one_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_one_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crnor 4*cr5+lt, un, eq |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_one_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crnor 4*cr5+lt, un, eq |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: crnor 4*cr5+gt, un, eq |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_one_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crnor 4*cr5+lt, un, eq |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"one", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ult_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ult_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: cror 4*cr5+lt, lt, un |
| ; P8-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ult_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: fcmpo cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: cror 4*cr5+lt, 4*cr1+lt, 4*cr1+un |
| ; P9-NEXT: cror 4*cr5+gt, lt, un |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ult_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: cror 4*cr5+lt, lt, un |
| ; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ult", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ule_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ule_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ule_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f2, f4 |
| ; P9-NEXT: fcmpo cr1, f1, f3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt |
| ; P9-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ule_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ule", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ugt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ugt_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: cror 4*cr5+lt, gt, un |
| ; P8-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ugt_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: fcmpo cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: cror 4*cr5+lt, 4*cr1+gt, 4*cr1+un |
| ; P9-NEXT: cror 4*cr5+gt, gt, un |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ugt_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: cror 4*cr5+lt, gt, un |
| ; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_uge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_uge_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt |
| ; P8-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_uge_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f2, f4 |
| ; P9-NEXT: fcmpo cr1, f1, f3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt |
| ; P9-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_uge_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt |
| ; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"uge", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_ueq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_ueq_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: cror 4*cr5+lt, eq, un |
| ; P8-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un |
| ; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_ueq_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f1, f3 |
| ; P9-NEXT: fcmpo cr1, f2, f4 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: cror 4*cr5+lt, 4*cr1+eq, 4*cr1+un |
| ; P9-NEXT: cror 4*cr5+gt, eq, un |
| ; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt |
| ; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq |
| ; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_ueq_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: cror 4*cr5+lt, eq, un |
| ; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un |
| ; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq |
| ; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| define i32 @fcmps_une_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 { |
| ; P8-LABEL: fcmps_une_ppcf128: |
| ; P8: # %bb.0: |
| ; P8-NEXT: fcmpo cr0, f2, f4 |
| ; P8-NEXT: fcmpo cr1, f1, f3 |
| ; P8-NEXT: li r3, 1 |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq |
| ; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P8-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: fcmps_une_ppcf128: |
| ; P9: # %bb.0: |
| ; P9-NEXT: fcmpo cr0, f2, f4 |
| ; P9-NEXT: fcmpo cr1, f1, f3 |
| ; P9-NEXT: li r3, 1 |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq |
| ; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; P9-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; P9-NEXT: blr |
| ; |
| ; NOVSX-LABEL: fcmps_une_ppcf128: |
| ; NOVSX: # %bb.0: |
| ; NOVSX-NEXT: fcmpo cr0, f2, f4 |
| ; NOVSX-NEXT: fcmpo cr1, f1, f3 |
| ; NOVSX-NEXT: li r3, 1 |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq |
| ; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt |
| ; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt |
| ; NOVSX-NEXT: blr |
| %cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"une", metadata !"fpexcept.strict") #0 |
| %conv = zext i1 %cmp to i32 |
| ret i32 %conv |
| } |
| |
| attributes #0 = { strictfp nounwind } |
| |
| declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata) |
| declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata) |
| declare i1 @llvm.experimental.constrained.fcmps.f32(float, float, metadata, metadata) |
| declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata) |
| declare i1 @llvm.experimental.constrained.fcmps.f128(fp128, fp128, metadata, metadata) |
| declare i1 @llvm.experimental.constrained.fcmp.f128(fp128, fp128, metadata, metadata) |
| declare i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata) |
| declare i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata) |