aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPeter Bergner <bergner@linux.ibm.com>2018-12-17 22:07:11 +0000
committerPeter Bergner <bergner@gcc.gnu.org>2018-12-17 16:07:11 -0600
commit00fd062886928ee3617a171f31c1e4e07f65f38f (patch)
treef90406664298f3ae328a989d45ccbf0ad6ab540d /gcc
parent1e9d69235a88347d293dec7927e34dd38f6ee580 (diff)
downloadgcc-00fd062886928ee3617a171f31c1e4e07f65f38f.zip
gcc-00fd062886928ee3617a171f31c1e4e07f65f38f.tar.gz
gcc-00fd062886928ee3617a171f31c1e4e07f65f38f.tar.bz2
re PR target/87870 (ppc64le generates poor code when loading constants into TImode vars)
gcc/ PR target/87870 * config/rs6000/vsx.md (nW): New mode iterator. (vsx_mov<mode>_64bit): Use it. Remove redundant GPR 0/-1 alternative. Update length attribute for (<??r>, <nW>) alternative. (vsx_mov<mode>_32bit): Likewise. gcc/testsuite/ PR target/87870 * gcc.target/powerpc/pr87870.c: New test. From-SVN: r267221
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rs6000/vsx.md32
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr87870.c28
4 files changed, 63 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0f8708f..625429c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2018-12-17 Peter Bergner <bergner@linux.ibm.com>
+
+ PR target/87870
+ * config/rs6000/vsx.md (nW): New mode iterator.
+ (vsx_mov<mode>_64bit): Use it. Remove redundant GPR 0/-1 alternative.
+ Update length attribute for (<??r>, <nW>) alternative.
+ (vsx_mov<mode>_32bit): Likewise.
+
2018-12-17 Tom de Vries <tdevries@suse.de>
* config/nvptx/nvptx.c (PTX_VECTOR_LENGTH, PTX_WORKER_LENGTH,
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 52dee7d..65a9892 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -183,6 +183,18 @@
(TF "??r")
(TI "r")])
+;; A mode attribute used for 128-bit constant values.
+(define_mode_attr nW [(V16QI "W")
+ (V8HI "W")
+ (V4SI "W")
+ (V4SF "W")
+ (V2DI "W")
+ (V2DF "W")
+ (V1TI "W")
+ (KF "W")
+ (TF "W")
+ (TI "n")])
+
;; Same size integer type for floating point data
(define_mode_attr VSi [(V4SF "v4si")
(V2DF "v2di")
@@ -1193,17 +1205,17 @@
;; VSX store VSX load VSX move VSX->GPR GPR->VSX LQ (GPR)
;; STQ (GPR) GPR load GPR store GPR move XXSPLTIB VSPLTISW
-;; VSX 0/-1 GPR 0/-1 VMX const GPR const LVX (VMX) STVX (VMX)
+;; VSX 0/-1 VMX const GPR const LVX (VMX) STVX (VMX)
(define_insn "vsx_mov<mode>_64bit"
[(set (match_operand:VSX_M 0 "nonimmediate_operand"
"=ZwO, <VSa>, <VSa>, r, we, ?wQ,
?&r, ??r, ??Y, <??r>, wo, v,
- ?<VSa>, *r, v, ??r, wZ, v")
+ ?<VSa>, v, <??r>, wZ, v")
(match_operand:VSX_M 1 "input_operand"
"<VSa>, ZwO, <VSa>, we, r, r,
wQ, Y, r, r, wE, jwM,
- ?jwM, jwM, W, W, v, wZ"))]
+ ?jwM, W, <nW>, v, wZ"))]
"TARGET_POWERPC64 && VECTOR_MEM_VSX_P (<MODE>mode)
&& (register_operand (operands[0], <MODE>mode)
@@ -1214,25 +1226,25 @@
[(set_attr "type"
"vecstore, vecload, vecsimple, mffgpr, mftgpr, load,
store, load, store, *, vecsimple, vecsimple,
- vecsimple, *, *, *, vecstore, vecload")
+ vecsimple, *, *, vecstore, vecload")
(set_attr "length"
"4, 4, 4, 8, 4, 8,
8, 8, 8, 8, 4, 4,
- 4, 8, 20, 20, 4, 4")])
+ 4, 20, 8, 4, 4")])
;; VSX store VSX load VSX move GPR load GPR store GPR move
-;; XXSPLTIB VSPLTISW VSX 0/-1 GPR 0/-1 VMX const GPR const
+;; XXSPLTIB VSPLTISW VSX 0/-1 VMX const GPR const
;; LVX (VMX) STVX (VMX)
(define_insn "*vsx_mov<mode>_32bit"
[(set (match_operand:VSX_M 0 "nonimmediate_operand"
"=ZwO, <VSa>, <VSa>, ??r, ??Y, <??r>,
- wo, v, ?<VSa>, *r, v, ??r,
+ wo, v, ?<VSa>, v, <??r>,
wZ, v")
(match_operand:VSX_M 1 "input_operand"
"<VSa>, ZwO, <VSa>, Y, r, r,
- wE, jwM, ?jwM, jwM, W, W,
+ wE, jwM, ?jwM, W, <nW>,
v, wZ"))]
"!TARGET_POWERPC64 && VECTOR_MEM_VSX_P (<MODE>mode)
@@ -1243,12 +1255,12 @@
}
[(set_attr "type"
"vecstore, vecload, vecsimple, load, store, *,
- vecsimple, vecsimple, vecsimple, *, *, *,
+ vecsimple, vecsimple, vecsimple, *, *,
vecstore, vecload")
(set_attr "length"
"4, 4, 4, 16, 16, 16,
- 4, 4, 4, 16, 20, 32,
+ 4, 4, 4, 20, 16,
4, 4")])
;; Explicit load/store expanders for the builtin functions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 50ff532..77787b2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-17 Peter Bergner <bergner@linux.ibm.com>
+
+ PR target/87870
+ * gcc.target/powerpc/pr87870.c: New test.
+
2018-12-17 Jakub Jelinek <jakub@redhat.com>
PR c++/88410
diff --git a/gcc/testsuite/gcc.target/powerpc/pr87870.c b/gcc/testsuite/gcc.target/powerpc/pr87870.c
new file mode 100644
index 0000000..d2108ac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr87870.c
@@ -0,0 +1,28 @@
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+/* { dg-options "-O2" } */
+
+__int128
+test0 (void)
+{
+ return 0;
+}
+
+__int128
+test1 (void)
+{
+ return 1;
+}
+
+__int128
+test2 (void)
+{
+ return -1;
+}
+
+__int128
+test3 (void)
+{
+ return ((__int128)0xdeadbeefcafebabe << 64) | 0xfacefeedbaaaaaad;
+}
+
+/* { dg-final { scan-assembler-not {\mld\M} } } */