Re: [PATCH v3] PR92398: Fix testcase failure of pr72804.c

2019-11-29 Thread Segher Boessenkool
Hi Xiong Hu,

On Mon, Nov 25, 2019 at 10:24:35AM +0800, luoxhu wrote:
> P9LE generated instruction is not worse than P8LE.
> mtvsrdd;xxlnot;stxv vs. not;not;std;std.

To be clear: it can have longer latency, but latency via memory is not
so critical, and this does save decode and other resources.  It's hard
to choose which is best :-)

>   * gcc.target/powerpc/pr72804.c: Split the store function to...
>   * gcc.target/powerpc/pr92398.h: ... this one.  New.

I wanted to say that splitting one single function to a header file is a
bit overkill, but it gives a nice place to discuss the differences in
generated code on different CPUs, so okay, it's useful :-)

> +   store generates difference instructions as below:
> +   P9+: mtvsrdd;xxlnot;stxv.
> +   P8/P7/P6 LE: not;not;std;std.
> +   P8 BE: mtvsrd;mtvsrd;xxpermdi;xxlnor;stxvd2x.
> +   P7/P6 BE: std;std;addi;lxvd2x;xxlnor;stxvd2x.
> +   P9+ and P9- LE are expected, P6/P7/P8 BE are unexpected.  */

Great overview, thanks.

> diff --git a/gcc/testsuite/gcc.target/powerpc/pr92398.p9+.c 
> b/gcc/testsuite/gcc.target/powerpc/pr92398.p9+.c
> new file mode 100644
> index 000..2ebe2025cef
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pr92398.p9+.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile { target { lp64 && p9+ } } } */
> +/* { dg-require-effective-target powerpc_vsx_ok } */
> +/* { dg-options "-O2 -mvsx" } */
> +
> +/* { dg-final { scan-assembler-times {\mmtvsrdd\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mxxlnor\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mstxv\M} 1 } } */

Maybe add scan-assembler-not for "not" and "std", and in the < p9 testcase
for these three?

> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pr92398.p9-.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile { target { lp64 && {! p9+} } } } */
> +/* { dg-require-effective-target powerpc_vsx_ok } */
> +/* { dg-options "-O2 -mvsx" } */
> +
> +/* { dg-final { scan-assembler-times {\mnot\M} 2 { xfail be } } } */
> +/* { dg-final { scan-assembler-times {\mstd\M} 2 { xfail { {p8} && {be} } } 
> } } */

I think you can write that as just

/* { dg-final { scan-assembler-times {\mstd\M} 2 { xfail { p8 && be } } } } */

Okay for trunk with or without such tweaks.  Thanks, and sorry the review
took a while!


Segher


Re: [PATCH v3] PR92398: Fix testcase failure of pr72804.c

2019-11-24 Thread luoxhu
Hi,

>> +++ b/gcc/testsuite/gcc.target/powerpc/pr72804-1.c
> 
>> +/* store generates difference instructions as below:
>> +   P9: mtvsrdd;xxlnot;stxv.
>> +   P8/P7/P6 LE: not;not;std;std.
>> +   P8 BE: mtvsrd;mtvsrd;xxpermdi;xxlnor;stxvd2x.
>> +   P7/P6 BE: std;std;addi;lxvd2x;xxlnor;stxvd2x.  */
> 
> But it should generate just the first or second.  So just document that,
> and base the tests around that as well?

check_effective_target_p8 is needed as P7/P6 BE has two unexpected std?
Also I split the store to new head file and rename it to pr92398.h.

Others are updated as below patch, Thanks:


P9LE generated instruction is not worse than P8LE.
mtvsrdd;xxlnot;stxv vs. not;not;std;std.
Update the test case to fix failures.

gcc/testsuite/ChangeLog:

2019-11-25  Luo Xiong Hu  

