Hi, In an earlier patch, I changed vec_xl and vec_xst to make use of new POWER9 instructions when loading or storing vector short/char values. In so doing, I failed to enable the existing instruction use for -mcpu=power8, so these were no longer considered valid by the compiler. Not good.
This patch fixes the problem by using other existing built-in definitions when the POWER9 instructions are not available. I've added a test case to improve coverage and demonstrate that the problem is fixed. Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no regressions. Is this ok for trunk? Thanks, Bill [gcc] 2017-05-04 Bill Schmidt <wschm...@linux.vnet.ibm.com> * config/rs6000/rs6000.c: Define POWER8 built-ins for vec_xl and vec_xst with short and char pointer arguments. [gcc/testsuite] 2017-05-04 Bill Schmidt <wschm...@linux.vnet.ibm.com> * gcc.target/powerpc/p8-vec-xl-xst.c: New file. Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 247560) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -18183,6 +18183,17 @@ altivec_init_builtins (void) def_builtin ("__builtin_vsx_st_elemrev_v16qi", void_ftype_v16qi_long_pvoid, VSX_BUILTIN_ST_ELEMREV_V16QI); } + else + { + rs6000_builtin_decls[(int)VSX_BUILTIN_LD_ELEMREV_V8HI] + = rs6000_builtin_decls[(int)VSX_BUILTIN_LXVW4X_V8HI]; + rs6000_builtin_decls[(int)VSX_BUILTIN_LD_ELEMREV_V16QI] + = rs6000_builtin_decls[(int)VSX_BUILTIN_LXVW4X_V16QI]; + rs6000_builtin_decls[(int)VSX_BUILTIN_ST_ELEMREV_V8HI] + = rs6000_builtin_decls[(int)VSX_BUILTIN_STXVW4X_V8HI]; + rs6000_builtin_decls[(int)VSX_BUILTIN_ST_ELEMREV_V16QI] + = rs6000_builtin_decls[(int)VSX_BUILTIN_STXVW4X_V16QI]; + } def_builtin ("__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid, VSX_BUILTIN_VEC_LD); Index: gcc/testsuite/gcc.target/powerpc/p8-vec-xl-xst.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/p8-vec-xl-xst.c (nonexistent) +++ gcc/testsuite/gcc.target/powerpc/p8-vec-xl-xst.c (working copy) @@ -0,0 +1,62 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ +/* { dg-options "-mcpu=power8 -O2" } */ + +/* Verify fix for problem where vec_xl and vec_xst are not recognized + for the vector char and vector short cases on P8 only. */ + +#include <altivec.h> + +vector unsigned char +foo (unsigned char * address) +{ + return __builtin_vec_xl (0, address); +} + +void +bar (vector unsigned char x, unsigned char * address) +{ + __builtin_vec_xst (x, 0, address); +} + +vector unsigned short +foot (unsigned short * address) +{ + return __builtin_vec_xl (0, address); +} + +void +bart (vector unsigned short x, unsigned short * address) +{ + __builtin_vec_xst (x, 0, address); +} + +vector unsigned char +fool (unsigned char * address) +{ + return vec_xl (0, address); +} + +void +barl (vector unsigned char x, unsigned char * address) +{ + vec_xst (x, 0, address); +} + +vector unsigned short +footle (unsigned short * address) +{ + return vec_xl (0, address); +} + +void +bartle (vector unsigned short x, unsigned short * address) +{ + vec_xst (x, 0, address); +} + +/* { dg-final { scan-assembler-times "lxvd2x" 4 } } */ +/* { dg-final { scan-assembler-times "stxvd2x" 4 } } */ +/* { dg-final { scan-assembler-times "xxpermdi" 8 } } */