Author: Nemanja Ivanovic Date: 2021-05-13T04:56:56-05:00 New Revision: 39e4676ca798d9aba58823515ac9d48eb64863be
URL: https://github.com/llvm/llvm-project/commit/39e4676ca798d9aba58823515ac9d48eb64863be DIFF: https://github.com/llvm/llvm-project/commit/39e4676ca798d9aba58823515ac9d48eb64863be.diff LOG: [PowerPC] Provide doubleword vector predicate form comparisons on Power7 There are two reasons this shouldn't be restricted to Power8 and up: 1. For XL compatibility 2. Because clang will expand comparison operators to these intrinsics* *Without this patch, the following causes a selection error: int test(vector signed long a, vector signed long b) { return a < b; } This patch provides the handling for the intrinsics in the back end and removes the Power8 guards from the predicate functions (vec_{all|any}_{eq|ne|gt|ge|lt|le}). Added: llvm/test/CodeGen/PowerPC/vec_cmpd_p7.ll Modified: clang/lib/Headers/altivec.h clang/test/CodeGen/builtins-ppc-p8vector.c clang/test/CodeGen/builtins-ppc-vsx.c llvm/lib/Target/PowerPC/PPCISelLowering.cpp llvm/lib/Target/PowerPC/PPCInstrVSX.td Removed: ################################################################################ diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h index e28d234880fbb..25c1b1de998df 100644 --- a/clang/lib/Headers/altivec.h +++ b/clang/lib/Headers/altivec.h @@ -14790,7 +14790,7 @@ static __inline__ int __ATTRS_o_ai vec_all_eq(vector bool int __a, (vector int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_all_eq(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpequd_p(__CR6_LT, __a, __b); @@ -14974,7 +14974,7 @@ static __inline__ int __ATTRS_o_ai vec_all_ge(vector bool int __a, (vector unsigned int)__a); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_all_ge(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_EQ, __b, __a); @@ -15157,7 +15157,7 @@ static __inline__ int __ATTRS_o_ai vec_all_gt(vector bool int __a, (vector unsigned int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_all_gt(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_LT, __a, __b); @@ -15347,7 +15347,7 @@ static __inline__ int __ATTRS_o_ai vec_all_le(vector bool int __a, (vector unsigned int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_all_le(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_EQ, __a, __b); @@ -15531,7 +15531,7 @@ static __inline__ int __ATTRS_o_ai vec_all_lt(vector bool int __a, (vector unsigned int)__a); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_all_lt(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_LT, __b, __a); @@ -15746,7 +15746,7 @@ static __inline__ int __ATTRS_o_ai vec_all_ne(vector bool int __a, (vector int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_all_ne(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpequd_p(__CR6_EQ, __a, __b); @@ -16035,7 +16035,7 @@ static __inline__ int __ATTRS_o_ai vec_any_eq(vector bool int __a, (vector int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_any_eq(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpequd_p(__CR6_EQ_REV, __a, __b); @@ -16225,7 +16225,7 @@ static __inline__ int __ATTRS_o_ai vec_any_ge(vector bool int __a, (vector unsigned int)__a); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_any_ge(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_LT_REV, __b, __a); @@ -16416,7 +16416,7 @@ static __inline__ int __ATTRS_o_ai vec_any_gt(vector bool int __a, (vector unsigned int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_any_gt(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_EQ_REV, __a, __b); @@ -16607,7 +16607,7 @@ static __inline__ int __ATTRS_o_ai vec_any_le(vector bool int __a, (vector unsigned int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_any_le(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_LT_REV, __a, __b); @@ -16798,7 +16798,7 @@ static __inline__ int __ATTRS_o_ai vec_any_lt(vector bool int __a, (vector unsigned int)__a); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_any_lt(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpgtsd_p(__CR6_EQ_REV, __b, __a); @@ -17014,7 +17014,7 @@ static __inline__ int __ATTRS_o_ai vec_any_ne(vector bool int __a, (vector int)__b); } -#ifdef __POWER8_VECTOR__ +#ifdef __VSX__ static __inline__ int __ATTRS_o_ai vec_any_ne(vector signed long long __a, vector signed long long __b) { return __builtin_altivec_vcmpequd_p(__CR6_LT_REV, __a, __b); diff --git a/clang/test/CodeGen/builtins-ppc-p8vector.c b/clang/test/CodeGen/builtins-ppc-p8vector.c index 03b1e8757058d..68a2c95e870eb 100644 --- a/clang/test/CodeGen/builtins-ppc-p8vector.c +++ b/clang/test/CodeGen/builtins-ppc-p8vector.c @@ -432,42 +432,6 @@ void test1() { // CHECK-LE: call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %{{.+}}, i1 false) /* ----------------------- predicates --------------------------- */ - /* vec_all_eq */ - res_i = vec_all_eq(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - - res_i = vec_all_eq(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - - res_i = vec_all_eq(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - - res_i = vec_all_eq(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - - res_i = vec_all_eq(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - - res_i = vec_all_eq(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - - res_i = vec_all_eq(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - res_i = vec_all_eq(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpeqdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p @@ -476,42 +440,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpeqsp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p - /* vec_all_ne */ - res_i = vec_all_ne(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - - res_i = vec_all_ne(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - - res_i = vec_all_ne(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - - res_i = vec_all_ne(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - - res_i = vec_all_ne(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - - res_i = vec_all_ne(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - - res_i = vec_all_ne(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - dummy(); // CHECK: @dummy @@ -537,42 +465,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpgtdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p - /* vec_any_eq */ - res_i = vec_any_eq(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - - res_i = vec_any_eq(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - - res_i = vec_any_eq(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - - res_i = vec_any_eq(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - - res_i = vec_any_eq(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - - res_i = vec_any_eq(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - - res_i = vec_any_eq(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - res_i = vec_any_eq(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpeqdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p @@ -581,42 +473,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpeqsp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p - /* vec_any_ne */ - res_i = vec_any_ne(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - - res_i = vec_any_ne(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - - res_i = vec_any_ne(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - - res_i = vec_any_ne(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - - res_i = vec_any_ne(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - - res_i = vec_any_ne(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - - res_i = vec_any_ne(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpequd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpequd.p -// CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - res_i = vec_any_ne(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpeqdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p @@ -625,42 +481,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpeqsp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p - /* vec_all_ge */ - res_i = vec_all_ge(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - - res_i = vec_all_ge(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - - res_i = vec_all_ge(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - - res_i = vec_all_ge(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - - res_i = vec_all_ge(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - - res_i = vec_all_ge(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - - res_i = vec_all_ge(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - res_i = vec_all_ge(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgedp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgedp.p @@ -669,42 +489,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpgesp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p - /* vec_all_gt */ - res_i = vec_all_gt(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - - res_i = vec_all_gt(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - - res_i = vec_all_gt(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - - res_i = vec_all_gt(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - - res_i = vec_all_gt(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - - res_i = vec_all_gt(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - - res_i = vec_all_gt(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - res_i = vec_all_gt(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgtdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p @@ -713,42 +497,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpgtsp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgtsp.p - /* vec_all_le */ - res_i = vec_all_le(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_le' is ambiguous - - res_i = vec_all_le(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_le' is ambiguous - - res_i = vec_all_le(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_le' is ambiguous - - res_i = vec_all_le(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_le' is ambiguous - - res_i = vec_all_le(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_le' is ambiguous - - res_i = vec_all_le(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_le' is ambiguous - - res_i = vec_all_le(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_le' is ambiguous - res_i = vec_all_le(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgedp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgedp.p @@ -757,42 +505,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpgesp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p - /* vec_all_lt */ - res_i = vec_all_lt(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - - res_i = vec_all_lt(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - - res_i = vec_all_lt(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - - res_i = vec_all_lt(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - - res_i = vec_all_lt(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - - res_i = vec_all_lt(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - - res_i = vec_all_lt(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - res_i = vec_all_lt(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgtdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p @@ -809,42 +521,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpeqsp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p - /* vec_any_ge */ - res_i = vec_any_ge(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - - res_i = vec_any_ge(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - - res_i = vec_any_ge(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - - res_i = vec_any_ge(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - - res_i = vec_any_ge(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - - res_i = vec_any_ge(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - - res_i = vec_any_ge(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - res_i = vec_any_ge(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgedp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgedp.p @@ -853,82 +529,10 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpgesp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p - /* vec_any_gt */ - res_i = vec_any_gt(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - - res_i = vec_any_gt(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - - res_i = vec_any_gt(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - - res_i = vec_any_gt(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - - res_i = vec_any_gt(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - - res_i = vec_any_gt(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - - res_i = vec_any_gt(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - res_i = vec_any_gt(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgtdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p - /* vec_any_le */ - res_i = vec_any_le(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_le' is ambiguous - - res_i = vec_any_le(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_le' is ambiguous - - res_i = vec_any_le(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_le' is ambiguous - - res_i = vec_any_le(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_le' is ambiguous - - res_i = vec_any_le(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_le' is ambiguous - - res_i = vec_any_le(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_le' is ambiguous - - res_i = vec_any_le(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_le' is ambiguous - res_i = vec_any_le(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgedp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgedp.p @@ -937,42 +541,6 @@ void test1() { // CHECK: @llvm.ppc.vsx.xvcmpgesp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p - /* vec_any_lt */ - res_i = vec_any_lt(vsll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - - res_i = vec_any_lt(vsll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p -// CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - - res_i = vec_any_lt(vull, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - - res_i = vec_any_lt(vull, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - - res_i = vec_any_lt(vbll, vsll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - - res_i = vec_any_lt(vbll, vull); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - - res_i = vec_any_lt(vbll, vbll); -// CHECK: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p -// CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - res_i = vec_any_lt(vda, vda); // CHECK: @llvm.ppc.vsx.xvcmpgtdp.p // CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p diff --git a/clang/test/CodeGen/builtins-ppc-vsx.c b/clang/test/CodeGen/builtins-ppc-vsx.c index 4bb7a05a435a2..abd08d463e634 100644 --- a/clang/test/CodeGen/builtins-ppc-vsx.c +++ b/clang/test/CodeGen/builtins-ppc-vsx.c @@ -2591,4 +2591,356 @@ void test_p8overloads_backwards_compat() { // CHECK: ashr <2 x i64> // CHECK-LE: urem <2 x i64> {{%.*}}, <i64 64, i64 64> // CHECK-LE: ashr <2 x i64> + + /* ----------------------- predicates --------------------------- */ + /* vec_all_eq */ + res_i = vec_all_eq(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_eq(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_eq(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_eq(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_eq(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_eq(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_eq(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + /* vec_all_ne */ + res_i = vec_all_ne(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_ne(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_ne(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_ne(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_ne(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_ne(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_all_ne(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + dummy(); + // CHECK: @dummy + + /* vec_any_eq */ + res_i = vec_any_eq(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_eq(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_eq(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_eq(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_eq(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_eq(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_eq(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + /* vec_any_ne */ + res_i = vec_any_ne(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_ne(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_ne(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_ne(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_ne(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_ne(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + res_i = vec_any_ne(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpequd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p + + /* vec_all_ge */ + res_i = vec_all_ge(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_ge(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_ge(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_ge(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_ge(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_ge(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_ge(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + /* vec_all_gt */ + res_i = vec_all_gt(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_gt(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_gt(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_gt(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_gt(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_gt(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_gt(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + /* vec_all_le */ + res_i = vec_all_le(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_le(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_le(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_le(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_le(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_le(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_le(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + /* vec_all_lt */ + res_i = vec_all_lt(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_lt(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_all_lt(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_lt(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_lt(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_lt(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_all_lt(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + /* vec_any_ge */ + res_i = vec_any_ge(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_ge(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_ge(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_ge(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_ge(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_ge(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_ge(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + /* vec_any_gt */ + res_i = vec_any_gt(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_gt(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_gt(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_gt(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_gt(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_gt(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_gt(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + /* vec_any_le */ + res_i = vec_any_le(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_le(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_le(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_le(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_le(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_le(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_le(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + /* vec_any_lt */ + res_i = vec_any_lt(vsll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_lt(vsll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtsd.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p + + res_i = vec_any_lt(vull, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_lt(vull, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_lt(vbll, vsll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_lt(vbll, vull); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p + + res_i = vec_any_lt(vbll, vbll); + // CHECK: @llvm.ppc.altivec.vcmpgtud.p + // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p } diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index b98cf939c7310..65d915f4b2b8a 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -9981,7 +9981,7 @@ static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc, isDot = true; break; case Intrinsic::ppc_altivec_vcmpequd_p: - if (Subtarget.hasP8Altivec()) { + if (Subtarget.hasVSX() || Subtarget.hasP8Altivec()) { CompareOpc = 199; isDot = true; } else @@ -10041,7 +10041,7 @@ static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc, isDot = true; break; case Intrinsic::ppc_altivec_vcmpgtsd_p: - if (Subtarget.hasP8Altivec()) { + if (Subtarget.hasVSX() || Subtarget.hasP8Altivec()) { CompareOpc = 967; isDot = true; } else @@ -10060,7 +10060,7 @@ static bool getVectorCompareInfo(SDValue Intrin, int &CompareOpc, isDot = true; break; case Intrinsic::ppc_altivec_vcmpgtud_p: - if (Subtarget.hasP8Altivec()) { + if (Subtarget.hasVSX() || Subtarget.hasP8Altivec()) { CompareOpc = 711; isDot = true; } else diff --git a/llvm/lib/Target/PowerPC/PPCInstrVSX.td b/llvm/lib/Target/PowerPC/PPCInstrVSX.td index 66a1bc4608652..dd4a98b86498c 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrVSX.td +++ b/llvm/lib/Target/PowerPC/PPCInstrVSX.td @@ -2419,6 +2419,22 @@ def MrgWords { dag CVCAU = (v4i32 (XVCVDPUXWS CA)); } +def DblwdCmp { + dag SGTW = (v2i64 (v2i64 (VCMPGTSW v2i64:$vA, v2i64:$vB))); + dag UGTW = (v2i64 (v2i64 (VCMPGTUW v2i64:$vA, v2i64:$vB))); + dag EQW = (v2i64 (v2i64 (VCMPEQUW v2i64:$vA, v2i64:$vB))); + dag UGTWSHAND = (v2i64 (XXLAND (v2i64 (XXSLDWI UGTW, UGTW, 1)), EQW)); + dag EQWSHAND = (v2i64 (XXLAND (v2i64 (XXSLDWI EQW, EQW, 1)), EQW)); + dag SGTWOR = (v2i64 (XXLOR SGTW, UGTWSHAND)); + dag UGTWOR = (v2i64 (XXLOR UGTW, UGTWSHAND)); + dag MRGSGT = (v2i64 (XXPERMDI (v2i64 (XXSPLTW SGTWOR, 0)), + (v2i64 (XXSPLTW SGTWOR, 2)), 0)); + dag MRGUGT = (v2i64 (XXPERMDI (v2i64 (XXSPLTW UGTWOR, 0)), + (v2i64 (XXSPLTW UGTWOR, 2)), 0)); + dag MRGEQ = (v2i64 (XXPERMDI (v2i64 (XXSPLTW EQWSHAND, 0)), + (v2i64 (XXSPLTW EQWSHAND, 2)), 0)); +} + //---------------------------- Anonymous Patterns ----------------------------// // Predicate combinations are kept in roughly chronological order in terms of // instruction availability in the architecture. For example, VSX came in with @@ -2816,6 +2832,16 @@ defm : ScalToVecWPermute< defm : ScalToVecWPermute< v2i64, DblToULongLoad.A, (XVCVDPUXDS (LXVDSX ForceXForm:$A)), (XVCVDPUXDS (LXVDSX ForceXForm:$A))>; + +// Doubleword vector predicate comparisons without Power8. +let AddedComplexity = 0 in { +def : Pat<(v2i64 (PPCvcmp_rec v2i64:$vA, v2i64:$vB, 967)), + (VCMPGTUB_rec DblwdCmp.MRGSGT, (v2i64 (XXLXORz)))>; +def : Pat<(v2i64 (PPCvcmp_rec v2i64:$vA, v2i64:$vB, 711)), + (VCMPGTUB_rec DblwdCmp.MRGUGT, (v2i64 (XXLXORz)))>; +def : Pat<(v2i64 (PPCvcmp_rec v2i64:$vA, v2i64:$vB, 199)), + (VCMPGTUB_rec DblwdCmp.MRGEQ, (v2i64 (XXLXORz)))>; +} // AddedComplexity = 0 } // HasVSX // Any big endian VSX subtarget. diff --git a/llvm/test/CodeGen/PowerPC/vec_cmpd_p7.ll b/llvm/test/CodeGen/PowerPC/vec_cmpd_p7.ll new file mode 100644 index 0000000000000..727c2d3284065 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/vec_cmpd_p7.ll @@ -0,0 +1,239 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; Test the doubleword comparison expansions on Power7 +; +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ +; RUN: -mcpu=pwr7 < %s | FileCheck %s +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ +; RUN: -mcpu=pwr7 < %s | FileCheck %s --check-prefix=CHECK-BE + +define <2 x i64> @v2si64_cmp(<2 x i64> %x, <2 x i64> %y) nounwind readnone { +; CHECK-LABEL: v2si64_cmp: +; CHECK: # %bb.0: +; CHECK-NEXT: vcmpequw 2, 2, 3 +; CHECK-NEXT: blr +; +; CHECK-BE-LABEL: v2si64_cmp: +; CHECK-BE: # %bb.0: +; CHECK-BE-NEXT: vcmpequw 2, 2, 3 +; CHECK-BE-NEXT: blr + %cmp = icmp eq <2 x i64> %x, %y + %result = sext <2 x i1> %cmp to <2 x i64> + ret <2 x i64> %result +} + +; Greater than signed +define <2 x i64> @v2si64_cmp_gt(<2 x i64> %x, <2 x i64> %y) nounwind readnone { +; CHECK-LABEL: v2si64_cmp_gt: +; CHECK: # %bb.0: +; CHECK-NEXT: xxswapd 0, 35 +; CHECK-NEXT: addi 3, 1, -32 +; CHECK-NEXT: addi 4, 1, -48 +; CHECK-NEXT: xxswapd 1, 34 +; CHECK-NEXT: stxvd2x 0, 0, 3 +; CHECK-NEXT: stxvd2x 1, 0, 4 +; CHECK-NEXT: ld 3, -24(1) +; CHECK-NEXT: ld 4, -40(1) +; CHECK-NEXT: ld 6, -48(1) +; CHECK-NEXT: cmpd 4, 3 +; CHECK-NEXT: li 3, 0 +; CHECK-NEXT: li 4, -1 +; CHECK-NEXT: iselgt 5, 4, 3 +; CHECK-NEXT: std 5, -8(1) +; CHECK-NEXT: ld 5, -32(1) +; CHECK-NEXT: cmpd 6, 5 +; CHECK-NEXT: iselgt 3, 4, 3 +; CHECK-NEXT: std 3, -16(1) +; CHECK-NEXT: addi 3, 1, -16 +; CHECK-NEXT: lxvd2x 0, 0, 3 +; CHECK-NEXT: xxswapd 34, 0 +; CHECK-NEXT: blr +; +; CHECK-BE-LABEL: v2si64_cmp_gt: +; CHECK-BE: # %bb.0: +; CHECK-BE-NEXT: addi 3, 1, -32 +; CHECK-BE-NEXT: addi 4, 1, -48 +; CHECK-BE-NEXT: stxvd2x 35, 0, 3 +; CHECK-BE-NEXT: stxvd2x 34, 0, 4 +; CHECK-BE-NEXT: ld 3, -24(1) +; CHECK-BE-NEXT: ld 4, -40(1) +; CHECK-BE-NEXT: ld 6, -48(1) +; CHECK-BE-NEXT: cmpd 4, 3 +; CHECK-BE-NEXT: li 3, 0 +; CHECK-BE-NEXT: li 4, -1 +; CHECK-BE-NEXT: iselgt 5, 4, 3 +; CHECK-BE-NEXT: std 5, -8(1) +; CHECK-BE-NEXT: ld 5, -32(1) +; CHECK-BE-NEXT: cmpd 6, 5 +; CHECK-BE-NEXT: iselgt 3, 4, 3 +; CHECK-BE-NEXT: std 3, -16(1) +; CHECK-BE-NEXT: addi 3, 1, -16 +; CHECK-BE-NEXT: lxvd2x 34, 0, 3 +; CHECK-BE-NEXT: blr + %cmp = icmp sgt <2 x i64> %x, %y + %result = sext <2 x i1> %cmp to <2 x i64> + ret <2 x i64> %result +} + +; Greater than unsigned +define <2 x i64> @v2ui64_cmp_gt(<2 x i64> %x, <2 x i64> %y) nounwind readnone { +; CHECK-LABEL: v2ui64_cmp_gt: +; CHECK: # %bb.0: +; CHECK-NEXT: xxswapd 0, 35 +; CHECK-NEXT: addi 3, 1, -32 +; CHECK-NEXT: addi 4, 1, -48 +; CHECK-NEXT: xxswapd 1, 34 +; CHECK-NEXT: stxvd2x 0, 0, 3 +; CHECK-NEXT: stxvd2x 1, 0, 4 +; CHECK-NEXT: ld 3, -24(1) +; CHECK-NEXT: ld 4, -40(1) +; CHECK-NEXT: ld 6, -48(1) +; CHECK-NEXT: cmpld 4, 3 +; CHECK-NEXT: li 3, 0 +; CHECK-NEXT: li 4, -1 +; CHECK-NEXT: iselgt 5, 4, 3 +; CHECK-NEXT: std 5, -8(1) +; CHECK-NEXT: ld 5, -32(1) +; CHECK-NEXT: cmpld 6, 5 +; CHECK-NEXT: iselgt 3, 4, 3 +; CHECK-NEXT: std 3, -16(1) +; CHECK-NEXT: addi 3, 1, -16 +; CHECK-NEXT: lxvd2x 0, 0, 3 +; CHECK-NEXT: xxswapd 34, 0 +; CHECK-NEXT: blr +; +; CHECK-BE-LABEL: v2ui64_cmp_gt: +; CHECK-BE: # %bb.0: +; CHECK-BE-NEXT: addi 3, 1, -32 +; CHECK-BE-NEXT: addi 4, 1, -48 +; CHECK-BE-NEXT: stxvd2x 35, 0, 3 +; CHECK-BE-NEXT: stxvd2x 34, 0, 4 +; CHECK-BE-NEXT: ld 3, -24(1) +; CHECK-BE-NEXT: ld 4, -40(1) +; CHECK-BE-NEXT: ld 6, -48(1) +; CHECK-BE-NEXT: cmpld 4, 3 +; CHECK-BE-NEXT: li 3, 0 +; CHECK-BE-NEXT: li 4, -1 +; CHECK-BE-NEXT: iselgt 5, 4, 3 +; CHECK-BE-NEXT: std 5, -8(1) +; CHECK-BE-NEXT: ld 5, -32(1) +; CHECK-BE-NEXT: cmpld 6, 5 +; CHECK-BE-NEXT: iselgt 3, 4, 3 +; CHECK-BE-NEXT: std 3, -16(1) +; CHECK-BE-NEXT: addi 3, 1, -16 +; CHECK-BE-NEXT: lxvd2x 34, 0, 3 +; CHECK-BE-NEXT: blr + %cmp = icmp ugt <2 x i64> %x, %y + %result = sext <2 x i1> %cmp to <2 x i64> + ret <2 x i64> %result +} + +; Check the intrinsics also +declare i32 @llvm.ppc.altivec.vcmpequd.p(i32, <2 x i64>, <2 x i64>) nounwind readnone +declare i32 @llvm.ppc.altivec.vcmpgtsd.p(i32, <2 x i64>, <2 x i64>) nounwind readnone +declare i32 @llvm.ppc.altivec.vcmpgtud.p(i32, <2 x i64>, <2 x i64>) nounwind readnone + +define i32 @test_vcmpequd_p(<2 x i64> %x, <2 x i64> %y) { +; CHECK-LABEL: test_vcmpequd_p: +; CHECK: # %bb.0: +; CHECK-NEXT: vcmpequw 2, 2, 3 +; CHECK-NEXT: xxlxor 35, 35, 35 +; CHECK-NEXT: xxsldwi 0, 34, 34, 1 +; CHECK-NEXT: xxland 0, 0, 34 +; CHECK-NEXT: xxspltw 1, 0, 2 +; CHECK-NEXT: xxspltw 0, 0, 0 +; CHECK-NEXT: xxmrghd 34, 0, 1 +; CHECK-NEXT: vcmpgtub. 2, 2, 3 +; CHECK-NEXT: mfocrf 3, 2 +; CHECK-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-NEXT: blr +; +; CHECK-BE-LABEL: test_vcmpequd_p: +; CHECK-BE: # %bb.0: +; CHECK-BE-NEXT: vcmpequw 2, 2, 3 +; CHECK-BE-NEXT: xxlxor 35, 35, 35 +; CHECK-BE-NEXT: xxsldwi 0, 34, 34, 1 +; CHECK-BE-NEXT: xxland 0, 0, 34 +; CHECK-BE-NEXT: xxspltw 1, 0, 2 +; CHECK-BE-NEXT: xxspltw 0, 0, 0 +; CHECK-BE-NEXT: xxmrghd 34, 0, 1 +; CHECK-BE-NEXT: vcmpgtub. 2, 2, 3 +; CHECK-BE-NEXT: mfocrf 3, 2 +; CHECK-BE-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-BE-NEXT: blr + %tmp = tail call i32 @llvm.ppc.altivec.vcmpequd.p(i32 2, <2 x i64> %x, <2 x i64> %y) + ret i32 %tmp +} + +define i32 @test_vcmpgtsd_p(<2 x i64> %x, <2 x i64> %y) { +; CHECK-LABEL: test_vcmpgtsd_p: +; CHECK: # %bb.0: +; CHECK-NEXT: vcmpgtuw 4, 2, 3 +; CHECK-NEXT: vcmpequw 5, 2, 3 +; CHECK-NEXT: vcmpgtsw 2, 2, 3 +; CHECK-NEXT: xxlxor 35, 35, 35 +; CHECK-NEXT: xxsldwi 0, 36, 36, 1 +; CHECK-NEXT: xxland 0, 0, 37 +; CHECK-NEXT: xxlor 0, 34, 0 +; CHECK-NEXT: xxspltw 1, 0, 2 +; CHECK-NEXT: xxspltw 0, 0, 0 +; CHECK-NEXT: xxmrghd 34, 0, 1 +; CHECK-NEXT: vcmpgtub. 2, 2, 3 +; CHECK-NEXT: mfocrf 3, 2 +; CHECK-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-NEXT: blr +; +; CHECK-BE-LABEL: test_vcmpgtsd_p: +; CHECK-BE: # %bb.0: +; CHECK-BE-NEXT: vcmpgtuw 4, 2, 3 +; CHECK-BE-NEXT: vcmpequw 5, 2, 3 +; CHECK-BE-NEXT: vcmpgtsw 2, 2, 3 +; CHECK-BE-NEXT: xxlxor 35, 35, 35 +; CHECK-BE-NEXT: xxsldwi 0, 36, 36, 1 +; CHECK-BE-NEXT: xxland 0, 0, 37 +; CHECK-BE-NEXT: xxlor 0, 34, 0 +; CHECK-BE-NEXT: xxspltw 1, 0, 2 +; CHECK-BE-NEXT: xxspltw 0, 0, 0 +; CHECK-BE-NEXT: xxmrghd 34, 0, 1 +; CHECK-BE-NEXT: vcmpgtub. 2, 2, 3 +; CHECK-BE-NEXT: mfocrf 3, 2 +; CHECK-BE-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-BE-NEXT: blr + %tmp = tail call i32 @llvm.ppc.altivec.vcmpgtsd.p(i32 2, <2 x i64> %x, <2 x i64> %y) + ret i32 %tmp +} + +define i32 @test_vcmpgtud_p(<2 x i64> %x, <2 x i64> %y) { +; CHECK-LABEL: test_vcmpgtud_p: +; CHECK: # %bb.0: +; CHECK-NEXT: vcmpgtuw 4, 2, 3 +; CHECK-NEXT: vcmpequw 2, 2, 3 +; CHECK-NEXT: xxlxor 35, 35, 35 +; CHECK-NEXT: xxsldwi 0, 36, 36, 1 +; CHECK-NEXT: xxland 0, 0, 34 +; CHECK-NEXT: xxlor 0, 36, 0 +; CHECK-NEXT: xxspltw 1, 0, 2 +; CHECK-NEXT: xxspltw 0, 0, 0 +; CHECK-NEXT: xxmrghd 34, 0, 1 +; CHECK-NEXT: vcmpgtub. 2, 2, 3 +; CHECK-NEXT: mfocrf 3, 2 +; CHECK-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-NEXT: blr +; +; CHECK-BE-LABEL: test_vcmpgtud_p: +; CHECK-BE: # %bb.0: +; CHECK-BE-NEXT: vcmpgtuw 4, 2, 3 +; CHECK-BE-NEXT: vcmpequw 2, 2, 3 +; CHECK-BE-NEXT: xxlxor 35, 35, 35 +; CHECK-BE-NEXT: xxsldwi 0, 36, 36, 1 +; CHECK-BE-NEXT: xxland 0, 0, 34 +; CHECK-BE-NEXT: xxlor 0, 36, 0 +; CHECK-BE-NEXT: xxspltw 1, 0, 2 +; CHECK-BE-NEXT: xxspltw 0, 0, 0 +; CHECK-BE-NEXT: xxmrghd 34, 0, 1 +; CHECK-BE-NEXT: vcmpgtub. 2, 2, 3 +; CHECK-BE-NEXT: mfocrf 3, 2 +; CHECK-BE-NEXT: rlwinm 3, 3, 25, 31, 31 +; CHECK-BE-NEXT: blr + %tmp = tail call i32 @llvm.ppc.altivec.vcmpgtud.p(i32 2, <2 x i64> %x, <2 x i64> %y) + ret i32 %tmp +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits