aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaochen Gui <guihaoc@gcc.gnu.org>2024-01-25 14:54:42 +0800
committerHaochen Gui <guihaoc@gcc.gnu.org>2024-01-25 14:57:39 +0800
commit464de9c283f7f4717280c515a192e479d7a840a3 (patch)
tree2a37c9d04d31d6ae7c0c34463cceae76c9861100
parent73f0a1a70c22e4d117ece7ddfa53661bb74137d4 (diff)
downloadgcc-464de9c283f7f4717280c515a192e479d7a840a3.zip
gcc-464de9c283f7f4717280c515a192e479d7a840a3.tar.gz
gcc-464de9c283f7f4717280c515a192e479d7a840a3.tar.bz2
rs6000: Enable block compare expand on P9 with m32 and mpowerpc64
gcc/ * config/rs6000/rs6000-string.cc (expand_block_compare): Enable P9 with m32 and mpowerpc64. gcc/testsuite/ * gcc.target/powerpc/block-cmp-1.c: Exclude m32 and mpowerpc64. * gcc.target/powerpc/block-cmp-4.c: Likewise. * gcc.target/powerpc/block-cmp-8.c: New.
-rw-r--r--gcc/config/rs6000/rs6000-string.cc12
-rw-r--r--gcc/testsuite/gcc.target/powerpc/block-cmp-1.c1
-rw-r--r--gcc/testsuite/gcc.target/powerpc/block-cmp-4.c3
-rw-r--r--gcc/testsuite/gcc.target/powerpc/block-cmp-8.c8
4 files changed, 18 insertions, 6 deletions
diff --git a/gcc/config/rs6000/rs6000-string.cc b/gcc/config/rs6000/rs6000-string.cc
index f707bb2..917f557 100644
--- a/gcc/config/rs6000/rs6000-string.cc
+++ b/gcc/config/rs6000/rs6000-string.cc
@@ -1950,11 +1950,13 @@ expand_block_compare (rtx operands[])
/* TARGET_POPCNTD is already guarded at expand cmpmemsi. */
gcc_assert (TARGET_POPCNTD);
- /* This case is complicated to handle because the subtract
- with carry instructions do not generate the 64-bit
- carry and so we must emit code to calculate it ourselves.
- We choose not to implement this yet. */
- if (TARGET_32BIT && TARGET_POWERPC64)
+ /* For P8, this case is complicated to handle because the subtract
+ with carry instructions do not generate the 64-bit carry and so
+ we must emit code to calculate it ourselves. We skip it on P8
+ but setb works well on P9. */
+ if (TARGET_32BIT
+ && TARGET_POWERPC64
+ && !TARGET_P9_MISC)
return false;
/* Allow this param to shut off all expansion. */
diff --git a/gcc/testsuite/gcc.target/powerpc/block-cmp-1.c b/gcc/testsuite/gcc.target/powerpc/block-cmp-1.c
index bcf0cb2..cd076cf 100644
--- a/gcc/testsuite/gcc.target/powerpc/block-cmp-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/block-cmp-1.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -mdejagnu-cpu=power8 -mno-vsx" } */
+/* { dg-skip-if "" { has_arch_ppc64 && ilp32 } } */
/* { dg-final { scan-assembler-not {\mb[l]? memcmp\M} } } */
/* Test that it still can do expand for memcmpsi instead of calling library
diff --git a/gcc/testsuite/gcc.target/powerpc/block-cmp-4.c b/gcc/testsuite/gcc.target/powerpc/block-cmp-4.c
index c86feba..ee9a015 100644
--- a/gcc/testsuite/gcc.target/powerpc/block-cmp-4.c
+++ b/gcc/testsuite/gcc.target/powerpc/block-cmp-4.c
@@ -1,6 +1,7 @@
/* { dg-do compile { target be } } */
/* { dg-options "-O2 -mdejagnu-cpu=power7" } */
-/* { dg-final { scan-assembler-not {\mb[l]? memcmp\M} } } */
+/* { dg-skip-if "" { has_arch_ppc64 && ilp32 } } */
+/* { dg-final { scan-assembler-not {\mb[l]? memcmp\M} } } */
/* Test that it does expand for memcmpsi instead of calling library on
P7 BE when length is less than 32 bytes. */
diff --git a/gcc/testsuite/gcc.target/powerpc/block-cmp-8.c b/gcc/testsuite/gcc.target/powerpc/block-cmp-8.c
new file mode 100644
index 0000000..22a48c8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/block-cmp-8.c
@@ -0,0 +1,8 @@
+/* { dg-do run { target ilp32 } } */
+/* { dg-options "-O2 -mpowerpc64" } */
+/* { dg-require-effective-target has_arch_ppc64 } */
+/* { dg-timeout-factor 2 } */
+
+/* Verify memcmp on m32 mpowerpc64 */
+
+#include "../../gcc.dg/memcmp-1.c"