Index: lib/Headers/altivec.h =================================================================== --- lib/Headers/altivec.h +++ lib/Headers/altivec.h @@ -1891,6 +1891,22 @@ return __builtin_altivec_vcfux((vector int)__a, __b); } +#ifdef __VSX__ +static vector double __ATTRS_o_ai vec_ctf(vector unsigned long long __a, + int __b) { + vector double __ret = __builtin_convertvector(__a, vector double); + __ret *= (vector double)(vector unsigned long long)((0x3ffULL - __b) << 52); + return __ret; +} + +static vector double __ATTRS_o_ai vec_ctf(vector signed long long __a, + int __b) { + vector double __ret = __builtin_convertvector(__a, vector double); + __ret *= (vector double)(vector unsigned long long)((0x3ffULL - __b) << 52); + return __ret; +} +#endif + /* vec_vcfsx */ static vector float __attribute__((__always_inline__)) @@ -1907,11 +1923,18 @@ /* vec_cts */ -static vector int __attribute__((__always_inline__)) -vec_cts(vector float __a, int __b) { +static vector int __ATTRS_o_ai vec_cts(vector float __a, int __b) { return __builtin_altivec_vctsxs(__a, __b); } +#ifdef __VSX__ +static vector signed long long __ATTRS_o_ai vec_cts(vector double __a, + int __b) { + __a *= (vector double)(vector unsigned long long)((0x3ffULL + __b) << 52); + return __builtin_convertvector(__a, vector signed long long); +} +#endif + /* vec_vctsxs */ static vector int __attribute__((__always_inline__)) @@ -1921,11 +1944,18 @@ /* vec_ctu */ -static vector unsigned int __attribute__((__always_inline__)) -vec_ctu(vector float __a, int __b) { +static vector unsigned int __ATTRS_o_ai vec_ctu(vector float __a, int __b) { return __builtin_altivec_vctuxs(__a, __b); } +#ifdef __VSX__ +static vector unsigned long long __ATTRS_o_ai vec_ctu(vector double __a, + int __b) { + __a *= (vector double)(vector unsigned long long)((0x3ffULL + __b) << 52); + return __builtin_convertvector(__a, vector unsigned long long); +} +#endif + /* vec_vctuxs */ static vector unsigned int __attribute__((__always_inline__)) Index: test/CodeGen/builtins-ppc-vsx.c =================================================================== --- test/CodeGen/builtins-ppc-vsx.c +++ test/CodeGen/builtins-ppc-vsx.c @@ -845,4 +845,51 @@ // CHECK: xor <2 x i64> // CHECK-LE: xor <2 x i64> + res_vsll = vec_cts(vd, 0); +// CHECK: fmul <2 x double> +// CHECK: fptosi <2 x double> %{{.*}} to <2 x i64> +// CHECK-LE: fmul <2 x double> +// CHECK-LE: fptosi <2 x double> %{{.*}} to <2 x i64> + + res_vsll = vec_cts(vd, 31); +// CHECK: fmul <2 x double> +// CHECK: fptosi <2 x double> %{{.*}} to <2 x i64> +// CHECK-LE: fmul <2 x double> +// CHECK-LE: fptosi <2 x double> %{{.*}} to <2 x i64> + + res_vsll = vec_ctu(vd, 0); +// CHECK: fmul <2 x double> +// CHECK: fptoui <2 x double> %{{.*}} to <2 x i64> +// CHECK-LE: fmul <2 x double> +// CHECK-LE: fptoui <2 x double> %{{.*}} to <2 x i64> + + res_vsll = vec_ctu(vd, 31); +// CHECK: fmul <2 x double> +// CHECK: fptoui <2 x double> %{{.*}} to <2 x i64> +// CHECK-LE: fmul <2 x double> +// CHECK-LE: fptoui <2 x double> %{{.*}} to <2 x i64> + + res_vd = vec_ctf(vsll, 0); +// CHECK: sitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK: fmul <2 x double> +// CHECK-LE: sitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK-LE: fmul <2 x double> + + res_vd = vec_ctf(vsll, 31); +// CHECK: sitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK: fmul <2 x double> +// CHECK-LE: sitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK-LE: fmul <2 x double> + + res_vd = vec_ctf(vull, 0); +// CHECK: uitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK: fmul <2 x double> +// CHECK-LE: uitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK-LE: fmul <2 x double> + + res_vd = vec_ctf(vull, 31); +// CHECK: uitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK: fmul <2 x double> +// CHECK-LE: uitofp <2 x i64> %{{.*}} to <2 x double> +// CHECK-LE: fmul <2 x double> }