testsuite/pr92398
* gcc.target/powerpc/pr72804.c: Split the store function to...
* gcc.target/powerpc/pr92398.h: ... this one.  New.
* gcc.target/powerpc/pr92398.p9+.c: New.
* gcc.target/powerpc/pr92398.p9-.c: New.
* lib/target-supports.exp (check_effective_target_p8): New.
(check_effective_target_p9+): New.
---
 gcc/testsuite/gcc.target/powerpc/pr72804.c| 19 --
 gcc/testsuite/gcc.target/powerpc/pr92398.h| 17 
 .../gcc.target/powerpc/pr92398.p9+.c  | 10 ++
 .../gcc.target/powerpc/pr92398.p9-.c  | 10 ++
 gcc/testsuite/lib/target-supports.exp | 20 +++
 5 files changed, 61 insertions(+), 15 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pr92398.h
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pr92398.p9+.c
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pr92398.p9-.c

diff --git a/gcc/testsuite/gcc.target/powerpc/pr72804.c 
b/gcc/testsuite/gcc.target/powerpc/pr72804.c
index 10e37caed6b..0b083a44ede 100644
--- a/gcc/testsuite/gcc.target/powerpc/pr72804.c
+++ b/gcc/testsuite/gcc.target/powerpc/pr72804.c
@@ -1,7 +1,6 @@
 /* { dg-do compile { target { lp64 } } } */
-/* { dg-skip-if "" { powerpc*-*-darwin* } } */
 /* { dg-require-effective-target powerpc_vsx_ok } */
-/* { dg-options "-O2 -mvsx -fno-inline-functions --param 
max-inline-insns-single-O2=200" } */
+/* { dg-options "-O2 -mvsx" } */
 
 __int128_t
 foo (__int128_t *src)
@@ -9,17 +8,7 @@ foo (__int128_t *src)
   return ~*src;
 }
 
-void
-bar (__int128_t *dst, __int128_t src)
-{
-  *dst =  ~src;
-}
 
-/* { dg-final { scan-assembler-times "not " 4 } } */
-/* { dg-final { scan-assembler-times "std " 2 } } */
-/* { dg-final { scan-assembler-times "ld " 2 } } */
-/* { dg-final { scan-assembler-not "lxvd2x" } } */
-/* { dg-final { scan-assembler-not "stxvd2x" } } */
-/* { dg-final { scan-assembler-not "xxpermdi" } } */
-/* { dg-final { scan-assembler-not "mfvsrd" } } */
-/* { dg-final { scan-assembler-not "mfvsrd" } } */
+/* { dg-final { scan-assembler-times {\mld\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mnot\M} 2 } } */
+/* { dg-final { scan-assembler-not {\mlxvd2x\M} } }*/
diff --git a/gcc/testsuite/gcc.target/powerpc/pr92398.h 
b/gcc/testsuite/gcc.target/powerpc/pr92398.h
new file mode 100644
index 000..184d02d3521
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr92398.h
@@ -0,0 +1,17 @@
+/* This test code is included into pr92398.p9-.c and pr92398.p9+.c.
+   The two files have the tests for the number of instructions generated for
+   P9- versus P9+.
+
+   store generates difference instructions as below:
+   P9+: mtvsrdd;xxlnot;stxv.
+   P8/P7/P6 LE: not;not;std;std.
+   P8 BE: mtvsrd;mtvsrd;xxpermdi;xxlnor;stxvd2x.
+   P7/P6 BE: std;std;addi;lxvd2x;xxlnor;stxvd2x.
+   P9+ and P9- LE are expected, P6/P7/P8 BE are unexpected.  */
+
+void
+bar (__int128_t *dst, __int128_t src)
+{
+  *dst =  ~src;
+}
+
diff --git a/gcc/testsuite/gcc.target/powerpc/pr92398.p9+.c 
b/gcc/testsuite/gcc.target/powerpc/pr92398.p9+.c
new file mode 100644
index 000..2ebe2025cef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr92398.p9+.c
@@ -0,0 +1,10 @@
+/* { dg-do compile { target { lp64 && p9+ } } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O2 -mvsx" } */
+
+/* { dg-final { scan-assembler-times {\mmtvsrdd\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxlnor\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mstxv\M} 1 } } */
+
+/* Source code for the test in pr92398.h */
+#include "pr92398.h"
diff --git a/gcc/testsuite/gcc.target/powerpc/pr92398.p9-.c 
b/gcc/testsuite/gcc.target/powerpc/pr92398.p9-.c
new file mode 100644
index 000..eaf0ddb86eb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr92398.p9-.c
@@ -0,0 +1,10 @@
+/* { dg-do compile { target { lp64 && {! p9+} } } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O2 -mvsx" } */
+
+/* { dg-final { scan-assembler-times {\mnot\M} 2 { xfail be } } } */
+/* { dg-final { scan-assembler-times {\mstd\M} 2 { xfail { {p8} && {be} } } } 
} */
+
+/* 

Re: [PATCH v3] PR92398: Fix testcase failure of pr72804.c

2019-11-22 Thread Segher Boessenkool
Hi!

On Fri, Nov 22, 2019 at 01:26:39PM +0800, luoxhu wrote:
> Update the code as you wish, Thanks:

The point is to make this interface easy and clear to use.  So please
tell me what *you* think about that, don't just do what I think may be
a good solution!

>   * gcc.target/powerpc/pr72804.c: Split the store function to...
>   * gcc.target/powerpc/pr72804-1.c: ... this one.  New.

Ah, good idea.

> +++ b/gcc/testsuite/gcc.target/powerpc/pr72804-1.c

> +/* store generates difference instructions as below:
> +   P9: mtvsrdd;xxlnot;stxv.
> +   P8/P7/P6 LE: not;not;std;std.
> +   P8 BE: mtvsrd;mtvsrd;xxpermdi;xxlnor;stxvd2x.
> +   P7/P6 BE: std;std;addi;lxvd2x;xxlnor;stxvd2x.  */

