public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/meissner/heads/work072)] Revert patch.
@ 2021-11-03 18:13 Michael Meissner
0 siblings, 0 replies; 3+ messages in thread
From: Michael Meissner @ 2021-11-03 18:13 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:6d6c1688d86e4691ae8e9f6850c4648f82692c1b
commit 6d6c1688d86e4691ae8e9f6850c4648f82692c1b
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Wed Nov 3 14:12:28 2021 -0400
Revert patch.
2021-11-03 Michael Meissner <meissner@the-meissners.org>
gcc/
Revert patch.
* config/rs6000/predicates.md (easy_fp_constant): Add support for
generating XXSPLTIDP.
(vsx_prefixed_constant): Likewise.
(easy_vector_constant): Likewise.
* config/rs6000/rs6000-protos.h (constant_generates_xxspltidp):
New declaration.
* config/rs6000/rs6000.c (output_vec_const_move): Add support for
generating XXSPLTIDP.
(prefixed_xxsplti_p): Likewise.
(constant_generates_xxspltidp): New function.
* config/rs6000/rs6000.opt (-msplat-float-constant): New debug option.
gcc/testsuite/
Revert patch.
* gcc.target/powerpc/pr86731-fwrapv-longlong.c: Update insn
regex for power10.
* gcc.target/powerpc/vec-splat-constant-v2df.c: New test.
* gcc.target/powerpc/vec-splat-constant-v2di.c: New test.
Diff:
---
gcc/config/rs6000/predicates.md | 6 --
gcc/config/rs6000/rs6000-protos.h | 1 -
gcc/config/rs6000/rs6000.c | 108 ---------------------
gcc/config/rs6000/rs6000.opt | 4 -
.../gcc.target/powerpc/vec-splat-constant-v2df.c | 64 ------------
.../gcc.target/powerpc/vec-splat-constant-v2di.c | 50 ----------
6 files changed, 233 deletions(-)
diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 562e4657858..ed6252bd0c4 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -610,9 +610,6 @@
if (constant_generates_xxspltiw (&vsx_const))
return true;
-
- if (constant_generates_xxspltidp (&vsx_const))
- return true;
}
/* Otherwise consider floating point constants hard, so that the
@@ -730,9 +727,6 @@
if (constant_generates_xxspltiw (&vsx_const))
return true;
-
- if (constant_generates_xxspltidp (&vsx_const))
- return true;
}
if (TARGET_P9_VECTOR
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 2d28df7442d..99c6a671289 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -253,7 +253,6 @@ extern bool vec_const_128bit_to_bytes (rtx, machine_mode,
vec_const_128bit_type *);
extern unsigned constant_generates_lxvkq (vec_const_128bit_type *);
extern unsigned constant_generates_xxspltiw (vec_const_128bit_type *);
-extern unsigned constant_generates_xxspltidp (vec_const_128bit_type *);
#endif /* RTX_CODE */
#ifdef TREE_CODE
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 8fde48cf2b3..be24f56eb31 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -7012,13 +7012,6 @@ output_vec_const_move (rtx *operands)
operands[2] = GEN_INT (imm);
return "xxspltiw %x0,%2";
}
-
- imm = constant_generates_xxspltidp (&vsx_const);
- if (imm)
- {
- operands[2] = GEN_INT (imm);
- return "xxspltidp %x0,%2";
- }
}
if (TARGET_P9_VECTOR
@@ -26816,9 +26809,6 @@ prefixed_xxsplti_p (rtx_insn *insn)
{
if (constant_generates_xxspltiw (&vsx_const))
return true;
-
- if (constant_generates_xxspltidp (&vsx_const))
- return true;
}
return false;
@@ -29024,104 +29014,6 @@ constant_generates_xxspltiw (vec_const_128bit_type *vsx_const)
return vsx_const->words[0];
}
-/* Determine if a vector constant can be loaded with XXSPLTIDP. Return zero if
- the XXSPLTIDP instruction cannot be used. Otherwise return the immediate
- value to be used with the XXSPLTIDP instruction. */
-
-unsigned
-constant_generates_xxspltidp (vec_const_128bit_type *vsx_const)
-{
- if (!TARGET_SPLAT_FLOAT_CONSTANT || !TARGET_PREFIXED || !TARGET_VSX)
- return 0;
-
- /* Make sure that the two 64-bit segments are the same. */
- if (!vsx_const->all_double_words_same)
- return 0;
-
- /* If the bytes, half words, or words are all the same, don't use XXSPLTIDP.
- Use a simpler instruction (XXSPLTIB, VSPLTISB, VSPLTISH, or VSPLTISW). */
- if (vsx_const->all_bytes_same
- || vsx_const->all_half_words_same
- || vsx_const->all_words_same)
- return 0;
-
- unsigned HOST_WIDE_INT value = vsx_const->double_words[0];
-
- /* Avoid values that look like DFmode NaN's, except for the normal NaN bit
- pattern and the signalling NaN bit pattern. Recognize infinity and
- negative infinity. */
-
- /* Bit representation of DFmode normal quiet NaN. */
-#define RS6000_CONST_DF_NAN HOST_WIDE_INT_UC (0x7ff8000000000000)
-
- /* Bit representation of DFmode normal signaling NaN. */
-#define RS6000_CONST_DF_NANS HOST_WIDE_INT_UC (0x7ff4000000000000)
-
- /* Bit representation of DFmode positive infinity. */
-#define RS6000_CONST_DF_INF HOST_WIDE_INT_UC (0x7ff0000000000000)
-
- /* Bit representation of DFmode negative infinity. */
-#define RS6000_CONST_DF_NEG_INF HOST_WIDE_INT_UC (0xfff0000000000000)
-
- if (value != RS6000_CONST_DF_NAN
- && value != RS6000_CONST_DF_NANS
- && value != RS6000_CONST_DF_INF
- && value != RS6000_CONST_DF_NEG_INF)
- {
- /* The IEEE 754 64-bit floating format has 1 bit for sign, 11 bits for
- the exponent, and 52 bits for the mantissa (not counting the hidden
- bit used for normal numbers). NaN values have the exponent set to all
- 1 bits, and the mantissa non-zero (mantissa == 0 is infinity). */
-
- int df_exponent = (value >> 52) & 0x7ff;
- unsigned HOST_WIDE_INT df_mantissa
- = value & ((HOST_WIDE_INT_1U << 52) - HOST_WIDE_INT_1U);
-
- if (df_exponent == 0x7ff && df_mantissa != 0) /* other NaNs. */
- return 0;
-
- /* Avoid values that are DFmode subnormal values. Subnormal numbers have
- the exponent all 0 bits, and the mantissa non-zero. If the value is
- subnormal, then the hidden bit in the mantissa is not set. */
- if (df_exponent == 0 && df_mantissa != 0) /* subnormal. */
- return 0;
- }
-
- /* Change the representation to DFmode constant. */
- long df_words[2] = { vsx_const->words[0], vsx_const->words[1] };
-
- /* real_from_target takes the target words in target order. */
- if (!BYTES_BIG_ENDIAN)
- std::swap (df_words[0], df_words[1]);
-
- REAL_VALUE_TYPE rv_type;
- real_from_target (&rv_type, df_words, DFmode);
-
- const REAL_VALUE_TYPE *rv = &rv_type;
-
- /* Validate that the number can be stored as a SFmode value. */
- if (!exact_real_truncate (SFmode, rv))
- return 0;
-
- /* Validate that the number is not a SFmode subnormal value (exponent is 0,
- mantissa field is non-zero) which is undefined for the XXSPLTIDP
- instruction. */
- long sf_value;
- real_to_target (&sf_value, rv, SFmode);
-
- /* IEEE 754 32-bit values have 1 bit for the sign, 8 bits for the exponent,
- and 23 bits for the mantissa. Subnormal numbers have the exponent all
- 0 bits, and the mantissa non-zero. */
- long sf_exponent = (sf_value >> 23) & 0xFF;
- long sf_mantissa = sf_value & 0x7FFFFF;
-
- if (sf_exponent == 0 && sf_mantissa != 0)
- return 0;
-
- /* Return the immediate to be used. */
- return sf_value;
-}
-
\f
struct gcc_target targetm = TARGET_INITIALIZER;
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index c1d661d7e6b..ec7b106fddb 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -644,10 +644,6 @@ msplat-word-constant
Target Var(TARGET_SPLAT_WORD_CONSTANT) Init(1) Save
Generate (do not generate) code that uses the XXSPLTIW instruction.
-msplat-float-constant
-Target Var(TARGET_SPLAT_FLOAT_CONSTANT) Init(1) Save
-Generate (do not generate) code that uses the XXSPLTIDP instruction.
-
mieee128-constant
Target Var(TARGET_IEEE128_CONSTANT) Init(1) Save
Generate (do not generate) code that uses the LXVKQ instruction.
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2df.c b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2df.c
deleted file mode 100644
index 82ffc86f8aa..00000000000
--- a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2df.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* { dg-do compile } */
-/* { dg-require-effective-target power10_ok } */
-/* { dg-options "-mdejagnu-cpu=power10 -O2" } */
-
-#include <math.h>
-
-/* Test generating V2DFmode constants with the ISA 3.1 (power10) XXSPLTIDP
- instruction. */
-
-vector double
-v2df_double_0 (void)
-{
- return (vector double) { 0.0, 0.0 }; /* XXSPLTIB or XXLXOR. */
-}
-
-vector double
-v2df_double_1 (void)
-{
- return (vector double) { 1.0, 1.0 }; /* XXSPLTIDP. */
-}
-
-#ifndef __FAST_MATH__
-vector double
-v2df_double_m0 (void)
-{
- return (vector double) { -0.0, -0.0 }; /* XXSPLTIDP. */
-}
-
-vector double
-v2df_double_nan (void)
-{
- return (vector double) { __builtin_nan (""),
- __builtin_nan ("") }; /* XXSPLTIDP. */
-}
-
-vector double
-v2df_double_inf (void)
-{
- return (vector double) { __builtin_inf (),
- __builtin_inf () }; /* XXSPLTIDP. */
-}
-
-vector double
-v2df_double_m_inf (void)
-{
- return (vector double) { - __builtin_inf (),
- - __builtin_inf () }; /* XXSPLTIDP. */
-}
-#endif
-
-vector double
-v2df_double_pi (void)
-{
- return (vector double) { M_PI, M_PI }; /* PLVX. */
-}
-
-vector double
-v2df_double_denorm (void)
-{
- return (vector double) { (double)0x1p-149f,
- (double)0x1p-149f }; /* PLVX. */
-}
-
-/* { dg-final { scan-assembler-times {\mxxspltidp\M} 5 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2di.c b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2di.c
deleted file mode 100644
index 4d44f943d26..00000000000
--- a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2di.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* { dg-do compile } */
-/* { dg-require-effective-target power10_ok } */
-/* { dg-options "-mdejagnu-cpu=power10 -O2" } */
-
-/* Test generating V2DImode constants that have the same bit pattern as
- V2DFmode constants that can be loaded with the XXSPLTIDP instruction with
- the ISA 3.1 (power10). */
-
-vector long long
-vector_0 (void)
-{
- /* XXSPLTIB or XXLXOR. */
- return (vector long long) { 0LL, 0LL };
-}
-
-vector long long
-vector_1 (void)
-{
- /* XXSPLTIB and VEXTSB2D. */
- return (vector long long) { 1LL, 1LL };
-}
-
-/* 0x8000000000000000LL is the bit pattern for -0.0, which can be generated
- with XXSPLTISDP. */
-vector long long
-vector_float_neg_0 (void)
-{
- /* XXSPLTIDP. */
- return (vector long long) { 0x8000000000000000LL, 0x8000000000000000LL };
-}
-
-/* 0x3ff0000000000000LL is the bit pattern for 1.0 which can be generated with
- XXSPLTISDP. */
-vector long long
-vector_float_1_0 (void)
-{
- /* XXSPLTIDP. */
- return (vector long long) { 0x3ff0000000000000LL, 0x3ff0000000000000LL };
-}
-
-/* 0x400921fb54442d18LL is the bit pattern for PI, which cannot be generated
- with XXSPLTIDP. */
-vector long long
-scalar_pi (void)
-{
- /* PLXV. */
- return (vector long long) { 0x400921fb54442d18LL, 0x400921fb54442d18LL };
-}
-
-/* { dg-final { scan-assembler-times {\mxxspltidp\M} 2 } } */
^ permalink raw reply [flat|nested] 3+ messages in thread
* [gcc(refs/users/meissner/heads/work072)] Revert patch.
@ 2021-11-03 2:56 Michael Meissner
0 siblings, 0 replies; 3+ messages in thread
From: Michael Meissner @ 2021-11-03 2:56 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:a2de180d446eb80aee5675869fffbc499cc05bc9
commit a2de180d446eb80aee5675869fffbc499cc05bc9
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Tue Nov 2 22:56:02 2021 -0400
Revert patch.
2021-11-02 Michael Meissner <meissner@the-meissners.org>
gcc/
Revert patch.
* config/rs6000/rs6000-protos.h (VECTOR_128BIT_*): New macros.
(vec_const_128bit_type): New structure type.
(vec_const_128bit_to_bytes): New declaration.
* config/rs6000/rs6000.c (constant_int_to_128bit_vector): New
helper function.
(constant_fp_to_128bit_vector): New helper function.
(vec_const_128bit_to_bytes): New function.
Diff:
---
gcc/config/rs6000/rs6000-protos.h | 28 -----
gcc/config/rs6000/rs6000.c | 254 --------------------------------------
2 files changed, 282 deletions(-)
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 87003f14b44..14f6b313105 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -222,34 +222,6 @@ address_is_prefixed (rtx addr,
return (iform == INSN_FORM_PREFIXED_NUMERIC
|| iform == INSN_FORM_PCREL_LOCAL);
}
-
-/* Functions and data structures relating to 128-bit constants that are
- converted to byte, half-word, word, and double-word values. All fields are
- kept in big endian order. We also convert scalar values to 128-bits if they
- are going to be loaded into vector registers. */
-#define VECTOR_128BIT_BITS 128
-#define VECTOR_128BIT_BYTES (128 / 8)
-#define VECTOR_128BIT_HALF_WORDS (128 / 16)
-#define VECTOR_128BIT_WORDS (128 / 32)
-#define VECTOR_128BIT_DOUBLE_WORDS (128 / 64)
-
-typedef struct {
- /* Constant as various sized items. */
- unsigned HOST_WIDE_INT double_words[VECTOR_128BIT_DOUBLE_WORDS];
- unsigned int words[VECTOR_128BIT_WORDS];
- unsigned short half_words[VECTOR_128BIT_HALF_WORDS];
- unsigned char bytes[VECTOR_128BIT_BYTES];
-
- unsigned original_size; /* Constant size before splat. */
- bool fp_constant_p; /* Is the constant floating point? */
- bool all_double_words_same; /* Are the double words all equal? */
- bool all_words_same; /* Are the words all equal? */
- bool all_half_words_same; /* Are the halft words all equal? */
- bool all_bytes_same; /* Are the bytes all equal? */
-} vec_const_128bit_type;
-
-extern bool vec_const_128bit_to_bytes (rtx, machine_mode,
- vec_const_128bit_type *);
#endif /* RTX_CODE */
#ifdef TREE_CODE
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 0288253d7e9..01affc7a47c 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -28619,260 +28619,6 @@ rs6000_output_addr_vec_elt (FILE *file, int value)
fprintf (file, "\n");
}
-\f
-/* Copy an integer constant to the vector constant structure. */
-
-static void
-constant_int_to_128bit_vector (rtx op,
- machine_mode mode,
- size_t byte_num,
- vec_const_128bit_type *info)
-{
- unsigned HOST_WIDE_INT uvalue = UINTVAL (op);
- unsigned bitsize = GET_MODE_BITSIZE (mode);
-
- for (int shift = bitsize - 8; shift >= 0; shift -= 8)
- info->bytes[byte_num++] = (uvalue >> shift) & 0xff;
-}
-
-/* Copy an floating point constant to the vector constant structure. */
-
-static void
-constant_fp_to_128bit_vector (rtx op,
- machine_mode mode,
- size_t byte_num,
- vec_const_128bit_type *info)
-{
- unsigned bitsize = GET_MODE_BITSIZE (mode);
- unsigned num_words = bitsize / 32;
- const REAL_VALUE_TYPE *rtype = CONST_DOUBLE_REAL_VALUE (op);
- long real_words[VECTOR_128BIT_WORDS];
-
- /* Make sure we don't overflow the real_words array and that it is
- filled completely. */
- gcc_assert (num_words <= VECTOR_128BIT_WORDS && (bitsize % 32) == 0);
-
- real_to_target (real_words, rtype, mode);
-
- /* Iterate over each 32-bit word in the floating point constant. The
- real_to_target function puts out words in endian fashion. We need
- to arrange so the words are written in big endian order. */
- for (unsigned num = 0; num < num_words; num++)
- {
- unsigned endian_num = (BYTES_BIG_ENDIAN
- ? num
- : num_words - 1 - num);
-
- unsigned uvalue = real_words[endian_num];
- for (int shift = 32 - 8; shift >= 0; shift -= 8)
- info->bytes[byte_num++] = (uvalue >> shift) & 0xff;
- }
-
- /* Mark that this constant involves floating point. */
- info->fp_constant_p = true;
-}
-
-/* Convert a vector constant OP with mode MODE to a vector 128-bit constant
- structure INFO.
-
- Break out the constant out to bytes, half words, words, and double words.
- Return true if we have successfully broken out a constant.
-
- We handle CONST_INT, CONST_DOUBLE, CONST_VECTOR, and VEC_DUPLICATE of
- constants. Integer and floating point scalar constants are splatted to fill
- out the vector. */
-
-bool
-vec_const_128bit_to_bytes (rtx op,
- machine_mode mode,
- vec_const_128bit_type *info)
-{
- /* Initialize the constant structure. */
- memset ((void *)info, 0, sizeof (vec_const_128bit_type));
-
- /* Assume CONST_INTs are DImode. */
- if (mode == VOIDmode)
- mode = CONST_INT_P (op) ? DImode : GET_MODE (op);
-
- if (mode == VOIDmode)
- return false;
-
- unsigned size = GET_MODE_SIZE (mode);
- bool splat_p = false;
-
- if (size > VECTOR_128BIT_BYTES)
- return false;
-
- /* Set up the bits. */
- switch (GET_CODE (op))
- {
- /* Integer constants, default to double word. */
- case CONST_INT:
- {
- constant_int_to_128bit_vector (op, mode, 0, info);
- splat_p = true;
- break;
- }
-
- /* Floating point constants. */
- case CONST_DOUBLE:
- {
- /* Fail if the floating point constant is the wrong mode. */
- if (GET_MODE (op) != mode)
- return false;
-
- /* SFmode stored as scalars are stored in DFmode format. */
- if (mode == SFmode)
- {
- mode = DFmode;
- size = GET_MODE_SIZE (DFmode);
- }
-
- constant_fp_to_128bit_vector (op, mode, 0, info);
- splat_p = true;
- break;
- }
-
- /* Vector constants, iterate over each element. On little endian
- systems, we have to reverse the element numbers. */
- case CONST_VECTOR:
- {
- /* Fail if the vector constant is the wrong mode or size. */
- if (GET_MODE (op) != mode
- || GET_MODE_SIZE (mode) != VECTOR_128BIT_BYTES)
- return false;
-
- machine_mode ele_mode = GET_MODE_INNER (mode);
- size_t ele_size = GET_MODE_SIZE (ele_mode);
- size_t nunits = GET_MODE_NUNITS (mode);
-
- for (size_t num = 0; num < nunits; num++)
- {
- rtx ele = CONST_VECTOR_ELT (op, num);
- size_t byte_num = (BYTES_BIG_ENDIAN
- ? num
- : nunits - 1 - num) * ele_size;
-
- if (CONST_INT_P (ele))
- constant_int_to_128bit_vector (ele, ele_mode, byte_num, info);
- else if (CONST_DOUBLE_P (ele))
- constant_fp_to_128bit_vector (ele, ele_mode, byte_num, info);
- else
- return false;
- }
-
- break;
- }
-
- /* Treat VEC_DUPLICATE of a constant just like a vector constant.
- Since we are duplicating the element, we don't have to worry about
- endian issues. */
- case VEC_DUPLICATE:
- {
- /* Fail if the vector duplicate is the wrong mode or size. */
- if (GET_MODE (op) != mode
- || GET_MODE_SIZE (mode) != VECTOR_128BIT_BYTES)
- return false;
-
- machine_mode ele_mode = GET_MODE_INNER (mode);
- size_t ele_size = GET_MODE_SIZE (ele_mode);
- rtx ele = XEXP (op, 0);
- size_t nunits = GET_MODE_NUNITS (mode);
-
- if (!CONST_INT_P (ele) && !CONST_DOUBLE_P (ele))
- return false;
-
- for (size_t num = 0; num < nunits; num++)
- {
- size_t byte_num = num * ele_size;
-
- if (CONST_INT_P (ele))
- constant_int_to_128bit_vector (ele, ele_mode, byte_num, info);
- else
- constant_fp_to_128bit_vector (ele, ele_mode, byte_num, info);
- }
-
- break;
- }
-
- /* Any thing else, just return failure. */
- default:
- return false;
- }
-
- /* Possibly splat the constant to fill a vector size. */
- if (splat_p && size < VECTOR_128BIT_BYTES)
- {
- if ((VECTOR_128BIT_BYTES % size) != 0)
- return false;
-
- for (size_t offset = size;
- offset < VECTOR_128BIT_BYTES;
- offset += size)
- memcpy ((void *) &info->bytes[offset],
- (void *) &info->bytes[0],
- size);
- }
-
- /* Remember original size. */
- info->original_size = size;
-
- /* Determine if the bytes are all the same. */
- unsigned char first_byte = info->bytes[0];
- info->all_bytes_same = true;
- for (size_t i = 1; i < VECTOR_128BIT_BYTES; i++)
- if (first_byte != info->bytes[i])
- {
- info->all_bytes_same = false;
- break;
- }
-
- /* Pack half words together & determine if all of the half words are the
- same. */
- for (size_t i = 0; i < VECTOR_128BIT_HALF_WORDS; i++)
- info->half_words[i] = ((info->bytes[i * 2] << 8)
- | info->bytes[(i * 2) + 1]);
-
- unsigned short first_hword = info->half_words[0];
- info->all_half_words_same = true;
- for (size_t i = 1; i < VECTOR_128BIT_HALF_WORDS; i++)
- if (first_hword != info->half_words[i])
- {
- info->all_half_words_same = false;
- break;
- }
-
- /* Pack words together & determine if all of the words are the same. */
- for (size_t i = 0; i < VECTOR_128BIT_WORDS; i++)
- info->words[i] = ((info->bytes[i * 4] << 24)
- | (info->bytes[(i * 4) + 1] << 16)
- | (info->bytes[(i * 4) + 2] << 8)
- | info->bytes[(i * 4) + 3]);
-
- info->all_words_same
- = (info->words[0] == info->words[1]
- && info->words[0] == info->words[1]
- && info->words[0] == info->words[2]
- && info->words[0] == info->words[3]);
-
- /* Pack double words together & determine if all of the double words are the
- same. */
- for (size_t i = 0; i < VECTOR_128BIT_DOUBLE_WORDS; i++)
- {
- unsigned HOST_WIDE_INT d_word = 0;
- for (size_t j = 0; j < 8; j++)
- d_word = (d_word << 8) | info->bytes[(i * 8) + j];
-
- info->double_words[i] = d_word;
- }
-
- info->all_double_words_same
- = (info->double_words[0] == info->double_words[1]);
-
- return true;
-}
-
-\f
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-rs6000.h"
^ permalink raw reply [flat|nested] 3+ messages in thread
* [gcc(refs/users/meissner/heads/work072)] Revert patch.
@ 2021-11-03 2:06 Michael Meissner
0 siblings, 0 replies; 3+ messages in thread
From: Michael Meissner @ 2021-11-03 2:06 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:d1fab4c9c5f677f11c5ee2ff94ea28b17a20ab25
commit d1fab4c9c5f677f11c5ee2ff94ea28b17a20ab25
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Tue Nov 2 22:05:33 2021 -0400
Revert patch.
2021-11-02 Michael Meissner <meissner@the-meissners.org>
gcc/
Revert patch.
* config/rs6000/rs6000-protos.h (VECTOR_128BIT_*): New macros.
(constant_splat_type): New enum type.
(vector_128bit_constant_type): New structure type.
(constant_to_128bit_vector): New declaration.
* config/rs6000/rs6000.c (constant_int_to_128bit_vector): New
helper function.
(constant_to_128bit_vector): New helper function.
(constant_to_128bit_vector): New function.
Diff:
---
gcc/config/rs6000/rs6000-protos.h | 36 ------
gcc/config/rs6000/rs6000.c | 254 --------------------------------------
2 files changed, 290 deletions(-)
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index ec162c1fb6c..14f6b313105 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -222,42 +222,6 @@ address_is_prefixed (rtx addr,
return (iform == INSN_FORM_PREFIXED_NUMERIC
|| iform == INSN_FORM_PCREL_LOCAL);
}
-
-/* Functions and data structures relating to 128-bit constants that are
- converted to byte, half-word, word, and double-word values. All fields are
- kept in big endian order. We also convert scalar values to 128-bits if they
- are going to be loaded into vector registers. */
-#define VECTOR_128BIT_BITS 128
-#define VECTOR_128BIT_BYTES (128 / 8)
-#define VECTOR_128BIT_HALF_WORDS (128 / 16)
-#define VECTOR_128BIT_WORDS (128 / 32)
-#define VECTOR_128BIT_DOUBLE_WORDS (128 / 64)
-
-/* If the constant is small, whether we will splat the constant to fill a
- vector. */
-typedef enum {
- CONSTANT_NO_SPLAT, /* Do not splat the constant. */
- CONSTANT_SPLAT /* Splat to fill the constant. */
-} constant_splat_type;
-
-typedef struct {
- /* Constant as various sized items. */
- unsigned HOST_WIDE_INT double_words[VECTOR_128BIT_DOUBLE_WORDS];
- unsigned int words[VECTOR_128BIT_WORDS];
- unsigned short half_words[VECTOR_128BIT_HALF_WORDS];
- unsigned char bytes[VECTOR_128BIT_BYTES];
-
- unsigned original_size; /* Constant size before splat. */
- bool fp_constant_p; /* Is the constant floating point? */
- bool all_double_words_same; /* Are the double words all equal? */
- bool all_words_same; /* Are the words all equal? */
- bool all_half_words_same; /* Are the halft words all equal? */
- bool all_bytes_same; /* Are the bytes all equal? */
-} vector_128bit_constant_type;
-
-extern bool constant_to_128bit_vector (rtx, machine_mode,
- vector_128bit_constant_type *,
- constant_splat_type);
#endif /* RTX_CODE */
#ifdef TREE_CODE
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 32b0389fb28..01affc7a47c 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -28619,260 +28619,6 @@ rs6000_output_addr_vec_elt (FILE *file, int value)
fprintf (file, "\n");
}
-\f
-/* Copy an integer constant to the vector constant structure. */
-
-static void
-constant_int_to_128bit_vector (rtx op,
- machine_mode mode,
- size_t byte_num,
- vector_128bit_constant_type *info)
-{
- unsigned HOST_WIDE_INT uvalue = UINTVAL (op);
- unsigned bitsize = GET_MODE_BITSIZE (mode);
-
- for (int shift = bitsize - 8; shift >= 0; shift -= 8)
- info->bytes[byte_num++] = (uvalue >> shift) & 0xff;
-}
-
-/* Copy an floating point constant to the vector constant structure. */
-
-static void
-constant_fp_to_128bit_vector (rtx op,
- machine_mode mode,
- size_t byte_num,
- vector_128bit_constant_type *info)
-{
- unsigned bitsize = GET_MODE_BITSIZE (mode);
- unsigned num_words = bitsize / 32;
- const REAL_VALUE_TYPE *rtype = CONST_DOUBLE_REAL_VALUE (op);
- long real_words[VECTOR_128BIT_WORDS];
-
- /* Make sure we don't overflow the real_words array and that it is
- filled completely. */
- gcc_assert (num_words <= VECTOR_128BIT_WORDS && (bitsize % 32) == 0);
-
- real_to_target (real_words, rtype, mode);
-
- /* Iterate over each 32-bit word in the floating point constant. The
- real_to_target function puts out words in endian fashion. We need
- to arrange so the words are written in big endian order. */
- for (unsigned num = 0; num < num_words; num++)
- {
- unsigned endian_num = (BYTES_BIG_ENDIAN
- ? num
- : num_words - 1 - num);
-
- unsigned uvalue = real_words[endian_num];
- for (int shift = 32 - 8; shift >= 0; shift -= 8)
- info->bytes[byte_num++] = (uvalue >> shift) & 0xff;
- }
-
- /* Mark that this constant involes floating point. */
- info->fp_constant_p = true;
-}
-
-/* Convert an RTL constant OP with mode MODE to a vector 128-bit constant
- structure INFO. Possibly splat the constant to a larger size (SPLAT).
-
- Break out the constant out to bytes, half words, words, and double words.
- Return true if we have successfully broken out a constant.
-
- We handle CONST_INT, CONST_DOUBLE, CONST_VECTOR, and VEC_DUPLICATE of
- constants. */
-
-bool
-constant_to_128bit_vector (rtx op,
- machine_mode mode,
- vector_128bit_constant_type *info,
- constant_splat_type splat)
-{
- /* Initialize the constant structure. */
- memset ((void *)info, 0, sizeof (vector_128bit_constant_type));
-
- /* Assume plain integer constants are DImode. */
- if (mode == VOIDmode)
- mode = CONST_INT_P (op) ? DImode : GET_MODE (op);
-
- if (mode == VOIDmode)
- return false;
-
- unsigned size = GET_MODE_SIZE (mode);
-
- if (size > VECTOR_128BIT_BYTES)
- return false;
-
- /* Set up the bits. */
- switch (GET_CODE (op))
- {
- /* Integer constants, default to double word. */
- case CONST_INT:
- {
- constant_int_to_128bit_vector (op, mode, 0, info);
- break;
- }
-
- /* Floating point constants. */
- case CONST_DOUBLE:
- {
- /* Fail if the floating point constant is the wrong mode. */
- if (GET_MODE (op) != mode)
- return false;
-
- /* SFmode stored as scalars are stored in DFmode format. */
- if (mode == SFmode)
- {
- mode = DFmode;
- size = GET_MODE_SIZE (DFmode);
- }
-
- constant_fp_to_128bit_vector (op, mode, 0, info);
- break;
- }
-
- /* Vector constants, iterate over each element. On little endian
- systems, we have to reverse the element numbers. */
- case CONST_VECTOR:
- {
- /* Fail if the vector constant is the wrong mode or size. */
- if (GET_MODE (op) != mode
- || GET_MODE_SIZE (mode) != VECTOR_128BIT_BYTES)
- return false;
-
- machine_mode ele_mode = GET_MODE_INNER (mode);
- size_t ele_size = GET_MODE_SIZE (ele_mode);
- size_t nunits = GET_MODE_NUNITS (mode);
-
- for (size_t num = 0; num < nunits; num++)
- {
- rtx ele = CONST_VECTOR_ELT (op, num);
- size_t byte_num = (BYTES_BIG_ENDIAN
- ? num
- : nunits - 1 - num) * ele_size;
-
- if (CONST_INT_P (ele))
- constant_int_to_128bit_vector (ele, ele_mode, byte_num, info);
- else if (CONST_DOUBLE_P (ele))
- constant_fp_to_128bit_vector (ele, ele_mode, byte_num, info);
- else
- return false;
- }
-
- break;
- }
-
- /* Treat VEC_DUPLICATE of a constant just like a vector constant.
- Since we are duplicating the element, we don't have to worry about
- endian issues. */
- case VEC_DUPLICATE:
- {
- /* Fail if the vector duplicate is the wrong mode or size. */
- if (GET_MODE (op) != mode
- || GET_MODE_SIZE (mode) != VECTOR_128BIT_BYTES)
- return false;
-
- machine_mode ele_mode = GET_MODE_INNER (mode);
- size_t ele_size = GET_MODE_SIZE (ele_mode);
- rtx ele = XEXP (op, 0);
- size_t nunits = GET_MODE_NUNITS (mode);
-
- if (!CONST_INT_P (ele) && !CONST_DOUBLE_P (ele))
- return false;
-
- for (size_t num = 0; num < nunits; num++)
- {
- size_t byte_num = num * ele_size;
-
- if (CONST_INT_P (ele))
- constant_int_to_128bit_vector (ele, ele_mode, byte_num, info);
- else
- constant_fp_to_128bit_vector (ele, ele_mode, byte_num, info);
- }
-
- break;
- }
-
- /* Any thing else, just return failure. */
- default:
- return false;
- }
-
- /* Possibly splat the constant to fill a vector size. */
- if (splat == CONSTANT_SPLAT)
- {
- if ((VECTOR_128BIT_BYTES % size) != 0)
- return false;
-
- for (size_t offset = size;
- offset < VECTOR_128BIT_BYTES;
- offset += size)
- memcpy ((void *) &info->bytes[offset],
- (void *) &info->bytes[0],
- size);
- }
-
- else if (splat != CONSTANT_NO_SPLAT)
- return false;
-
- /* Remember original size. */
- info->original_size = size;
-
- /* Determine if the bytes are all the same. */
- unsigned char first_byte = info->bytes[0];
- info->all_bytes_same = true;
- for (size_t i = 1; i < VECTOR_128BIT_BYTES; i++)
- if (first_byte != info->bytes[i])
- {
- info->all_bytes_same = false;
- break;
- }
-
- /* Pack half words together & determine if all of the half words are the
- same. */
- for (size_t i = 0; i < VECTOR_128BIT_HALF_WORDS; i++)
- info->half_words[i] = ((info->bytes[i * 2] << 8)
- | info->bytes[(i * 2) + 1]);
-
- unsigned short first_hword = info->half_words[0];
- info->all_half_words_same = true;
- for (size_t i = 1; i < VECTOR_128BIT_HALF_WORDS; i++)
- if (first_hword != info->half_words[i])
- {
- info->all_half_words_same = false;
- break;
- }
-
- /* Pack words together & determine if all of the words are the same. */
- for (size_t i = 0; i < VECTOR_128BIT_WORDS; i++)
- info->words[i] = ((info->bytes[i * 4] << 24)
- | (info->bytes[(i * 4) + 1] << 16)
- | (info->bytes[(i * 4) + 2] << 8)
- | info->bytes[(i * 4) + 3]);
-
- info->all_words_same
- = (info->words[0] == info->words[1]
- && info->words[0] == info->words[1]
- && info->words[0] == info->words[2]
- && info->words[0] == info->words[3]);
-
- /* Pack double words together & determine if all of the double words are the
- same. */
- for (size_t i = 0; i < VECTOR_128BIT_DOUBLE_WORDS; i++)
- {
- unsigned HOST_WIDE_INT d_word = 0;
- for (size_t j = 0; j < 8; j++)
- d_word = (d_word << 8) | info->bytes[(i * 8) + j];
-
- info->double_words[i] = d_word;
- }
-
- info->all_double_words_same
- = (info->double_words[0] == info->double_words[1]);
-
- return true;
-}
-
-\f
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-rs6000.h"
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-11-03 18:13 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-03 18:13 [gcc(refs/users/meissner/heads/work072)] Revert patch Michael Meissner
-- strict thread matches above, loose matches on Subject: below --
2021-11-03 2:56 Michael Meissner
2021-11-03 2:06 Michael Meissner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).