[gcc(refs/users/meissner/heads/work084)] Revert patch.
Michael Meissner
meissner@gcc.gnu.org
Thu Mar 31 14:00:17 GMT 2022
https://gcc.gnu.org/g:4b06b3b008d424f48bddb787c20897745383277e
commit 4b06b3b008d424f48bddb787c20897745383277e
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Mon Mar 28 22:57:56 2022 -0400
Revert patch.
gcc/
PR target/99293
Revert patch.
* config/rs6000/rs6000-p8swap.cc (rtx_is_swappable_p): Remove
UNSPEC_VSX_XXSPLTD case.
* config/rs6000/vsx.md (UNSPEC_VSX_XXSPLTD): Delete.
(vsx_xxspltd_<mode>): Rewrite to use VEC_DUPLICATE.
gcc/testsuite:
PR target/99293
Revert patch.
* gcc.target/powerpc/pr99293.c: New test.
Diff:
---
gcc/config/rs6000/rs6000-p8swap.cc | 1 +
gcc/config/rs6000/vsx.md | 38 +++++++-----------------------
gcc/testsuite/gcc.target/powerpc/pr99293.c | 36 ----------------------------
3 files changed, 10 insertions(+), 65 deletions(-)
diff --git a/gcc/config/rs6000/rs6000-p8swap.cc b/gcc/config/rs6000/rs6000-p8swap.cc
index 1973d9c8245..d301bc3fe59 100644
--- a/gcc/config/rs6000/rs6000-p8swap.cc
+++ b/gcc/config/rs6000/rs6000-p8swap.cc
@@ -805,6 +805,7 @@ rtx_is_swappable_p (rtx op, unsigned int *special)
case UNSPEC_VUPKLU_V4SF:
return 0;
case UNSPEC_VSPLT_DIRECT:
+ case UNSPEC_VSX_XXSPLTD:
*special = SH_SPLAT;
return 1;
case UNSPEC_REDUC_PLUS:
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 26226520335..1b75538f42f 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -296,6 +296,7 @@
UNSPEC_VSX_XXPERM
UNSPEC_VSX_XXSPLTW
+ UNSPEC_VSX_XXSPLTD
UNSPEC_VSX_DIVSD
UNSPEC_VSX_DIVUD
UNSPEC_VSX_DIVSQ
@@ -3088,25 +3089,6 @@
}
[(set_attr "type" "vecperm")])
-;; Combiner patterns to allow creating XXPERMDI's to access either double
-;; word element in a vector register when used with VEC_DUPLICATE..
-(define_insn "*vsx_dup_<mode>_1"
- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
- (vec_duplicate:VSX_D
- (vec_select:<VS_scalar>
- (match_operand:VSX_D 1 "gpc_reg_operand" "wa")
- (parallel [(match_operand:QI 2 "const_0_to_1_operand" "n")]))))]
- "VECTOR_MEM_VSX_P (<MODE>mode)"
-{
- HOST_WIDE_INT dword = INTVAL (operands[2]);
- if (!BYTES_BIG_ENDIAN)
- dword = !dword;
-
- operands[3] = GEN_INT (3*dword);
- return "xxpermdi %x0,%x1,%x1,%3";
-}
- [(set_attr "type" "vecperm")])
-
;; Special purpose concat using xxpermdi to glue two single precision values
;; together, relying on the fact that internally scalar floats are represented
;; as doubles. This is used to initialize a V4SF vector with 4 floats
@@ -4691,18 +4673,16 @@
;; V2DF/V2DI splat for use by vec_splat builtin
(define_insn "vsx_xxspltd_<mode>"
[(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
- (vec_duplicate:VSX_D
- (vec_select:<VS_scalar>
- (match_operand:VSX_D 1 "gpc_reg_operand" "wa")
- (parallel [(match_operand:QI 2 "const_0_to_1_operand" "i")]))))]
+ (unspec:VSX_D [(match_operand:VSX_D 1 "vsx_register_operand" "wa")
+ (match_operand:QI 2 "u5bit_cint_operand" "i")]
+ UNSPEC_VSX_XXSPLTD))]
"VECTOR_MEM_VSX_P (<MODE>mode)"
{
- HOST_WIDE_INT dword = INTVAL (operands[2]);
- if (!BYTES_BIG_ENDIAN)
- dword = !dword;
-
- operands[3] = GEN_INT (3*dword);
- return "xxpermdi %x0,%x1,%x1,%3";
+ if ((BYTES_BIG_ENDIAN && INTVAL (operands[2]) == 0)
+ || (!BYTES_BIG_ENDIAN && INTVAL (operands[2]) == 1))
+ return "xxpermdi %x0,%x1,%x1,0";
+ else
+ return "xxpermdi %x0,%x1,%x1,3";
}
[(set_attr "type" "vecperm")])
diff --git a/gcc/testsuite/gcc.target/powerpc/pr99293.c b/gcc/testsuite/gcc.target/powerpc/pr99293.c
deleted file mode 100644
index 03c22f8f4de..00000000000
--- a/gcc/testsuite/gcc.target/powerpc/pr99293.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* { dg-do compile } */
-/* { dg-require-effective-target powerpc_vsx_ok } */
-/* { dg-options "-O2 -mvsx" } */
-
-/* Test for PR 99263, which wants to do:
- __builtin_vec_splats (__builtin_vec_extract (v, n))
-
- where v is a V2DF or V2DI vector and n is either 0 or 1. Previously the
- compiler would do a direct move to the GPR registers to select the item and
- a direct move from the GPR registers to do the splat. */
-
-vector long long
-splat_dup_ll_0 (vector long long v)
-{
- return __builtin_vec_splats (__builtin_vec_extract (v, 0));
-}
-
-vector long long
-splat_dup_ll_1 (vector long long v)
-{
- return __builtin_vec_splats (__builtin_vec_extract (v, 1));
-}
-
-vector double
-splat_dup_d_0 (vector double v)
-{
- return __builtin_vec_splats (__builtin_vec_extract (v, 0));
-}
-
-vector double
-splat_dup_d_1 (vector double v)
-{
- return __builtin_vec_splats (__builtin_vec_extract (v, 1));
-}
-
-/* { dg-final { scan-assembler-times {\mxxpermdi\M} 4 } } */
More information about the Gcc-cvs
mailing list