But it should generate just the first or second.  So just document that,
and base the tests around that as well?

> +/* { dg-final { scan-assembler-times {\mmtvsrdd\M} 1 { target power9+ } } } 
> */
> +/* { dg-final { scan-assembler-times {\mxxlnor\M} 1 { target power9+ } } } */
> +/* { dg-final { scan-assembler-times {\mstxv\M} 1 { target power9+ } } } */
> +
> +/* { dg-final { scan-assembler-times {\mnot\M} 2 { xfail {! { {! power9+} && 
> {le} } } } } } */
> +
> +/* { dg-final { scan-assembler-times {\mstd\M} 2 { xfail { { {power8} && 
> {be} } || {power9+} } } } } */

These shouldn't xfail for p9 and later: it is an *unexpected* failure there.

Maybe it is easier to duplicate this test?  One for p9+ and one for ! p9+?

> +# Return 1 if we're generating code for only power8 platforms.
> +
> +proc check_effective_target_power8 {  } {
> +  return [check_no_compiler_messages_nocache power8 assembly {
> + #if !(!defined(_ARCH_PWR9) && defined(_ARCH_PWR8))
> + #error NO
> + #endif
> +  } ""]
> +}

Do we need this?

> +# Return 1 if we're generating code for power9 and future platforms.
> +
> +proc check_effective_target_power9+ {  } {
> +  return [check_no_compiler_messages_nocache power9+ assembly {
> + #if !(defined(_ARCH_PWR9))
> + #error NO
> + #endif
> +  } ""]
> +}

Maybe it is useful to have even shorter names, p9+, since room is scarce
where it is used (just like le and be).  But maybe it doesn't matter?


Segher


Re: [PATCH v3] PR92398: Fix testcase failure of pr72804.c

2019-11-21 Thread luoxhu
Hi Segher,
Update the code as you wish, Thanks:

P9LE generated instruction is not worse than P8LE.
mtvsrdd;xxlnot;stxv vs. not;not;std;std.
Update the test case to fix failures.

v4:
Define and use check_effective_target_xxx etc.
power9+: power9, power10 ...
power8: power8 only.

gcc/testsuite/ChangeLog:

2019-11-22  Luo Xiong Hu  

testsuite/pr92398
* gcc.target/powerpc/pr72804.c: Split the store function to...
* gcc.target/powerpc/pr72804-1.c: ... this one.  New.
* lib/target-supports.exp (check_effective_target_power8): New.
(check_effective_target_power9+): New.
---
 gcc/testsuite/gcc.target/powerpc/pr72804-1.c | 23 
 gcc/testsuite/gcc.target/powerpc/pr72804.c   | 19 
 gcc/testsuite/lib/target-supports.exp| 20 +
 3 files changed, 47 insertions(+), 15 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pr72804-1.c

