diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h index 55f04d0efbd6de..ee39b521c0caf4 100644 --- a/clang/lib/Headers/altivec.h +++ b/clang/lib/Headers/altivec.h @@ -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,38 +16579,91 @@ 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 */ diff --git a/clang/test/CodeGen/builtins-ppc-vsx.c b/clang/test/CodeGen/builtins-ppc-vsx.c index 398a5023eaf32c..e13f1ee1c058f6 100644 --- a/clang/test/CodeGen/builtins-ppc-vsx.c +++ b/clang/test/CodeGen/builtins-ppc-vsx.c @@ -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