diff options
author | Haochen Gui <guihaoc@gcc.gnu.org> | 2023-08-16 14:29:36 +0800 |
---|---|---|
committer | Haochen Gui <guihaoc@gcc.gnu.org> | 2023-08-16 14:54:20 +0800 |
commit | d471bdb0453de7b738f49148b66d57cb5871937d (patch) | |
tree | 5083a63fa5d9a5f9ec7754e3447a901cc680cc5e | |
parent | a79cf858b39e01c80537bc5d47a5e9004418c267 (diff) | |
download | gcc-d471bdb0453de7b738f49148b66d57cb5871937d.zip gcc-d471bdb0453de7b738f49148b66d57cb5871937d.tar.gz gcc-d471bdb0453de7b738f49148b66d57cb5871937d.tar.bz2 |
rs6000: Skip unnecessary vector extract for certain elements.
If the extracted element index is:
- for byte, 7 on BE while 8 on LE;
- for half word, 3 on BE while 4 on LE;
the element to be stored is already in the corresponding place for
stxsi[hb]x. We don't need a redundant vector extraction at all.
gcc/
PR target/110429
* config/rs6000/vsx.md (*vsx_extract_<mode>_store_p9): Skip vector
extract when the element is 7 on BE while 8 on LE for byte or 3 on
BE while 4 on LE for halfword.
gcc/testsuite/
PR target/110429
* gcc.target/powerpc/pr110429.c: New.
-rw-r--r-- | gcc/config/rs6000/vsx.md | 16 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr110429.c | 28 |
2 files changed, 43 insertions, 1 deletions
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index e4192c0..19abfeb 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -3919,7 +3919,21 @@ (parallel [(match_dup 2)]))) (clobber (match_dup 4))]) (set (match_dup 0) - (match_dup 3))]) + (match_dup 3))] +{ + if (which_alternative == 0 + && ((<MODE>mode == V16QImode + && INTVAL (operands[2]) == (BYTES_BIG_ENDIAN ? 7 : 8)) + || (<MODE>mode == V8HImode + && INTVAL (operands[2]) == (BYTES_BIG_ENDIAN ? 3 : 4)))) + { + enum machine_mode dest_mode = GET_MODE (operands[0]); + emit_move_insn (operands[0], + gen_rtx_REG (dest_mode, REGNO (operands[3]))); + DONE; + } +}) + ;; Extract from word 0, 2, 3 (BE order). (define_insn_and_split "*vsx_extract_v4si_w023" diff --git a/gcc/testsuite/gcc.target/powerpc/pr110429.c b/gcc/testsuite/gcc.target/powerpc/pr110429.c new file mode 100644 index 0000000..d0ea3e5 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr110429.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-options "-mdejagnu-cpu=power9 -O2" } */ +/* { dg-require-effective-target has_arch_ppc64 } */ + +#include <altivec.h> + +#ifdef __BIG_ENDIAN__ +#define DWORD0_FIRST_SHORT 3 +#define DWORD0_FIRST_CHAR 7 +#else +#define DWORD0_FIRST_SHORT 4 +#define DWORD0_FIRST_CHAR 8 +#endif + +void vec_extract_short (vector short v, short* p) +{ + *p = vec_extract(v, DWORD0_FIRST_SHORT); +} + +void vec_extract_char (vector char v, char* p) +{ + *p = vec_extract(v, DWORD0_FIRST_CHAR); +} + +/* { dg-final { scan-assembler-times {\mstxsi[hb]x\M} 2 } } */ +/* { dg-final { scan-assembler-not {\mvextractu[hb]\M} } } */ |