diff --git a/gcc/testsuite/gcc.target/powerpc/pr72804-1.c 
b/gcc/testsuite/gcc.target/powerpc/pr72804-1.c
new file mode 100644
index 000..fce08079bd3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr72804-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O2 -mvsx" } */
+
+void
+bar (__int128_t *dst, __int128_t src)
+{
+  *dst =  ~src;
+}
+
+/* store generates difference instructions as below:
+   P9: mtvsrdd;xxlnot;stxv.
+   P8/P7/P6 LE: not;not;std;std.
+   P8 BE: mtvsrd;mtvsrd;xxpermdi;xxlnor;stxvd2x.
+   P7/P6 BE: std;std;addi;lxvd2x;xxlnor;stxvd2x.  */
+
+/* { dg-final { scan-assembler-times {\mmtvsrdd\M} 1 { target power9+ } } } */
+/* { dg-final { scan-assembler-times {\mxxlnor\M} 1 { target power9+ } } } */
+/* { dg-final { scan-assembler-times {\mstxv\M} 1 { target power9+ } } } */
+
+/* { dg-final { scan-assembler-times {\mnot\M} 2 { xfail {! { {! power9+} && 
{le} } } } } } */
+
+/* { dg-final { scan-assembler-times {\mstd\M} 2 { xfail { { {power8} && {be} 
} || {power9+} } } } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr72804.c 
b/gcc/testsuite/gcc.target/powerpc/pr72804.c
index 10e37caed6b..0b083a44ede 100644
--- a/gcc/testsuite/gcc.target/powerpc/pr72804.c
+++ b/gcc/testsuite/gcc.target/powerpc/pr72804.c
@@ -1,7 +1,6 @@
 /* { dg-do compile { target { lp64 } } } */
-/* { dg-skip-if "" { powerpc*-*-darwin* } } */
 /* { dg-require-effective-target powerpc_vsx_ok } */
-/* { dg-options "-O2 -mvsx -fno-inline-functions --param 
max-inline-insns-single-O2=200" } */
+/* { dg-options "-O2 -mvsx" } */
 
 __int128_t
 foo (__int128_t *src)
@@ -9,17 +8,7 @@ foo (__int128_t *src)
   return ~*src;
 }
 
-void
-bar (__int128_t *dst, __int128_t src)
-{
-  *dst =  ~src;
-}
 
-/* { dg-final { scan-assembler-times "not " 4 } } */
-/* { dg-final { scan-assembler-times "std " 2 } } */
-/* { dg-final { scan-assembler-times "ld " 2 } } */
-/* { dg-final { scan-assembler-not "lxvd2x" } } */
-/* { dg-final { scan-assembler-not "stxvd2x" } } */
-/* { dg-final { scan-assembler-not "xxpermdi" } } */
-/* { dg-final { scan-assembler-not "mfvsrd" } } */
-/* { dg-final { scan-assembler-not "mfvsrd" } } */
+/* { dg-final { scan-assembler-times {\mld\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mnot\M} 2 } } */
+/* { dg-final { scan-assembler-not {\mlxvd2x\M} } }*/
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index 751045d4744..d2e54c57e96 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -2585,6 +2585,26 @@ proc check_effective_target_le { } {
 }]
 }
 
+# Return 1 if we're generating code for only power8 platforms.
+
+proc check_effective_target_power8 {  } {
+  return [check_no_compiler_messages_nocache power8 assembly {
+   #if !(!defined(_ARCH_PWR9) && defined(_ARCH_PWR8))
+   #error NO
+   #endif
+  } ""]
+}
+
+# Return 1 if we're generating code for power9 and future platforms.
+
+proc check_effective_target_power9+ {  } {
+  return [check_no_compiler_messages_nocache power9+ assembly {
+   #if !(defined(_ARCH_PWR9))
+   #error NO
+   #endif
+  } ""]
+}
+
 # Return 1 if we're generating 32-bit code using default options, 0
 # otherwise.
 
