[PowerPC] Add more missing overloads to altivec.h

We are missing more predicate forms for 'vector double' and some
tests. This adds the missing overloads and completes the set of
test cases for them.
This commit is contained in:
Nemanja Ivanovic 2021-03-12 09:19:58 -06:00
parent f3b07f9c5d
commit b5fae4b9b2
2 changed files with 165 additions and 12 deletions

View File

@ -16364,10 +16364,18 @@ static __inline__ int __ATTRS_o_ai vec_any_lt(vector unsigned __int128 __a,
/* vec_any_nan */
static __inline__ int __attribute__((__always_inline__))
vec_any_nan(vector float __a) {
static __inline__ int __ATTRS_o_ai vec_any_nan(vector float __a) {
#ifdef __VSX__
return __builtin_vsx_xvcmpeqsp_p(__CR6_LT_REV, __a, __a);
#else
return __builtin_altivec_vcmpeqfp_p(__CR6_LT_REV, __a, __a);
#endif
}
#ifdef __VSX__
static __inline__ int __ATTRS_o_ai vec_any_nan(vector double __a) {
return __builtin_vsx_xvcmpeqdp_p(__CR6_LT_REV, __a, __a);
}
#endif
/* vec_any_ne */
@ -16571,39 +16579,92 @@ static __inline__ int __ATTRS_o_ai vec_any_ne(vector unsigned __int128 __a,
/* vec_any_nge */
static __inline__ int __attribute__((__always_inline__))
vec_any_nge(vector float __a, vector float __b) {
static __inline__ int __ATTRS_o_ai vec_any_nge(vector float __a,
vector float __b) {
#ifdef __VSX__
return __builtin_vsx_xvcmpgesp_p(__CR6_LT_REV, __a, __b);
#else
return __builtin_altivec_vcmpgefp_p(__CR6_LT_REV, __a, __b);
#endif
}
#ifdef __VSX__
static __inline__ int __ATTRS_o_ai vec_any_nge(vector double __a,
vector double __b) {
return __builtin_vsx_xvcmpgedp_p(__CR6_LT_REV, __a, __b);
}
#endif
/* vec_any_ngt */
static __inline__ int __attribute__((__always_inline__))
vec_any_ngt(vector float __a, vector float __b) {
static __inline__ int __ATTRS_o_ai vec_any_ngt(vector float __a,
vector float __b) {
#ifdef __VSX__
return __builtin_vsx_xvcmpgtsp_p(__CR6_LT_REV, __a, __b);
#else
return __builtin_altivec_vcmpgtfp_p(__CR6_LT_REV, __a, __b);
#endif
}
#ifdef __VSX__
static __inline__ int __ATTRS_o_ai vec_any_ngt(vector double __a,
vector double __b) {
return __builtin_vsx_xvcmpgtdp_p(__CR6_LT_REV, __a, __b);
}
#endif
/* vec_any_nle */
static __inline__ int __attribute__((__always_inline__))
vec_any_nle(vector float __a, vector float __b) {
static __inline__ int __ATTRS_o_ai vec_any_nle(vector float __a,
vector float __b) {
#ifdef __VSX__
return __builtin_vsx_xvcmpgesp_p(__CR6_LT_REV, __b, __a);
#else
return __builtin_altivec_vcmpgefp_p(__CR6_LT_REV, __b, __a);
#endif
}
#ifdef __VSX__
static __inline__ int __ATTRS_o_ai vec_any_nle(vector double __a,
vector double __b) {
return __builtin_vsx_xvcmpgedp_p(__CR6_LT_REV, __b, __a);
}
#endif
/* vec_any_nlt */
static __inline__ int __attribute__((__always_inline__))
vec_any_nlt(vector float __a, vector float __b) {
static __inline__ int __ATTRS_o_ai vec_any_nlt(vector float __a,
vector float __b) {
#ifdef __VSX__
return __builtin_vsx_xvcmpgtsp_p(__CR6_LT_REV, __b, __a);
#else
return __builtin_altivec_vcmpgtfp_p(__CR6_LT_REV, __b, __a);
#endif
}
#ifdef __VSX__
static __inline__ int __ATTRS_o_ai vec_any_nlt(vector double __a,
vector double __b) {
return __builtin_vsx_xvcmpgtdp_p(__CR6_LT_REV, __b, __a);
}
#endif
/* vec_any_numeric */
static __inline__ int __attribute__((__always_inline__))
vec_any_numeric(vector float __a) {
static __inline__ int __ATTRS_o_ai vec_any_numeric(vector float __a) {
#ifdef __VSX__
return __builtin_vsx_xvcmpeqsp_p(__CR6_EQ_REV, __a, __a);
#else
return __builtin_altivec_vcmpeqfp_p(__CR6_EQ_REV, __a, __a);
#endif
}
#ifdef __VSX__
static __inline__ int __ATTRS_o_ai vec_any_numeric(vector double __a) {
return __builtin_vsx_xvcmpeqdp_p(__CR6_EQ_REV, __a, __a);
}
#endif
/* vec_any_out */
static __inline__ int __attribute__((__always_inline__))

View File

@ -93,6 +93,74 @@ void test1() {
// CHECK: fadd <2 x double>
// CHECK-LE: fadd <2 x double>
res_i = vec_any_ne(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpeqsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p
res_i = vec_any_ne(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpeqdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p
res_i = vec_any_nle(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpgesp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p
res_i = vec_any_nle(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpgedp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgedp.p
res_i = vec_any_nlt(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpgtsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgtsp.p
res_i = vec_any_nlt(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpgtdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p
res_i = vec_any_nge(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpgesp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p
res_i = vec_any_nge(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpgedp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgedp.p
res_i = vec_any_ngt(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpgtsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgtsp.p
res_i = vec_any_ngt(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpgtdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p
res_i = vec_any_nan(vf);
// CHECK: @llvm.ppc.vsx.xvcmpeqsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p
res_i = vec_any_nan(vd);
// CHECK: @llvm.ppc.vsx.xvcmpeqdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p
res_i = vec_any_numeric(vf);
// CHECK: @llvm.ppc.vsx.xvcmpeqsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p
res_i = vec_any_numeric(vd);
// CHECK: @llvm.ppc.vsx.xvcmpeqdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p
dummy();
// CHECK: call void @dummy()
// CHECK-LE: call void @dummy()
res_i = vec_all_ne(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpeqsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p
res_i = vec_all_ne(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpeqdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p
res_i = vec_all_nle(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpgesp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p
@ -109,6 +177,30 @@ void test1() {
// CHECK: @llvm.ppc.vsx.xvcmpgtdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p
res_i = vec_all_nge(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpgesp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgesp.p
res_i = vec_all_nge(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpgedp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgedp.p
res_i = vec_all_ngt(vf, vf);
// CHECK: @llvm.ppc.vsx.xvcmpgtsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgtsp.p
res_i = vec_all_ngt(vd, vd);
// CHECK: @llvm.ppc.vsx.xvcmpgtdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpgtdp.p
res_i = vec_all_nan(vf);
// CHECK: @llvm.ppc.vsx.xvcmpeqsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p
res_i = vec_all_nan(vd);
// CHECK: @llvm.ppc.vsx.xvcmpeqdp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqdp.p
res_i = vec_all_numeric(vf);
// CHECK: @llvm.ppc.vsx.xvcmpeqsp.p
// CHECK-LE: @llvm.ppc.vsx.xvcmpeqsp.p