Fix the bound checking for the opc1 operand of the following intrinsics:
  __arm_mcrr
  __arm_mcrr2
  __arm_mrrc
  __arm_mrrc2

Built arm-none-linux-gnueabihf and ran full regression test, and built arm-none-eabi but only ran the changed tests on that config.

OK for trunk and backport to all open branches (after a week or so)?

gcc/ChangeLog:

        PR target/121464
        * config/arm/arm.md (arm_<mrrc>, arm_<mcrr>): Fix operand check.

gcc/testsuite/ChangeLog:

        PR target/121464
        * testsuite/gcc.target/arm/acle/mcrr.c: Update testcase.
        * testsuite/gcc.target/arm/acle/mcrr2.c: Likewise.
        * testsuite/gcc.target/arm/acle/mrrc.c: Likewise.
        * testsuite/gcc.target/arm/acle/mrrc2.c: Likewise.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 
5e5e1120e77a67eafe61ced0a7182cf312bf594b..5e700b1979009d38b46954ef409b7ddbcf1dc01e
 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -13025,7 +13025,7 @@ (define_insn "arm_<mcrr>"
   "arm_coproc_builtin_available (VUNSPEC_<MCRR>)"
 {
   arm_const_bounds (operands[0], 0, 16);
-  arm_const_bounds (operands[1], 0, 8);
+  arm_const_bounds (operands[1], 0, 16);
   arm_const_bounds (operands[3], 0, (1 << 5));
   return "<mcrr>\\tp%c0, %1, %Q2, %R2, CR%c3";
 }
@@ -13040,7 +13040,7 @@ (define_insn "arm_<mrrc>"
   "arm_coproc_builtin_available (VUNSPEC_<MRRC>)"
 {
   arm_const_bounds (operands[1], 0, 16);
-  arm_const_bounds (operands[2], 0, 8);
+  arm_const_bounds (operands[2], 0, 16);
   arm_const_bounds (operands[3], 0, (1 << 5));
   return "<mrrc>\\tp%c1, %2, %Q0, %R0, CR%c3";
 }
diff --git a/gcc/testsuite/gcc.target/arm/acle/mcrr.c 
b/gcc/testsuite/gcc.target/arm/acle/mcrr.c
index 
468dd96fb9b6a726aaa235172340a904b4e420d8..5081f715314215da2138f6052cb35ea9abec3842
 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mcrr.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mcrr.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc3_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -15,6 +16,22 @@ void test_mcrr (uint64_t a)
   a += 77;
   __arm_mcrr (10, 5, a, 3);
 }
+/*
+** test_mcrr:
+** ...
+**     add.*#77
+** ...
+**     mcrr    p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
 
-/* { dg-final { scan-assembler "add\[^\n\]*#77\n" } } */
-/* { dg-final { scan-assembler "mcrr\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+void test_mcrr_pr121464 (uint64_t a)
+{
+  __arm_mcrr (7, 11, a, 0);
+}
+/*
+** test_mcrr_pr121464:
+** ...
+**     mcrr    p7, #11, r[0-9]+, r[0-9]+, CR0
+** ...
+*/
diff --git a/gcc/testsuite/gcc.target/arm/acle/mcrr2.c 
b/gcc/testsuite/gcc.target/arm/acle/mcrr2.c
index 
1173ad06b533233651bddb1dd9d118ddeed5f8ae..a0f93cc8915576a3527d1e70587b9c355f0b25e4
 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mcrr2.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mcrr2.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc4_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -15,6 +16,25 @@ void test_mcrr2 (uint64_t a)
   a += 77;
   __arm_mcrr2 (10, 5, a, 3);
 }
+/*
+** test_mcrr2:
+** ...
+**     add.*#77
+** ...
+**     mcrr2   p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
 
-/* { dg-final { scan-assembler "add\[^\n\]*#77\n" } } */
-/* { dg-final { scan-assembler "mcrr2\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+void test_mcrr2_pr121464 (void)
+{
+  __arm_mcrr2 (3, 12, 49, 4);
+}
+
+/*
+** test_mcrr2_pr121464:
+** ...
+**     mov.*#49
+** ...
+**     mcrr2   p3, #12, r[0-9]+, r[0-9]+, CR4
+** ...
+*/
diff --git a/gcc/testsuite/gcc.target/arm/acle/mrrc.c 
b/gcc/testsuite/gcc.target/arm/acle/mrrc.c
index 
c004660fadcadb912b3c246241843e22242dffcc..54e542bb102d43ccf84476a3c99e1e2a703a17df
 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mrrc.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mrrc.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc3_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -15,4 +16,21 @@ uint64_t test_mrrc (void)
   return __arm_mrrc (10, 5, 3);
 }
 
-/* { dg-final { scan-assembler "mrrc\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+/*
+** test_mrrc:
+** ...
+**     mrrc    p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
+
+uint64_t test_mrrc_pr121464 (void)
+{
+  return __arm_mrrc (15, 9, 7);
+}
+
+/*
+** test_mrrc_pr121464:
+** ...
+**     mrrc    p15, #9, r[0-9]+, r[0-9]+, CR7
+** ...
+*/
diff --git a/gcc/testsuite/gcc.target/arm/acle/mrrc2.c 
b/gcc/testsuite/gcc.target/arm/acle/mrrc2.c
index 
b5d56da8f90b2397408617dda610703f44f4435b..8d8937adb4e49ce589fb14f0b8a715035d7b5b6a
 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mrrc2.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mrrc2.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc4_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -14,5 +15,20 @@ uint64_t test_mrrc2 (void)
 {
   return __arm_mrrc2 (10, 5, 3);
 }
+/*
+** test_mrrc2:
+** ...
+**     mrrc2   p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
 
-/* { dg-final { scan-assembler "mrrc2\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+uint64_t test_mrrc2_pr121464 (void)
+{
+  return __arm_mrrc2 (0, 15, 10);
+}
+/*
+** test_mrrc2_pr121464:
+** ...
+**     mrrc2   p0, #15, r[0-9]+, r[0-9]+, CR10
+** ...
+*/

Reply via email to