-- 
2.21.0.777.g83232e3864



Re: [PATCH v3] PR92398: Fix testcase failure of pr72804.c

2019-11-21 Thread Segher Boessenkool
Hi!

On Wed, Nov 20, 2019 at 02:58:33PM +0800, luoxhu wrote:
> v3:
> Define and use check_effective_target_xxx etc.
> pre_power8: ... power6, power7.
> power8: power8 only.
> post_power8: power8, power9 ...
> post_power9: power9, power10 ...

"post_xxx" does not include "xxx", normally.

Maybe was can call it "power8+"?  Nice and short.  Of course there have
been CPUs called "power5+" etc. as well, but GCC does not support those
as separate -mcpu= (well, except power5+, but that won't give confusion
hopefully).

Or can you come up with some other short name for it?

{pre-power8} is the same as {!power8+} btw.

The only one we need here is p9+ btw.  "at-least-p9"?  "p9-or-better"?
Or even just "p9", and have an "exactly-p9" if we need that (but that can
also be written {p9 && !p10} then).

> --- a/gcc/testsuite/gcc.target/powerpc/pr72804.c
> +++ b/gcc/testsuite/gcc.target/powerpc/pr72804.c
> @@ -1,7 +1,6 @@
>  /* { dg-do compile { target { lp64 } } } */
> -/* { dg-skip-if "" { powerpc*-*-darwin* } } */
> -/* { dg-require-effective-target powerpc_vsx_ok } */
> -/* { dg-options "-O2 -mvsx -fno-inline-functions --param 
> max-inline-insns-single-O2=200" } */
> +/* { dg-require-effective-target powerpc_vsx_ok  } */
> +/* { dg-options "-O2 -mvsx" } */
>  
>  __int128_t
>  foo (__int128_t *src)
> @@ -15,11 +14,35 @@ bar (__int128_t *dst, __int128_t src)
>*dst =  ~src;
>  }
>  
> -/* { dg-final { scan-assembler-times "not " 4 } } */
> -/* { dg-final { scan-assembler-times "std " 2 } } */
> +/* { dg-final { scan-assembler-times "not " 2 { target post_power9 } } } */
> +/* { dg-final { scan-assembler-not "std " { target post_power9 } } } */

{\mnot\M} etc.?

> +/* { dg-final { scan-assembler-not "stxvd2x" { target post_power9 } } } */
> +/* { dg-final { scan-assembler-not "xxpermdi" { target post_power9 } } } */

So p9 does ld;ld;not;not and mtvsrdd;xxlnor;stxv (both BE and LE).  Can
you test all those, and all those we should *not* generate?

> +/* { dg-final { scan-assembler-times "not " 2 { target { {power8} && {be} } 
> } } } */
> +/* { dg-final { scan-assembler-not "std " { target { {power8} && {be} } } } 
> } */
> +/* { dg-final { scan-assembler-times "stxvd2x" 1 { target { {power8} && {be} 
> } } } } */
> +/* { dg-final { scan-assembler-times "xxpermdi" 1 { target { {power8} && 
> {be} } } } } */

> +/* { dg-final { scan-assembler-times "not " 4 { target { {power8} && {le} } 
> } } } */
> +/* { dg-final { scan-assembler-times "std " 2 { target { {power8} && {le} } 
> } } } */
> +/* { dg-final { scan-assembler-not "stxvd2x" { target { {power8} && {le} } } 
> } } */
> +/* { dg-final { scan-assembler-not "xxpermdi" { target { {power8} && {le} } 
> } } } */

And p8 BE does ld;ld;not;not and mtvsrd;mtvsrd;xxpermdi;xxlnor;stxvd2x .
That store is bad, should do not;not;std;std just like on LE.  Can you check
for the same things for both BE and LE, but xfail those you need to for BE?

> +/* { dg-final { scan-assembler-not "lxvd2x" { target post_power8 } } } */

Ah okay.

