mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
d26cbdc561
This patch is the last one in backend to support fp128 type in pre-POWER9 subtargets with VSX, removing temporary option and updating remaining tests. Reviewed By: steven.zhang Differential Revision: https://reviews.llvm.org/D92374
3664 lines
114 KiB
LLVM
3664 lines
114 KiB
LLVM
; 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)
|