public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/meissner/heads/work068)] Fixup XXSPLTIDP code generation.
@ 2021-09-15 20:17 Michael Meissner
0 siblings, 0 replies; only message in thread
From: Michael Meissner @ 2021-09-15 20:17 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:6bdfefa14685345188b31e3775018f750517d587
commit 6bdfefa14685345188b31e3775018f750517d587
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Wed Sep 15 16:17:19 2021 -0400
Fixup XXSPLTIDP code generation.
2021-09-15 Michael Meissner <meissner@linux.ibm.com>
gcc/
* config/rs6000/predicates.md (easy_fp_constant_sfmode): Fix
endian issue for integer values. Add comment about IEEE 32-bit
format.
* config/rs6000/rs6000.c (xxspltidp_constant_immediate): Fix
endian issue for integer values.
* config/rs6000/rs6000.md (movdi_internal64): Use ^wa instead of
$wa for XXSPLTIDP constants.
gcc/testsuite/
* gcc.target/powerpc/vec-splat-constant-di.c: New file.
* gcc.target/powerpc/vec-splat-constant-v2di.c: New file.
Diff:
---
gcc/config/rs6000/predicates.md | 7 ++-
gcc/config/rs6000/rs6000.c | 4 +-
gcc/config/rs6000/rs6000.md | 2 +-
.../gcc.target/powerpc/vec-splat-constant-di.c | 70 ++++++++++++++++++++++
.../gcc.target/powerpc/vec-splat-constant-v2di.c | 50 ++++++++++++++++
5 files changed, 128 insertions(+), 5 deletions(-)
diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 105629c0344..d3e04e595dd 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -684,8 +684,8 @@
df_words[0] = (df_value >> 32) & 0xffffffff;
df_words[1] = df_value & 0xffffffff;
- /* real_from_target takes the target words in little endian order. */
- if (BYTES_BIG_ENDIAN)
+ /* real_from_target takes the target words in target order. */
+ if (!BYTES_BIG_ENDIAN)
std::swap (df_words[0], df_words[1]);
real_from_target (&rv_type, df_words, DFmode);
@@ -709,6 +709,9 @@
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. */
if (((sf_value & 0x7F800000) == 0) && ((sf_value & 0x7FFFFF) != 0))
return false;
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index a325e753a14..b0a7f20ad83 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -6622,8 +6622,8 @@ xxspltidp_constant_immediate (rtx op, machine_mode mode)
df_words[0] = (df_value >> 32) & 0xffffffff;
df_words[1] = df_value & 0xffffffff;
- /* real_to_target takes input in little-endian fasion. */
- if (BYTES_BIG_ENDIAN)
+ /* real_to_target takes input in target endian order. */
+ if (!BYTES_BIG_ENDIAN)
std::swap (df_words[0], df_words[1]);
REAL_VALUE_TYPE r;
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index ac7ff217e00..bc7fd3a9d02 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -9333,7 +9333,7 @@
(define_insn "*movdi_internal64"
[(set (match_operand:DI 0 "nonimmediate_operand"
"=YZ, r, r,
- $wa,
+ ^wa,
r, r, r, r,
m, ^d, ^d,
wY, Z, $v, $v, ^wa,
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-di.c b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-di.c
new file mode 100644
index 00000000000..dd896e5385d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-di.c
@@ -0,0 +1,70 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target power10_ok } */
+/* { dg-options "-mdejagnu-cpu=power10 -O2" } */
+
+/* Test generating DImode constants that have the same bit pattern as DFmode
+ constants that can be loaded with the XXSPLTIDP instruction with the ISA 3.1
+ (power10). We use asm to force the value into vector registers. */
+
+double
+scalar_0 (void)
+{
+ /* XXSPLTIB or XXLXOR. */
+ double d;
+ long long ll = 0;
+
+ __asm__ ("xxmr %x0,%x1" : "=wa" (d) : "wa" (ll));
+ return d;
+}
+
+double
+scalar_1 (void)
+{
+ /* VSPLTISW/VUPKLSW or XXSPLTIB/VEXTSB2D. */
+ double d;
+ long long ll = 1;
+
+ __asm__ ("xxmr %x0,%x1" : "=wa" (d) : "wa" (ll));
+ return d;
+}
+
+/* 0x8000000000000000LL is the bit pattern for -0.0, which can be generated
+ with XXSPLTIDP. */
+double
+scalar_float_neg_0 (void)
+{
+ /* XXSPLTIDP. */
+ double d;
+ long long ll = 0x8000000000000000LL;
+
+ __asm__ ("xxmr %x0,%x1" : "=wa" (d) : "wa" (ll));
+ return d;
+}
+
+/* 0x3ff0000000000000LL is the bit pattern for 1.0 which can be generated with
+ XXSPLTIDP. */
+double
+scalar_float_1_0 (void)
+{
+ /* XXSPLTIDP. */
+ double d;
+ long long ll = 0x3ff0000000000000LL;
+
+ __asm__ ("xxmr %x0,%x1" : "=wa" (d) : "wa" (ll));
+ return d;
+}
+
+/* 0x400921fb54442d18LL is the bit pattern for PI, which cannot be generated
+ with XXSPLTIDP. */
+double
+scalar_pi (void)
+{
+ /* PLXV. */
+ double d;
+ long long ll = 0x400921fb54442d18LL;
+
+ __asm__ ("xxmr %x0,%x1" : "=wa" (d) : "wa" (ll));
+ return d;
+}
+
+/* { dg-final { scan-assembler-times {\mxxspltidp\M} 1 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2di.c b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2di.c
new file mode 100644
index 00000000000..4d44f943d26
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-splat-constant-v2di.c
@@ -0,0 +1,50 @@
+/* { 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] only message in thread
only message in thread, other threads:[~2021-09-15 20:17 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-15 20:17 [gcc(refs/users/meissner/heads/work068)] Fixup XXSPLTIDP code generation 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).