> +/* { dg-final { scan-assembler-times "not " 2 { target { {pre_power8} && 
> {be} } } } } */
> +/* { dg-final { scan-assembler-not "std " { target { {pre_power8} && {be} } 
> } } } */
> +/* { dg-final { scan-assembler-times "lxvd2x" 1 { target { {pre_power8} && 
> {be} } } } } */
> +/* { dg-final { scan-assembler-times "stxvd2x" 1 { target { {pre_power8} && 
> {be} } } } } */

p7 BE does ld;ld;not;not just fine, but bounces something off the stack
for the store: std;std;addi;lxvd2x;xxlnor;stxvd2x.

> +/* { dg-final { scan-assembler-times "not " 4 { target { {pre_power8} && 
> {le} } } } } */
> +/* { dg-final { scan-assembler-times "std " 2 { target { {pre_power8} && 
> {le} } } } } */
> +/* { dg-final { scan-assembler-not "lxvd2x" { target { {pre_power8} && {le} 
> } } } } */
> +/* { dg-final { scan-assembler-not "stxvd2x" { target { {pre_power8} && {le} 
> } } } } */
> +
> +/* { dg-final { scan-assembler-not "xxpermdi" { target pre_power8 } } } */

While p7 LE is just fine (all integer).

>  /* { dg-final { scan-assembler-times "ld " 2 } } */
> -/* { dg-final { scan-assembler-not "lxvd2x" } } */
> -/* { dg-final { scan-assembler-not "stxvd2x" } } */
> -/* { dg-final { scan-assembler-not "xxpermdi" } } */
>  /* { dg-final { scan-assembler-not "mfvsrd" } } */
>  /* { dg-final { scan-assembler-not "mfvsrd" } } */

So, for all targets, the read case should be ld;ld;not;not.  And for
p9+ the write case should be mtvsrdd;xxlnor;stxv while for pre-p9 it
should be not;not;std;std.

Could you write it like that?  And then add xfails where we currently
fail, maybe?

> +# Return 1 if we're generating code for post-power9 platforms.
> +# Power9 is included.
> +
> +proc check_effective_target_post_power9 {  } {
> +  return [check_no_compiler_messages_nocache post_power9 assembly {
> + #if !(defined(_ARCH_PWR9))
> + #error NO
> + #endif
> +  } ""]
> +}

The code for these tests is fine btw, it's just the names that I'm not
sure about.


Segher


Re: [PATCH v3] PR92398: Fix testcase failure of pr72804.c

2019-11-19 Thread luoxhu
P9LE generated instruction is not worse than P8LE.
mtvsrdd;xxlnot;stxv vs. not;not;std;std.
Update the test case to fix failures.

v3:
Define and use check_effective_target_xxx etc.
pre_power8: ... power6, power7.
power8: power8 only.
post_power8: power8, power9 ...
post_power9: power9, power10 ...

gcc/testsuite/ChangeLog:

2019-11-15  Luo Xiong Hu  

testsuite/pr92398
* gcc.target/powerpc/pr72804.c: Update instruction count per
platform.
* lib/target-supports.exp (check_effective_target_pre_power8): New.
(check_effective_target_power8): New.
(check_effective_target_post_power8): New.
(check_effective_target_post_power9): New.
---
 gcc/testsuite/gcc.target/powerpc/pr72804.c | 39 
 gcc/testsuite/lib/target-supports.exp  | 43 ++
 2 files changed, 74 insertions(+), 8 deletions(-)

diff --git a/gcc/testsuite/gcc.target/powerpc/pr72804.c 
b/gcc/testsuite/gcc.target/powerpc/pr72804.c
index 10e37caed6b..69da8942ddd 100644
--- a/gcc/testsuite/gcc.target/powerpc/pr72804.c
+++ b/gcc/testsuite/gcc.target/powerpc/pr72804.c
@@ -1,7 +1,6 @@
 /* { dg-do compile { target { lp64 } } } */
-/* { dg-skip-if "" { powerpc*-*-darwin* } } */
-/* { dg-require-effective-target powerpc_vsx_ok } */
-/* { dg-options "-O2 -mvsx -fno-inline-functions --param 
max-inline-insns-single-O2=200" } */
+/* { dg-require-effective-target powerpc_vsx_ok  } */
+/* { dg-options "-O2 -mvsx" } */
 
 __int128_t
 foo (__int128_t *src)
