Index: gcc/gcc/config/rs6000/rs6000-c.c |
diff --git a/gcc/gcc/config/rs6000/rs6000-c.c b/gcc/gcc/config/rs6000/rs6000-c.c |
index 3cae1c69588279e41d7ec265e8da8b6178eaf9d0..46417f3ba7626b26dc3b7cf4602c956866e12569 100644 |
--- a/gcc/gcc/config/rs6000/rs6000-c.c |
+++ b/gcc/gcc/config/rs6000/rs6000-c.c |
@@ -1,5 +1,5 @@ |
/* Subroutines for the C front end on the POWER and PowerPC architectures. |
- Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by Zack Weinberg <zack@codesourcery.com> |
@@ -101,7 +101,7 @@ altivec_categorize_keyword (const cpp_token *tok) |
{ |
if (tok->type == CPP_NAME) |
{ |
- cpp_hashnode *ident = tok->val.node; |
+ cpp_hashnode *ident = tok->val.node.node; |
if (ident == C_CPP_HASHNODE (vector_keyword)) |
return C_CPP_HASHNODE (__vector_keyword); |
@@ -157,7 +157,7 @@ init_vector_keywords (void) |
static cpp_hashnode * |
rs6000_macro_to_expand (cpp_reader *pfile, const cpp_token *tok) |
{ |
- cpp_hashnode *expand_this = tok->val.node; |
+ cpp_hashnode *expand_this = tok->val.node.node; |
cpp_hashnode *ident; |
ident = altivec_categorize_keyword (tok); |
@@ -214,7 +214,8 @@ rs6000_macro_to_expand (cpp_reader *pfile, const cpp_token *tok) |
if (rid_code == RID_UNSIGNED || rid_code == RID_LONG |
|| rid_code == RID_SHORT || rid_code == RID_SIGNED |
|| rid_code == RID_INT || rid_code == RID_CHAR |
- || rid_code == RID_FLOAT) |
+ || rid_code == RID_FLOAT |
+ || (rid_code == RID_DOUBLE && TARGET_VSX)) |
{ |
expand_this = C_CPP_HASHNODE (__vector_keyword); |
/* If the next keyword is bool or pixel, it |
@@ -284,6 +285,8 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile) |
builtin_define ("_ARCH_PWR6X"); |
if (! TARGET_POWER && ! TARGET_POWER2 && ! TARGET_POWERPC) |
builtin_define ("_ARCH_COM"); |
+ if (TARGET_POPCNTD) |
+ builtin_define ("_ARCH_PWR7"); |
if (TARGET_ALTIVEC) |
{ |
builtin_define ("__ALTIVEC__"); |
@@ -326,6 +329,43 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile) |
/* Used by libstdc++. */ |
if (TARGET_NO_LWSYNC) |
builtin_define ("__NO_LWSYNC__"); |
+ if (TARGET_VSX) |
+ { |
+ builtin_define ("__VSX__"); |
+ |
+ /* For the VSX builtin functions identical to Altivec functions, just map |
+ the altivec builtin into the vsx version (the altivec functions |
+ generate VSX code if -mvsx). */ |
+ builtin_define ("__builtin_vsx_xxland=__builtin_vec_and"); |
+ builtin_define ("__builtin_vsx_xxlandc=__builtin_vec_andc"); |
+ builtin_define ("__builtin_vsx_xxlnor=__builtin_vec_nor"); |
+ builtin_define ("__builtin_vsx_xxlor=__builtin_vec_or"); |
+ builtin_define ("__builtin_vsx_xxlxor=__builtin_vec_xor"); |
+ builtin_define ("__builtin_vsx_xxsel=__builtin_vec_sel"); |
+ builtin_define ("__builtin_vsx_vperm=__builtin_vec_perm"); |
+ |
+ /* Also map the a and m versions of the multiply/add instructions to the |
+ builtin for people blindly going off the instruction manual. */ |
+ builtin_define ("__builtin_vsx_xvmaddadp=__builtin_vsx_xvmadddp"); |
+ builtin_define ("__builtin_vsx_xvmaddmdp=__builtin_vsx_xvmadddp"); |
+ builtin_define ("__builtin_vsx_xvmaddasp=__builtin_vsx_xvmaddsp"); |
+ builtin_define ("__builtin_vsx_xvmaddmsp=__builtin_vsx_xvmaddsp"); |
+ builtin_define ("__builtin_vsx_xvmsubadp=__builtin_vsx_xvmsubdp"); |
+ builtin_define ("__builtin_vsx_xvmsubmdp=__builtin_vsx_xvmsubdp"); |
+ builtin_define ("__builtin_vsx_xvmsubasp=__builtin_vsx_xvmsubsp"); |
+ builtin_define ("__builtin_vsx_xvmsubmsp=__builtin_vsx_xvmsubsp"); |
+ builtin_define ("__builtin_vsx_xvnmaddadp=__builtin_vsx_xvnmadddp"); |
+ builtin_define ("__builtin_vsx_xvnmaddmdp=__builtin_vsx_xvnmadddp"); |
+ builtin_define ("__builtin_vsx_xvnmaddasp=__builtin_vsx_xvnmaddsp"); |
+ builtin_define ("__builtin_vsx_xvnmaddmsp=__builtin_vsx_xvnmaddsp"); |
+ builtin_define ("__builtin_vsx_xvnmsubadp=__builtin_vsx_xvnmsubdp"); |
+ builtin_define ("__builtin_vsx_xvnmsubmdp=__builtin_vsx_xvnmsubdp"); |
+ builtin_define ("__builtin_vsx_xvnmsubasp=__builtin_vsx_xvnmsubsp"); |
+ builtin_define ("__builtin_vsx_xvnmsubmsp=__builtin_vsx_xvnmsubsp"); |
+ } |
+ |
+ /* Tell users they can use __builtin_bswap{16,64}. */ |
+ builtin_define ("__HAVE_BSWAP__"); |
/* May be overridden by target configuration. */ |
RS6000_CPU_CPP_ENDIAN_BUILTINS(); |
@@ -355,6 +395,26 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile) |
/* Let the compiled code know if 'f' class registers will not be available. */ |
if (TARGET_SOFT_FLOAT || !TARGET_FPRS) |
builtin_define ("__NO_FPRS__"); |
+ |
+ /* Generate defines for Xilinx FPU. */ |
+ if (rs6000_xilinx_fpu) |
+ { |
+ builtin_define ("_XFPU"); |
+ if (rs6000_single_float && ! rs6000_double_float) |
+ { |
+ if (rs6000_simple_fpu) |
+ builtin_define ("_XFPU_SP_LITE"); |
+ else |
+ builtin_define ("_XFPU_SP_FULL"); |
+ } |
+ if (rs6000_double_float) |
+ { |
+ if (rs6000_simple_fpu) |
+ builtin_define ("_XFPU_DP_LITE"); |
+ else |
+ builtin_define ("_XFPU_DP_FULL"); |
+ } |
+ } |
} |
@@ -369,7 +429,7 @@ struct altivec_builtin_types |
}; |
const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
- /* Unary AltiVec builtins. */ |
+ /* Unary AltiVec/VSX builtins. */ |
{ ALTIVEC_BUILTIN_VEC_ABS, ALTIVEC_BUILTIN_ABS_V16QI, |
RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ABS, ALTIVEC_BUILTIN_ABS_V8HI, |
@@ -378,6 +438,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ABS, ALTIVEC_BUILTIN_ABS_V4SF, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_ABS, VSX_BUILTIN_XVABSDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ABSS, ALTIVEC_BUILTIN_ABSS_V16QI, |
RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ABSS, ALTIVEC_BUILTIN_ABSS_V8HI, |
@@ -386,8 +448,12 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CEIL, ALTIVEC_BUILTIN_VRFIP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_CEIL, VSX_BUILTIN_XVRDPIP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_EXPTE, ALTIVEC_BUILTIN_VEXPTEFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_FLOOR, VSX_BUILTIN_XVRDPIM, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_FLOOR, ALTIVEC_BUILTIN_VRFIM, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_LOGE, ALTIVEC_BUILTIN_VLOGEFP, |
@@ -420,6 +486,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_TRUNC, ALTIVEC_BUILTIN_VRFIZ, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_TRUNC, VSX_BUILTIN_XVRDPIZ, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_UNPACKH, ALTIVEC_BUILTIN_VUPKHSB, |
RS6000_BTI_V8HI, RS6000_BTI_V16QI, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_UNPACKH, ALTIVEC_BUILTIN_VUPKHSB, |
@@ -465,7 +533,7 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
{ ALTIVEC_BUILTIN_VEC_VUPKLSB, ALTIVEC_BUILTIN_VUPKLSB, |
RS6000_BTI_bool_V8HI, RS6000_BTI_bool_V16QI, 0, 0 }, |
- /* Binary AltiVec builtins. */ |
+ /* Binary AltiVec/VSX builtins. */ |
{ ALTIVEC_BUILTIN_VEC_ADD, ALTIVEC_BUILTIN_VADDUBM, |
RS6000_BTI_V16QI, RS6000_BTI_bool_V16QI, RS6000_BTI_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ADD, ALTIVEC_BUILTIN_VADDUBM, |
@@ -504,6 +572,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ADD, ALTIVEC_BUILTIN_VADDFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_ADD, VSX_BUILTIN_XVADDDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VADDFP, ALTIVEC_BUILTIN_VADDFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VADDUWM, ALTIVEC_BUILTIN_VADDUWM, |
@@ -647,6 +717,12 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
{ ALTIVEC_BUILTIN_VEC_AND, ALTIVEC_BUILTIN_VAND, |
RS6000_BTI_V4SF, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_AND, ALTIVEC_BUILTIN_VAND, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_AND, ALTIVEC_BUILTIN_VAND, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_AND, ALTIVEC_BUILTIN_VAND, |
+ RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_AND, ALTIVEC_BUILTIN_VAND, |
RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_AND, ALTIVEC_BUILTIN_VAND, |
RS6000_BTI_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SI, 0 }, |
@@ -695,6 +771,12 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
{ ALTIVEC_BUILTIN_VEC_ANDC, ALTIVEC_BUILTIN_VANDC, |
RS6000_BTI_V4SF, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ANDC, ALTIVEC_BUILTIN_VANDC, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_ANDC, ALTIVEC_BUILTIN_VANDC, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_ANDC, ALTIVEC_BUILTIN_VANDC, |
+ RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_ANDC, ALTIVEC_BUILTIN_VANDC, |
RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_ANDC, ALTIVEC_BUILTIN_VANDC, |
RS6000_BTI_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SI, 0 }, |
@@ -776,6 +858,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_bool_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQFP, |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_CMPEQ, VSX_BUILTIN_XVCMPEQDP, |
+ RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VCMPEQFP, ALTIVEC_BUILTIN_VCMPEQFP, |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
@@ -796,6 +880,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
{ ALTIVEC_BUILTIN_VEC_CMPGE, ALTIVEC_BUILTIN_VCMPGEFP, |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_CMPGE, VSX_BUILTIN_XVCMPGEDP, |
+ RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPGT, ALTIVEC_BUILTIN_VCMPGTUB, |
RS6000_BTI_bool_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPGT, ALTIVEC_BUILTIN_VCMPGTSB, |
@@ -810,6 +896,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPGT, ALTIVEC_BUILTIN_VCMPGTFP, |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_CMPGT, VSX_BUILTIN_XVCMPGTDP, |
+ RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VCMPGTFP, ALTIVEC_BUILTIN_VCMPGTFP, |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VCMPGTSW, ALTIVEC_BUILTIN_VCMPGTSW, |
@@ -838,6 +926,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_bool_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPLE, ALTIVEC_BUILTIN_VCMPGEFP, |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_CMPLE, VSX_BUILTIN_XVCMPGEDP, |
+ RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPLT, ALTIVEC_BUILTIN_VCMPGTUB, |
RS6000_BTI_bool_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPLT, ALTIVEC_BUILTIN_VCMPGTSB, |
@@ -852,6 +942,12 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CMPLT, ALTIVEC_BUILTIN_VCMPGTFP, |
RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_CMPLT, VSX_BUILTIN_XVCMPGTDP, |
+ RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_COPYSIGN, VSX_BUILTIN_CPSGNDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_COPYSIGN, ALTIVEC_BUILTIN_COPYSIGN_V4SF, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CTF, ALTIVEC_BUILTIN_VCFUX, |
RS6000_BTI_V4SF, RS6000_BTI_unsigned_V4SI, RS6000_BTI_INTSI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CTF, ALTIVEC_BUILTIN_VCFSX, |
@@ -864,6 +960,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SF, RS6000_BTI_INTSI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_CTU, ALTIVEC_BUILTIN_VCTUXS, |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_V4SF, RS6000_BTI_INTSI, 0 }, |
+ { VSX_BUILTIN_VEC_DIV, VSX_BUILTIN_XVDIVSP, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { VSX_BUILTIN_VEC_DIV, VSX_BUILTIN_XVDIVDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX, |
RS6000_BTI_V4SF, RS6000_BTI_INTSI, ~RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX, |
@@ -1198,6 +1298,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_MAX, ALTIVEC_BUILTIN_VMAXFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_MAX, VSX_BUILTIN_XVMAXDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMAXFP, ALTIVEC_BUILTIN_VMAXFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMAXSW, ALTIVEC_BUILTIN_VMAXSW, |
@@ -1270,6 +1372,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_MERGEH, ALTIVEC_BUILTIN_VMRGHW, |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_MERGEH, VSX_BUILTIN_VEC_MERGEH_V2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_MERGEH, VSX_BUILTIN_VEC_MERGEH_V2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMRGHW, ALTIVEC_BUILTIN_VMRGHW, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMRGHW, ALTIVEC_BUILTIN_VMRGHW, |
@@ -1314,6 +1420,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_MERGEL, ALTIVEC_BUILTIN_VMRGLW, |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_MERGEL, VSX_BUILTIN_VEC_MERGEL_V2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_MERGEL, VSX_BUILTIN_VEC_MERGEL_V2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMRGLW, ALTIVEC_BUILTIN_VMRGLW, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMRGLW, ALTIVEC_BUILTIN_VMRGLW, |
@@ -1374,6 +1484,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_MIN, ALTIVEC_BUILTIN_VMINFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_MIN, VSX_BUILTIN_XVMINDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMINFP, ALTIVEC_BUILTIN_VMINFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMINSW, ALTIVEC_BUILTIN_VMINSW, |
@@ -1424,6 +1536,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_unsigned_V16QI, RS6000_BTI_bool_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMINUB, ALTIVEC_BUILTIN_VMINUB, |
RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_bool_V16QI, 0 }, |
+ { VSX_BUILTIN_VEC_MUL, VSX_BUILTIN_XVMULSP, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { VSX_BUILTIN_VEC_MUL, VSX_BUILTIN_XVMULDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_MULE, ALTIVEC_BUILTIN_VMULEUB, |
RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_MULE, ALTIVEC_BUILTIN_VMULESB, |
@@ -1456,9 +1572,15 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V8HI, RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VMULOUB, ALTIVEC_BUILTIN_VMULOUB, |
RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_NEARBYINT, VSX_BUILTIN_XVRDPI, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_NEARBYINT, VSX_BUILTIN_XVRSPI, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_NOR, ALTIVEC_BUILTIN_VNOR, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_NOR, ALTIVEC_BUILTIN_VNOR, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_NOR, ALTIVEC_BUILTIN_VNOR, |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_NOR, ALTIVEC_BUILTIN_VNOR, |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
@@ -1483,6 +1605,12 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
{ ALTIVEC_BUILTIN_VEC_OR, ALTIVEC_BUILTIN_VOR, |
RS6000_BTI_V4SF, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_OR, ALTIVEC_BUILTIN_VOR, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_OR, ALTIVEC_BUILTIN_VOR, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_OR, ALTIVEC_BUILTIN_VOR, |
+ RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_OR, ALTIVEC_BUILTIN_VOR, |
RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_OR, ALTIVEC_BUILTIN_VOR, |
RS6000_BTI_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SI, 0 }, |
@@ -1578,6 +1706,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_unsigned_V8HI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VPKSHUS, ALTIVEC_BUILTIN_VPKSHUS, |
RS6000_BTI_unsigned_V16QI, RS6000_BTI_V8HI, RS6000_BTI_V8HI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_RINT, VSX_BUILTIN_XVRDPIC, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_RINT, VSX_BUILTIN_XVRSPIC, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_RL, ALTIVEC_BUILTIN_VRLB, |
RS6000_BTI_V16QI, RS6000_BTI_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_RL, ALTIVEC_BUILTIN_VRLB, |
@@ -1614,6 +1746,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_SL, ALTIVEC_BUILTIN_VSLW, |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_SQRT, VSX_BUILTIN_XVSQRTDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_SQRT, VSX_BUILTIN_XVSQRTSP, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VSLW, ALTIVEC_BUILTIN_VSLW, |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VSLW, ALTIVEC_BUILTIN_VSLW, |
@@ -1940,6 +2076,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_SUB, ALTIVEC_BUILTIN_VSUBFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_SUB, VSX_BUILTIN_XVSUBDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VSUBFP, ALTIVEC_BUILTIN_VSUBFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_VSUBUWM, ALTIVEC_BUILTIN_VSUBUWM, |
@@ -2099,6 +2237,12 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
{ ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR, |
RS6000_BTI_V4SF, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, 0 }, |
{ ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR, |
+ RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI, RS6000_BTI_V2DF, 0 }, |
+ { ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR, |
RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, 0 }, |
{ ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR, |
RS6000_BTI_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_V4SI, 0 }, |
@@ -2141,7 +2285,7 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
{ ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR, |
RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0 }, |
- /* Ternary AltiVec builtins. */ |
+ /* Ternary AltiVec/VSX builtins. */ |
{ ALTIVEC_BUILTIN_VEC_DST, ALTIVEC_BUILTIN_DST, |
RS6000_BTI_void, ~RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI, RS6000_BTI_INTSI }, |
{ ALTIVEC_BUILTIN_VEC_DST, ALTIVEC_BUILTIN_DST, |
@@ -2304,6 +2448,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_void, ~RS6000_BTI_float, RS6000_BTI_INTSI, RS6000_BTI_INTSI }, |
{ ALTIVEC_BUILTIN_VEC_MADD, ALTIVEC_BUILTIN_VMADDFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { ALTIVEC_BUILTIN_VEC_MADD, VSX_BUILTIN_XVMADDDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
{ ALTIVEC_BUILTIN_VEC_MADDS, ALTIVEC_BUILTIN_VMHADDSHS, |
RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V8HI }, |
{ ALTIVEC_BUILTIN_VEC_MLADD, ALTIVEC_BUILTIN_VMLADDUHM, |
@@ -2316,6 +2462,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI }, |
{ ALTIVEC_BUILTIN_VEC_MRADDS, ALTIVEC_BUILTIN_VMHRADDSHS, |
RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V8HI }, |
+ { VSX_BUILTIN_VEC_MSUB, VSX_BUILTIN_XVMSUBSP, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { VSX_BUILTIN_VEC_MSUB, VSX_BUILTIN_XVMSUBDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
{ ALTIVEC_BUILTIN_VEC_MSUM, ALTIVEC_BUILTIN_VMSUMUBM, |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V4SI }, |
{ ALTIVEC_BUILTIN_VEC_MSUM, ALTIVEC_BUILTIN_VMSUMMBM, |
@@ -2340,8 +2490,18 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_V4SI, RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V4SI }, |
{ ALTIVEC_BUILTIN_VEC_VMSUMUHS, ALTIVEC_BUILTIN_VMSUMUHS, |
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V4SI }, |
+ { VSX_BUILTIN_VEC_NMADD, VSX_BUILTIN_XVNMADDSP, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { VSX_BUILTIN_VEC_NMADD, VSX_BUILTIN_XVNMADDDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
{ ALTIVEC_BUILTIN_VEC_NMSUB, ALTIVEC_BUILTIN_VNMSUBFP, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { ALTIVEC_BUILTIN_VEC_NMSUB, VSX_BUILTIN_XVNMSUBDP, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
+ { ALTIVEC_BUILTIN_VEC_PERM, ALTIVEC_BUILTIN_VPERM_2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_unsigned_V16QI }, |
+ { ALTIVEC_BUILTIN_VEC_PERM, ALTIVEC_BUILTIN_VPERM_2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_unsigned_V16QI }, |
{ ALTIVEC_BUILTIN_VEC_PERM, ALTIVEC_BUILTIN_VPERM_4SF, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_unsigned_V16QI }, |
{ ALTIVEC_BUILTIN_VEC_PERM, ALTIVEC_BUILTIN_VPERM_4SI, |
@@ -2368,11 +2528,29 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI, RS6000_BTI_unsigned_V16QI }, |
{ ALTIVEC_BUILTIN_VEC_PERM, ALTIVEC_BUILTIN_VPERM_16QI, |
RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_bool_V2DI }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_unsigned_V2DI }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DI }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_bool_V2DI }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_unsigned_V2DI }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI }, |
{ ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_4SF, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_bool_V4SI }, |
{ ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_4SF, |
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_unsigned_V4SI }, |
{ ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_4SI, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_4SI, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SI }, |
+ { ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_4SI, |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_bool_V4SI }, |
{ ALTIVEC_BUILTIN_VEC_SEL, ALTIVEC_BUILTIN_VSEL_4SI, |
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_unsigned_V4SI }, |
@@ -2740,6 +2918,54 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_void, RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_unsigned_V16QI }, |
{ ALTIVEC_BUILTIN_VEC_STVRXL, ALTIVEC_BUILTIN_STVRXL, |
RS6000_BTI_void, RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_UINTQI }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_16QI, |
+ RS6000_BTI_V16QI, RS6000_BTI_V16QI, RS6000_BTI_V16QI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_16QI, |
+ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, |
+ RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_8HI, |
+ RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_8HI, |
+ RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, |
+ RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_4SI, |
+ RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_4SI, |
+ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, |
+ RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_2DI, |
+ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, |
+ RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_4SF, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_2DF, |
+ RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_2DI, |
+ RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_2DI, |
+ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, |
+ RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_4SF, |
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_4SI, |
+ RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_4SI, |
+ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, |
+ RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_8HI, |
+ RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V8HI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_8HI, |
+ RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, |
+ RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_16QI, |
+ RS6000_BTI_V16QI, RS6000_BTI_V16QI, RS6000_BTI_V16QI, RS6000_BTI_NOT_OPAQUE }, |
+ { VSX_BUILTIN_VEC_XXPERMDI, VSX_BUILTIN_XXPERMDI_16QI, |
+ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, |
+ RS6000_BTI_NOT_OPAQUE }, |
/* Predicates. */ |
{ ALTIVEC_BUILTIN_VCMPGT_P, ALTIVEC_BUILTIN_VCMPGTUB_P, |
@@ -2780,6 +3006,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V4SI, RS6000_BTI_V4SI }, |
{ ALTIVEC_BUILTIN_VCMPGT_P, ALTIVEC_BUILTIN_VCMPGTFP_P, |
RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { ALTIVEC_BUILTIN_VCMPGT_P, VSX_BUILTIN_XVCMPGTDP_P, |
+ RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
{ ALTIVEC_BUILTIN_VCMPEQ_P, ALTIVEC_BUILTIN_VCMPEQUB_P, |
@@ -2828,6 +3056,8 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI }, |
{ ALTIVEC_BUILTIN_VCMPEQ_P, ALTIVEC_BUILTIN_VCMPEQFP_P, |
RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { ALTIVEC_BUILTIN_VCMPEQ_P, VSX_BUILTIN_XVCMPEQDP_P, |
+ RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
/* cmpge is the same as cmpgt for all cases except floating point. |
@@ -2871,8 +3101,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { |
RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V4SI, RS6000_BTI_V4SI }, |
{ ALTIVEC_BUILTIN_VCMPGE_P, ALTIVEC_BUILTIN_VCMPGEFP_P, |
RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V4SF, RS6000_BTI_V4SF }, |
+ { ALTIVEC_BUILTIN_VCMPGE_P, VSX_BUILTIN_XVCMPGEDP_P, |
+ RS6000_BTI_INTSI, RS6000_BTI_INTSI, RS6000_BTI_V2DF, RS6000_BTI_V2DF }, |
- { 0, 0, 0, 0, 0, 0 } |
+ { (enum rs6000_builtins) 0, (enum rs6000_builtins) 0, 0, 0, 0, 0 } |
}; |
@@ -2981,16 +3213,21 @@ altivec_build_resolved_builtin (tree *args, int n, |
support Altivec's overloaded builtins. */ |
tree |
-altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
+altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, |
+ void *passed_arglist) |
{ |
+ VEC(tree,gc) *arglist = (VEC(tree,gc) *) passed_arglist; |
+ unsigned int nargs = VEC_length (tree, arglist); |
unsigned int fcode = DECL_FUNCTION_CODE (fndecl); |
tree fnargs = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); |
tree types[3], args[3]; |
const struct altivec_builtin_types *desc; |
- int n; |
+ unsigned int n; |
- if (fcode < ALTIVEC_BUILTIN_OVERLOADED_FIRST |
- || fcode > ALTIVEC_BUILTIN_OVERLOADED_LAST) |
+ if ((fcode < ALTIVEC_BUILTIN_OVERLOADED_FIRST |
+ || fcode > ALTIVEC_BUILTIN_OVERLOADED_LAST) |
+ && (fcode < VSX_BUILTIN_OVERLOADED_FIRST |
+ || fcode > VSX_BUILTIN_OVERLOADED_LAST)) |
return NULL_TREE; |
/* For now treat vec_splats and vec_promote as the same. */ |
@@ -3004,43 +3241,38 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
VEC(constructor_elt,gc) *vec; |
const char *name = fcode == ALTIVEC_BUILTIN_VEC_SPLATS ? "vec_splats": "vec_promote"; |
- if (!arglist) |
+ if (nargs == 0) |
{ |
error ("%s only accepts %d arguments", name, (fcode == ALTIVEC_BUILTIN_VEC_PROMOTE)+1 ); |
return error_mark_node; |
} |
- if (fcode == ALTIVEC_BUILTIN_VEC_SPLATS && TREE_CHAIN (arglist)) |
+ if (fcode == ALTIVEC_BUILTIN_VEC_SPLATS && nargs != 1) |
{ |
error ("%s only accepts 1 argument", name); |
return error_mark_node; |
} |
- if (fcode == ALTIVEC_BUILTIN_VEC_PROMOTE && !TREE_CHAIN (arglist)) |
+ if (fcode == ALTIVEC_BUILTIN_VEC_PROMOTE && nargs != 2) |
{ |
error ("%s only accepts 2 arguments", name); |
return error_mark_node; |
} |
/* Ignore promote's element argument. */ |
if (fcode == ALTIVEC_BUILTIN_VEC_PROMOTE |
- && TREE_CHAIN (TREE_CHAIN (arglist))) |
- { |
- error ("%s only accepts 2 arguments", name); |
- return error_mark_node; |
- } |
- if (fcode == ALTIVEC_BUILTIN_VEC_PROMOTE |
- && !INTEGRAL_TYPE_P (TREE_TYPE (TREE_VALUE (TREE_CHAIN (arglist))))) |
+ && !INTEGRAL_TYPE_P (TREE_TYPE (VEC_index (tree, arglist, 1)))) |
goto bad; |
- arg = TREE_VALUE (arglist); |
+ arg = VEC_index (tree, arglist, 0); |
type = TREE_TYPE (arg); |
if (!SCALAR_FLOAT_TYPE_P (type) |
&& !INTEGRAL_TYPE_P (type)) |
goto bad; |
unsigned_p = TYPE_UNSIGNED (type); |
- if (type == long_long_unsigned_type_node |
- || type == long_long_integer_type_node) |
- goto bad; |
switch (TYPE_MODE (type)) |
{ |
+ case DImode: |
+ type = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node); |
+ size = 2; |
+ break; |
case SImode: |
type = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node); |
size = 4; |
@@ -3054,6 +3286,7 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
size = 16; |
break; |
case SFmode: type = V4SF_type_node; size = 4; break; |
+ case DFmode: type = V2DF_type_node; size = 2; break; |
default: |
goto bad; |
} |
@@ -3070,7 +3303,8 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
return build_constructor (type, vec); |
} |
- /* For now use pointer tricks to do the extaction. */ |
+ /* For now use pointer tricks to do the extaction, unless we are on VSX |
+ extracting a double from a constant offset. */ |
if (fcode == ALTIVEC_BUILTIN_VEC_EXTRACT) |
{ |
tree arg1; |
@@ -3079,30 +3313,49 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
tree arg1_inner_type; |
tree decl, stmt; |
tree innerptrtype; |
+ enum machine_mode mode; |
/* No second argument. */ |
- if (!arglist || !TREE_CHAIN (arglist) |
- || TREE_CHAIN (TREE_CHAIN (arglist))) |
+ if (nargs != 2) |
{ |
error ("vec_extract only accepts 2 arguments"); |
return error_mark_node; |
} |
- arg2 = TREE_VALUE (TREE_CHAIN (arglist)); |
- arg1 = TREE_VALUE (arglist); |
+ arg2 = VEC_index (tree, arglist, 1); |
+ arg1 = VEC_index (tree, arglist, 0); |
arg1_type = TREE_TYPE (arg1); |
if (TREE_CODE (arg1_type) != VECTOR_TYPE) |
goto bad; |
if (!INTEGRAL_TYPE_P (TREE_TYPE (arg2))) |
goto bad; |
+ |
+ /* If we can use the VSX xxpermdi instruction, use that for extract. */ |
+ mode = TYPE_MODE (arg1_type); |
+ if ((mode == V2DFmode || mode == V2DImode) && VECTOR_MEM_VSX_P (mode) |
+ && TREE_CODE (arg2) == INTEGER_CST |
+ && TREE_INT_CST_HIGH (arg2) == 0 |
+ && (TREE_INT_CST_LOW (arg2) == 0 || TREE_INT_CST_LOW (arg2) == 1)) |
+ { |
+ tree call = NULL_TREE; |
+ |
+ if (mode == V2DFmode) |
+ call = rs6000_builtin_decls[VSX_BUILTIN_VEC_EXT_V2DF]; |
+ else if (mode == V2DImode) |
+ call = rs6000_builtin_decls[VSX_BUILTIN_VEC_EXT_V2DI]; |
+ |
+ if (call) |
+ return build_call_expr (call, 2, arg1, arg2); |
+ } |
+ |
/* Build *(((arg1_inner_type*)&(vector type){arg1})+arg2). */ |
arg1_inner_type = TREE_TYPE (arg1_type); |
- arg2 = build_binary_op (input_location, BIT_AND_EXPR, arg2, |
+ arg2 = build_binary_op (loc, BIT_AND_EXPR, arg2, |
build_int_cst (TREE_TYPE (arg2), |
TYPE_VECTOR_SUBPARTS (arg1_type) |
- 1), 0); |
- decl = build_decl (VAR_DECL, NULL_TREE, arg1_type); |
+ decl = build_decl (loc, VAR_DECL, NULL_TREE, arg1_type); |
DECL_EXTERNAL (decl) = 0; |
TREE_PUBLIC (decl) = 0; |
DECL_CONTEXT (decl) = current_function_decl; |
@@ -3112,20 +3365,21 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
DECL_INITIAL (decl) = arg1; |
stmt = build1 (DECL_EXPR, arg1_type, decl); |
TREE_ADDRESSABLE (decl) = 1; |
- SET_EXPR_LOCATION (stmt, input_location); |
+ SET_EXPR_LOCATION (stmt, loc); |
stmt = build1 (COMPOUND_LITERAL_EXPR, arg1_type, stmt); |
innerptrtype = build_pointer_type (arg1_inner_type); |
- stmt = build_unary_op (input_location, ADDR_EXPR, stmt, 0); |
+ stmt = build_unary_op (loc, ADDR_EXPR, stmt, 0); |
stmt = convert (innerptrtype, stmt); |
- stmt = build_binary_op (input_location, PLUS_EXPR, stmt, arg2, 1); |
- stmt = build_indirect_ref (input_location, stmt, NULL); |
+ stmt = build_binary_op (loc, PLUS_EXPR, stmt, arg2, 1); |
+ stmt = build_indirect_ref (loc, stmt, RO_NULL); |
return stmt; |
} |
- /* For now use pointer tricks to do the insertation. */ |
+ /* For now use pointer tricks to do the insertation, unless we are on VSX |
+ inserting a double to a constant offset.. */ |
if (fcode == ALTIVEC_BUILTIN_VEC_INSERT) |
{ |
tree arg0; |
@@ -3135,32 +3389,52 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
tree arg1_inner_type; |
tree decl, stmt; |
tree innerptrtype; |
- |
+ enum machine_mode mode; |
+ |
/* No second or third arguments. */ |
- if (!arglist || !TREE_CHAIN (arglist) |
- || !TREE_CHAIN (TREE_CHAIN (arglist)) |
- || TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist)))) |
+ if (nargs != 3) |
{ |
error ("vec_insert only accepts 3 arguments"); |
return error_mark_node; |
} |
- arg0 = TREE_VALUE (arglist); |
- arg1 = TREE_VALUE (TREE_CHAIN (arglist)); |
+ arg0 = VEC_index (tree, arglist, 0); |
+ arg1 = VEC_index (tree, arglist, 1); |
arg1_type = TREE_TYPE (arg1); |
- arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); |
+ arg2 = VEC_index (tree, arglist, 2); |
if (TREE_CODE (arg1_type) != VECTOR_TYPE) |
goto bad; |
if (!INTEGRAL_TYPE_P (TREE_TYPE (arg2))) |
goto bad; |
+ |
+ /* If we can use the VSX xxpermdi instruction, use that for insert. */ |
+ mode = TYPE_MODE (arg1_type); |
+ if ((mode == V2DFmode || mode == V2DImode) && VECTOR_UNIT_VSX_P (mode) |
+ && TREE_CODE (arg2) == INTEGER_CST |
+ && TREE_INT_CST_HIGH (arg2) == 0 |
+ && (TREE_INT_CST_LOW (arg2) == 0 || TREE_INT_CST_LOW (arg2) == 1)) |
+ { |
+ tree call = NULL_TREE; |
+ |
+ if (mode == V2DFmode) |
+ call = rs6000_builtin_decls[VSX_BUILTIN_VEC_SET_V2DF]; |
+ else if (mode == V2DImode) |
+ call = rs6000_builtin_decls[VSX_BUILTIN_VEC_SET_V2DI]; |
+ |
+ /* Note, __builtin_vec_insert_<xxx> has vector and scalar types |
+ reversed. */ |
+ if (call) |
+ return build_call_expr (call, 3, arg1, arg0, arg2); |
+ } |
+ |
/* Build *(((arg1_inner_type*)&(vector type){arg1})+arg2) = arg0. */ |
arg1_inner_type = TREE_TYPE (arg1_type); |
- arg2 = build_binary_op (input_location, BIT_AND_EXPR, arg2, |
+ arg2 = build_binary_op (loc, BIT_AND_EXPR, arg2, |
build_int_cst (TREE_TYPE (arg2), |
TYPE_VECTOR_SUBPARTS (arg1_type) |
- 1), 0); |
- decl = build_decl (VAR_DECL, NULL_TREE, arg1_type); |
+ decl = build_decl (loc, VAR_DECL, NULL_TREE, arg1_type); |
DECL_EXTERNAL (decl) = 0; |
TREE_PUBLIC (decl) = 0; |
DECL_CONTEXT (decl) = current_function_decl; |
@@ -3170,15 +3444,15 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
DECL_INITIAL (decl) = arg1; |
stmt = build1 (DECL_EXPR, arg1_type, decl); |
TREE_ADDRESSABLE (decl) = 1; |
- SET_EXPR_LOCATION (stmt, input_location); |
+ SET_EXPR_LOCATION (stmt, loc); |
stmt = build1 (COMPOUND_LITERAL_EXPR, arg1_type, stmt); |
innerptrtype = build_pointer_type (arg1_inner_type); |
- stmt = build_unary_op (input_location, ADDR_EXPR, stmt, 0); |
+ stmt = build_unary_op (loc, ADDR_EXPR, stmt, 0); |
stmt = convert (innerptrtype, stmt); |
- stmt = build_binary_op (input_location, PLUS_EXPR, stmt, arg2, 1); |
- stmt = build_indirect_ref (input_location, stmt, NULL); |
+ stmt = build_binary_op (loc, PLUS_EXPR, stmt, arg2, 1); |
+ stmt = build_indirect_ref (loc, stmt, RO_NULL); |
stmt = build2 (MODIFY_EXPR, TREE_TYPE (stmt), stmt, |
convert (TREE_TYPE (stmt), arg0)); |
stmt = build2 (COMPOUND_EXPR, arg1_type, stmt, decl); |
@@ -3186,11 +3460,11 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
} |
for (n = 0; |
- !VOID_TYPE_P (TREE_VALUE (fnargs)) && arglist; |
- fnargs = TREE_CHAIN (fnargs), arglist = TREE_CHAIN (arglist), n++) |
+ !VOID_TYPE_P (TREE_VALUE (fnargs)) && n < nargs; |
+ fnargs = TREE_CHAIN (fnargs), n++) |
{ |
tree decl_type = TREE_VALUE (fnargs); |
- tree arg = TREE_VALUE (arglist); |
+ tree arg = VEC_index (tree, arglist, n); |
tree type; |
if (arg == error_mark_node) |
@@ -3236,7 +3510,7 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
/* If the number of arguments did not match the prototype, return NULL |
and the generic code will issue the appropriate error message. */ |
- if (!VOID_TYPE_P (TREE_VALUE (fnargs)) || arglist) |
+ if (!VOID_TYPE_P (TREE_VALUE (fnargs)) || n < nargs) |
return NULL; |
if (n == 0) |
@@ -3269,4 +3543,3 @@ altivec_resolve_overloaded_builtin (tree fndecl, tree arglist) |
error ("invalid parameter combination for AltiVec intrinsic"); |
return error_mark_node; |
} |
- |