diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def --- a/clang/include/clang/Basic/BuiltinsPPC.def +++ b/clang/include/clang/Basic/BuiltinsPPC.def @@ -156,6 +156,11 @@ BUILTIN(__builtin_altivec_vcmpgtud, "V2LLiV2ULLiV2ULLi", "") BUILTIN(__builtin_altivec_vcmpgtfp, "V4iV4fV4f", "") +// P10 Vector compare builtins. +BUILTIN(__builtin_altivec_vcmpequq, "V1LLLiV1ULLLiV1ULLLi", "") +BUILTIN(__builtin_altivec_vcmpgtsq, "V1LLLiV1SLLLiV1SLLLi", "") +BUILTIN(__builtin_altivec_vcmpgtuq, "V1LLLiV1ULLLiV1ULLLi", "") + BUILTIN(__builtin_altivec_vmaxsb, "V16ScV16ScV16Sc", "") BUILTIN(__builtin_altivec_vmaxub, "V16UcV16UcV16Uc", "") BUILTIN(__builtin_altivec_vmaxsh, "V8SsV8SsV8Ss", "") diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h --- a/clang/lib/Headers/altivec.h +++ b/clang/lib/Headers/altivec.h @@ -1709,6 +1709,20 @@ } #endif +#ifdef __POWER10_VECTOR__ +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpeq(vector signed __int128 __a, vector signed __int128 __b) { + return (vector bool __int128)__builtin_altivec_vcmpequq( + (vector bool __int128)__a, (vector bool __int128)__b); +} + +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpeq(vector unsigned __int128 __a, vector unsigned __int128 __b) { + return (vector bool __int128)__builtin_altivec_vcmpequq( + (vector bool __int128)__a, (vector bool __int128)__b); +} +#endif + #ifdef __POWER9_VECTOR__ /* vec_cmpne */ @@ -1772,6 +1786,20 @@ (vector int)__b); } +#ifdef __POWER10_VECTOR__ +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpne(vector unsigned __int128 __a, vector unsigned __int128 __b) { + return (vector bool __int128) ~(__builtin_altivec_vcmpequq( + (vector bool __int128)__a, (vector bool __int128)__b)); +} + +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpne(vector signed __int128 __a, vector signed __int128 __b) { + return (vector bool __int128) ~(__builtin_altivec_vcmpequq( + (vector bool __int128)__a, (vector bool __int128)__b)); +} +#endif + /* vec_cmpnez */ static __inline__ vector bool char __ATTRS_o_ai @@ -2018,6 +2046,20 @@ } #endif +#ifdef __POWER10_VECTOR__ +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpgt(vector signed __int128 __a, vector signed __int128 __b) { + return (vector bool __int128)__builtin_altivec_vcmpgtsq( + (vector bool __int128)__a, (vector bool __int128)__b); +} + +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpgt(vector unsigned __int128 __a, vector unsigned __int128 __b) { + return (vector bool __int128)__builtin_altivec_vcmpgtuq( + (vector bool __int128)__a, (vector bool __int128)__b); +} +#endif + /* vec_cmpge */ static __inline__ vector bool char __ATTRS_o_ai @@ -2078,6 +2120,18 @@ } #endif +#ifdef __POWER10_VECTOR__ +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpge(vector signed __int128 __a, vector signed __int128 __b) { + return ~(vec_cmpgt(__b, __a)); +} + +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmpge(vector unsigned __int128 __a, vector unsigned __int128 __b) { + return ~(vec_cmpgt(__b, __a)); +} +#endif + /* vec_vcmpgefp */ static __inline__ vector bool int __attribute__((__always_inline__)) @@ -2190,6 +2244,18 @@ } #endif +#ifdef __POWER10_VECTOR__ +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmple(vector signed __int128 __a, vector signed __int128 __b) { + return vec_cmpge(__b, __a); +} + +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmple(vector unsigned __int128 __a, vector unsigned __int128 __b) { + return vec_cmpge(__b, __a); +} +#endif + /* vec_cmplt */ static __inline__ vector bool char __ATTRS_o_ai @@ -2234,6 +2300,18 @@ } #endif +#ifdef __POWER10_VECTOR__ +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmplt(vector signed __int128 __a, vector signed __int128 __b) { + return vec_cmpgt(__b, __a); +} + +static __inline__ vector bool __int128 __ATTRS_o_ai +vec_cmplt(vector unsigned __int128 __a, vector unsigned __int128 __b) { + return vec_cmpgt(__b, __a); +} +#endif + #ifdef __POWER8_VECTOR__ static __inline__ vector bool long long __ATTRS_o_ai vec_cmplt(vector signed long long __a, vector signed long long __b) { diff --git a/clang/test/CodeGen/builtins-ppc-p10vector.c b/clang/test/CodeGen/builtins-ppc-p10vector.c --- a/clang/test/CodeGen/builtins-ppc-p10vector.c +++ b/clang/test/CodeGen/builtins-ppc-p10vector.c @@ -1068,3 +1068,93 @@ // CHECK: ret <1 x i128> return vec_xl_zext(llb, ullap); } + +vector bool __int128 test_vec_cmpeq_s128(void) { + // CHECK-LABEL: @test_vec_cmpeq_s128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpequq(<1 x i128> + // CHECK-NEXT: ret <1 x i128> + return vec_cmpeq(vsi128a, vsi128b); +} + +vector bool __int128 test_vec_cmpeq_u128(void) { + // CHECK-LABEL: @test_vec_cmpeq_u128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpequq(<1 x i128> + // CHECK-NEXT: ret <1 x i128> + return vec_cmpeq(vui128a, vui128b); +} + +vector bool __int128 test_vec_cmpne_s128(void) { + // CHECK-LABEL: @test_vec_cmpne_s128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpequq(<1 x i128> + // CHECK-NEXT: %neg.i = xor <1 x i128> %4, + // CHECK-NEXT: ret <1 x i128> %neg.i + return vec_cmpne(vsi128a, vsi128b); +} + +vector bool __int128 test_vec_cmpne_u128(void) { + // CHECK-LABEL: @test_vec_cmpne_u128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpequq(<1 x i128> + // CHECK-NEXT: %neg.i = xor <1 x i128> %4, + // CHECK-NEXT: ret <1 x i128> + return vec_cmpne(vui128a, vui128b); +} + +vector bool __int128 test_vec_cmpgt_s128(void) { + // CHECK-LABEL: @test_vec_cmpgt_s128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtsq(<1 x i128> + // CHECK-NEXT: ret <1 x i128> + return vec_cmpgt(vsi128a, vsi128b); +} + +vector bool __int128 test_vec_cmpgt_u128(void) { + // CHECK-LABEL: @test_vec_cmpgt_u128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtuq(<1 x i128> + // CHECK-NEXT: ret <1 x i128> + return vec_cmpgt(vui128a, vui128b); +} + +vector bool __int128 test_vec_cmplt_s128(void) { + // CHECK-LABEL: @test_vec_cmplt_s128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtsq(<1 x i128> + // CHECK-NEXT: ret <1 x i128> + return vec_cmplt(vsi128a, vsi128b); +} + +vector bool __int128 test_vec_cmplt_u128(void) { + // CHECK-LABEL: @test_vec_cmplt_u128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtuq(<1 x i128> + // CHECK-NEXT: ret <1 x i128> + return vec_cmplt(vui128a, vui128b); +} + +vector bool __int128 test_vec_cmpge_s128(void) { + // CHECK-LABEL: @test_vec_cmpge_s128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtsq(<1 x i128> + // CHECK-NEXT: %neg.i = xor <1 x i128> %6, + // CHECK-NEXT: ret <1 x i128> + return vec_cmpge(vsi128a, vsi128b); +} + +vector bool __int128 test_vec_cmpge_u128(void) { + // CHECK-LABEL: @test_vec_cmpge_u128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtuq(<1 x i128> + // CHECK-NEXT: %neg.i = xor <1 x i128> %6, + // CHECK-NEXT: ret <1 x i128> + return vec_cmpge(vui128a, vui128b); +} + +vector bool __int128 test_vec_cmple_s128(void) { + // CHECK-LABEL: @test_vec_cmple_s128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtsq(<1 x i128> + // CHECK-NEXT: %neg.i.i = xor <1 x i128> %8, + // CHECK-NEXT: ret <1 x i128> + return vec_cmple(vsi128a, vsi128b); +} + +vector bool __int128 test_vec_cmple_u128(void) { + // CHECK-LABEL: @test_vec_cmple_u128( + // CHECK: call <1 x i128> @llvm.ppc.altivec.vcmpgtuq(<1 x i128> + // CHECK-NEXT: %neg.i.i = xor <1 x i128> %8, + // CHECK-NEXT: ret <1 x i128> + return vec_cmple(vui128a, vui128b); +} diff --git a/llvm/include/llvm/IR/IntrinsicsPowerPC.td b/llvm/include/llvm/IR/IntrinsicsPowerPC.td --- a/llvm/include/llvm/IR/IntrinsicsPowerPC.td +++ b/llvm/include/llvm/IR/IntrinsicsPowerPC.td @@ -361,6 +361,16 @@ Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>; + def int_ppc_altivec_vcmpequq : GCCBuiltin<"__builtin_altivec_vcmpequq">, + Intrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty], + [IntrNoMem]>; + def int_ppc_altivec_vcmpgtsq : GCCBuiltin<"__builtin_altivec_vcmpgtsq">, + Intrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty], + [IntrNoMem]>; + def int_ppc_altivec_vcmpgtuq : GCCBuiltin<"__builtin_altivec_vcmpgtuq">, + Intrinsic<[llvm_v1i128_ty], [llvm_v1i128_ty, llvm_v1i128_ty], + [IntrNoMem]>; + // Predicate Comparisons. The first operand specifies interpretation of CR6. def int_ppc_altivec_vcmpbfp_p : GCCBuiltin<"__builtin_altivec_vcmpbfp_p">, Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty], diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp --- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -3945,7 +3945,8 @@ // getVCmpInst: return the vector compare instruction for the specified // vector type and condition code. Since this is for altivec specific code, -// only support the altivec types (v16i8, v8i16, v4i32, v2i64, and v4f32). +// only support the altivec types (v16i8, v8i16, v4i32, v2i64, v1i128, +// and v4f32). static unsigned int getVCmpInst(MVT VecVT, ISD::CondCode CC, bool HasVSX, bool &Swap, bool &Negate) { Swap = false; @@ -4026,6 +4027,8 @@ return PPC::VCMPEQUW; else if (VecVT == MVT::v2i64) return PPC::VCMPEQUD; + else if (VecVT == MVT::v1i128) + return PPC::VCMPEQUQ; break; case ISD::SETGT: if (VecVT == MVT::v16i8) @@ -4036,6 +4039,8 @@ return PPC::VCMPGTSW; else if (VecVT == MVT::v2i64) return PPC::VCMPGTSD; + else if (VecVT == MVT::v1i128) + return PPC::VCMPGTSQ; break; case ISD::SETUGT: if (VecVT == MVT::v16i8) @@ -4046,6 +4051,8 @@ return PPC::VCMPGTUW; else if (VecVT == MVT::v2i64) return PPC::VCMPGTUD; + else if (VecVT == MVT::v1i128) + return PPC::VCMPGTUQ; break; default: break; diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -1003,7 +1003,10 @@ setOperationAction(ISD::SUB, MVT::v2i64, Expand); } - setOperationAction(ISD::SETCC, MVT::v1i128, Expand); + if (Subtarget.isISA3_1()) + setOperationAction(ISD::SETCC, MVT::v1i128, Legal); + else + setOperationAction(ISD::SETCC, MVT::v1i128, Expand); setOperationAction(ISD::LOAD, MVT::v2i64, Promote); AddPromotedToType (ISD::LOAD, MVT::v2i64, MVT::v2f64); @@ -10301,6 +10304,25 @@ else return false; break; + case Intrinsic::ppc_altivec_vcmpequq: + case Intrinsic::ppc_altivec_vcmpgtsq: + case Intrinsic::ppc_altivec_vcmpgtuq: + if (!Subtarget.isISA3_1()) + return false; + switch (IntrinsicID) { + default: + llvm_unreachable("Unknown comparison intrinsic."); + case Intrinsic::ppc_altivec_vcmpequq: + CompareOpc = 455; + break; + case Intrinsic::ppc_altivec_vcmpgtsq: + CompareOpc = 903; + break; + case Intrinsic::ppc_altivec_vcmpgtuq: + CompareOpc = 647; + break; + } + break; } return true; } diff --git a/llvm/test/CodeGen/PowerPC/vec_cmpq.ll b/llvm/test/CodeGen/PowerPC/vec_cmpq.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/vec_cmpq.ll @@ -0,0 +1,233 @@ +; Test the quadword comparison instructions that were added in POWER10. +; +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ +; RUN: -mcpu=pwr10 < %s | FileCheck %s +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ +; RUN: -mcpu=pwr10 -mattr=-vsx < %s | FileCheck %s +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ +; RUN: -mcpu=pwr10 < %s | FileCheck %s +define <1 x i128> @v1si128_cmp(<1 x i128> %x, <1 x i128> %y) nounwind readnone { + %cmp = icmp eq <1 x i128> %x, %y + %result = sext <1 x i1> %cmp to <1 x i128> + ret <1 x i128> %result +; CHECK-LABEL: v1si128_cmp: +; CHECK: vcmpequq 2, 2, 3 +} + +define <2 x i128> @v2si128_cmp(<2 x i128> %x, <2 x i128> %y) nounwind readnone { + %cmp = icmp eq <2 x i128> %x, %y + %result = sext <2 x i1> %cmp to <2 x i128> + ret <2 x i128> %result +; CHECK-LABEL: v2si128_cmp +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <4 x i128> @v4si128_cmp(<4 x i128> %x, <4 x i128> %y) nounwind readnone { + %cmp = icmp eq <4 x i128> %x, %y + %result = sext <4 x i1> %cmp to <4 x i128> + ret <4 x i128> %result +; CHECK-LABEL: v4si128_cmp +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <8 x i128> @v8si128_cmp(<8 x i128> %x, <8 x i128> %y) nounwind readnone { + %cmp = icmp eq <8 x i128> %x, %y + %result = sext <8 x i1> %cmp to <8 x i128> + ret <8 x i128> %result +; CHECK-LABEL: v8si128_cmp +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <16 x i128> @v16si128_cmp(<16 x i128> %x, <16 x i128> %y) nounwind readnone { + %cmp = icmp eq <16 x i128> %x, %y + %result = sext <16 x i1> %cmp to <16 x i128> + ret <16 x i128> %result +; CHECK-LABEL: v16si128_cmp +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +; Greater than signed +define <1 x i128> @v1si128_cmp_gt(<1 x i128> %x, <1 x i128> %y) nounwind readnone { + %cmp = icmp sgt <1 x i128> %x, %y + %result = sext <1 x i1> %cmp to <1 x i128> + ret <1 x i128> %result +; CHECK-LABEL: v1si128_cmp_gt +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <2 x i128> @v2si128_cmp_gt(<2 x i128> %x, <2 x i128> %y) nounwind readnone { + %cmp = icmp sgt <2 x i128> %x, %y + %result = sext <2 x i1> %cmp to <2 x i128> + ret <2 x i128> %result +; CHECK-LABEL: v2si128_cmp_gt +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <4 x i128> @v4si128_cmp_gt(<4 x i128> %x, <4 x i128> %y) nounwind readnone { + %cmp = icmp sgt <4 x i128> %x, %y + %result = sext <4 x i1> %cmp to <4 x i128> + ret <4 x i128> %result +; CHECK-LABEL: v4si128_cmp_gt +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <8 x i128> @v8si128_cmp_gt(<8 x i128> %x, <8 x i128> %y) nounwind readnone { + %cmp = icmp sgt <8 x i128> %x, %y + %result = sext <8 x i1> %cmp to <8 x i128> + ret <8 x i128> %result +; CHECK-LABEL: v8si128_cmp_gt +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <16 x i128> @v16si128_cmp_gt(<16 x i128> %x, <16 x i128> %y) nounwind readnone { + %cmp = icmp sgt <16 x i128> %x, %y + %result = sext <16 x i1> %cmp to <16 x i128> + ret <16 x i128> %result +; CHECK-LABEL: v16si128_cmp_gt +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +; Greater than unsigned +define <1 x i128> @v1ui128_cmp_gt(<1 x i128> %x, <1 x i128> %y) nounwind readnone { + %cmp = icmp ugt <1 x i128> %x, %y + %result = sext <1 x i1> %cmp to <1 x i128> + ret <1 x i128> %result +; CHECK-LABEL: v1ui128_cmp_gt +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <2 x i128> @v2ui128_cmp_gt(<2 x i128> %x, <2 x i128> %y) nounwind readnone { + %cmp = icmp ugt <2 x i128> %x, %y + %result = sext <2 x i1> %cmp to <2 x i128> + ret <2 x i128> %result +; CHECK-LABEL: v2ui128_cmp_gt +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <4 x i128> @v4ui128_cmp_gt(<4 x i128> %x, <4 x i128> %y) nounwind readnone { + %cmp = icmp ugt <4 x i128> %x, %y + %result = sext <4 x i1> %cmp to <4 x i128> + ret <4 x i128> %result +; CHECK-LABEL: v4ui128_cmp_gt +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <8 x i128> @v8ui128_cmp_gt(<8 x i128> %x, <8 x i128> %y) nounwind readnone { + %cmp = icmp ugt <8 x i128> %x, %y + %result = sext <8 x i1> %cmp to <8 x i128> + ret <8 x i128> %result +; CHECK-LABEL: v8ui128_cmp_gt +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <16 x i128> @v16ui128_cmp_gt(<16 x i128> %x, <16 x i128> %y) nounwind readnone { + %cmp = icmp ugt <16 x i128> %x, %y + %result = sext <16 x i1> %cmp to <16 x i128> + ret <16 x i128> %result +; CHECK-LABEL: v16ui128_cmp_gt +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +; Check the intrinsics also +declare <1 x i128> @llvm.ppc.altivec.vcmpequq(<1 x i128>, <1 x i128>) nounwind readnone +declare <1 x i128> @llvm.ppc.altivec.vcmpgtsq(<1 x i128>, <1 x i128>) nounwind readnone +declare <1 x i128> @llvm.ppc.altivec.vcmpgtuq(<1 x i128>, <1 x i128>) nounwind readnone + +define <1 x i128> @test_vcmpequq(<1 x i128> %x, <1 x i128> %y) { + %tmp = tail call <1 x i128> @llvm.ppc.altivec.vcmpequq(<1 x i128> %x, <1 x i128> %y) + ret <1 x i128> %tmp +; CHECK-LABEL: test_vcmpequq: +; CHECK: vcmpequq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <1 x i128> @test_vcmpgtsq(<1 x i128> %x, <1 x i128> %y) { + %tmp = tail call <1 x i128> @llvm.ppc.altivec.vcmpgtsq(<1 x i128> %x, <1 x i128> %y) + ret <1 x i128> %tmp +; CHECK-LABEL: test_vcmpgtsq +; CHECK: vcmpgtsq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +} + +define <1 x i128> @test_vcmpgtuq(<1 x i128> %x, <1 x i128> %y) { + %tmp = tail call <1 x i128> @llvm.ppc.altivec.vcmpgtuq(<1 x i128> %x, <1 x i128> %y) + ret <1 x i128> %tmp +; CHECK-LABEL: test_vcmpgtuq +; CHECK: vcmpgtuq {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +}