diff mbox series

, V8, #3 of 6, Testsuite: Insure no prefixed instruction uses update addressing

Message ID 20191115001915.GC19187@ibm-toto.the-meissners.org
State New
Headers show
Series , V8, #3 of 6, Testsuite: Insure no prefixed instruction uses update addressing | expand

Commit Message

Michael Meissner Nov. 15, 2019, 12:19 a.m. UTC
The prefixed instructions do not support the update form of the memory
instruction (i.e. internally this is addresses using PRE_INC, PRE_DEC, or
PRE_MODIFY).

Can I check this into the FSF trunk?

2019-11-14  Michael Meissner  <meissner@linux.ibm.com>

	* gcc.target/powerpc/prefix-premodify.c: New test to make sure we
	do not generate PRE_INC, PRE_DEC, or PRE_MODIFY on prefixed loads
	or stores.

Comments

Segher Boessenkool Dec. 2, 2019, 7:47 p.m. UTC | #1
On Thu, Nov 14, 2019 at 07:19:15PM -0500, Michael Meissner wrote:
> +/* { dg-final { scan-assembler-times {\mpli\M|\mpla\M|\mpaddi\M} 4 } } */

How can this generate pli or pla?  If this is something this test tests
for, the comment should say.

> +/* { dg-final { scan-assembler-not   {\mp?stwzu\M}                 } } */

That instruction does not exist anyway (it's stwu).

> +/* { dg-final { scan-assembler-not   {\maddis\M}                   } } */
> +/* { dg-final { scan-assembler-not   {\maddi\M}                    } } */

See above.


Segher
diff mbox series

Patch

--- /tmp/LMc94y_prefix-premodify.c	2019-11-13 17:41:36.037020850 -0500
+++ gcc/testsuite/gcc.target/powerpc/prefix-premodify.c	2019-11-13 17:41:35.807018779 -0500
@@ -0,0 +1,47 @@ 
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_prefixed_addr_ok } */
+/* { dg-options "-O2 -mdejagnu-cpu=future" } */
+
+/* Make sure that we don't try to generate a prefixed form of the load and
+   store with update instructions.  */
+
+#ifndef SIZE
+#define SIZE 50000
+#endif
+
+struct foo {
+  unsigned int field;
+  char pad[SIZE];
+};
+
+struct foo *inc_load (struct foo *p, unsigned int *q)
+{
+  *q = (++p)->field;
+  return p;
+}
+
+struct foo *dec_load (struct foo *p, unsigned int *q)
+{
+  *q = (--p)->field;
+  return p;
+}
+
+struct foo *inc_store (struct foo *p, unsigned int *q)
+{
+  (++p)->field = *q;
+  return p;
+}
+
+struct foo *dec_store (struct foo *p, unsigned int *q)
+{
+  (--p)->field = *q;
+  return p;
+}
+
+/* { dg-final { scan-assembler-times {\mpli\M|\mpla\M|\mpaddi\M} 4 } } */
+/* { dg-final { scan-assembler-times {\mplwz\M}                  2 } } */
+/* { dg-final { scan-assembler-times {\mpstw\M}                  2 } } */
+/* { dg-final { scan-assembler-not   {\mp?lwzu\M}                  } } */
+/* { dg-final { scan-assembler-not   {\mp?stwzu\M}                 } } */
+/* { dg-final { scan-assembler-not   {\maddis\M}                   } } */
+/* { dg-final { scan-assembler-not   {\maddi\M}                    } } */