@@ -15,11 +14,35 @@ bar (__int128_t *dst, __int128_t src)
   *dst =  ~src;
 }
 
-/* { dg-final { scan-assembler-times "not " 4 } } */
-/* { dg-final { scan-assembler-times "std " 2 } } */
+/* { dg-final { scan-assembler-times "not " 2 { target post_power9 } } } */
+/* { dg-final { scan-assembler-not "std " { target post_power9 } } } */
+/* { dg-final { scan-assembler-not "stxvd2x" { target post_power9 } } } */
+/* { dg-final { scan-assembler-not "xxpermdi" { target post_power9 } } } */
+
+/* { dg-final { scan-assembler-times "not " 2 { target { {power8} && {be} } } 
} } */
+/* { dg-final { scan-assembler-not "std " { target { {power8} && {be} } } } } 
*/
+/* { dg-final { scan-assembler-times "stxvd2x" 1 { target { {power8} && {be} } 
} } } */
+/* { dg-final { scan-assembler-times "xxpermdi" 1 { target { {power8} && {be} 
} } } } */
+
+/* { dg-final { scan-assembler-times "not " 4 { target { {power8} && {le} } } 
} } */
+/* { dg-final { scan-assembler-times "std " 2 { target { {power8} && {le} } } 
} } */
+/* { dg-final { scan-assembler-not "stxvd2x" { target { {power8} && {le} } } } 
} */
+/* { dg-final { scan-assembler-not "xxpermdi" { target { {power8} && {le} } } 
} } */
+
+/* { dg-final { scan-assembler-not "lxvd2x" { target post_power8 } } } */
+
+/* { dg-final { scan-assembler-times "not " 2 { target { {pre_power8} && {be} 
} } } } */
+/* { dg-final { scan-assembler-not "std " { target { {pre_power8} && {be} } } 
} } */
+/* { dg-final { scan-assembler-times "lxvd2x" 1 { target { {pre_power8} && 
{be} } } } } */
+/* { dg-final { scan-assembler-times "stxvd2x" 1 { target { {pre_power8} && 
{be} } } } } */
+
+/* { dg-final { scan-assembler-times "not " 4 { target { {pre_power8} && {le} 
} } } } */
+/* { dg-final { scan-assembler-times "std " 2 { target { {pre_power8} && {le} 
} } } } */
+/* { dg-final { scan-assembler-not "lxvd2x" { target { {pre_power8} && {le} } 
} } } */
+/* { dg-final { scan-assembler-not "stxvd2x" { target { {pre_power8} && {le} } 
} } } */
+
+/* { dg-final { scan-assembler-not "xxpermdi" { target pre_power8 } } } */
+
 /* { dg-final { scan-assembler-times "ld " 2 } } */
-/* { dg-final { scan-assembler-not "lxvd2x" } } */
-/* { dg-final { scan-assembler-not "stxvd2x" } } */
-/* { dg-final { scan-assembler-not "xxpermdi" } } */
 /* { dg-final { scan-assembler-not "mfvsrd" } } */
 /* { dg-final { scan-assembler-not "mfvsrd" } } */
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index 751045d4744..324ec152544 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -2585,6 +2585,49 @@ proc check_effective_target_le { } {
 }]
 }
 
+# Return 1 if we're generating code for pre-power8 platforms.
+# Power8 is NOT included.
+
+proc check_effective_target_pre_power8 {  } {
+  return [check_no_compiler_messages_nocache pre_power8 assembly {
+   #if defined(_ARCH_PWR8)
+   #error NO
+   #endif
+  } ""]
+}
+
+# Return 1 if we're generating code for power8 platforms.
+
+proc check_effective_target_power8 {  } {
+  return [check_no_compiler_messages_nocache power8 assembly {
+   #if !(!defined(_ARCH_PWR9) && defined(_ARCH_PWR8))
+   #error NO
+   #endif
+  } ""]
+}
+
+# Return 1 if we're generating code for post-power8 platforms.
+# Power8 is included.
+
+proc check_effective_target_post_power8 {  } {
+  return [check_no_compiler_messages_nocache post_power8 assembly {
+   #if