[AArch64] Add a new CC mode for SVE conditions
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 18 Jun 2019 14:54:34 +0000 (14:54 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 18 Jun 2019 14:54:34 +0000 (14:54 +0000)
The SVE ACLE patches need to introduce a new CC_NZC mode for the
conditions that can be tested after a PTRUE.  In particular, LT needs
to map to "mi"/"first" and GE to "pl"/"nfrst", instead of the normal
CC mapping.

Another advantage of using a separate mode is that we can print the SVE
names of the conditions, which makes the output a bit easier to read.
It therefore seems like an independent improvement that can go in now.

The patch also avoids using (compare X (const_int 0)), because that gets
folded away when used with LTU and GEU ("cc"/"last" and "cs"/"nlast").
Just using an unspec should be OK.

The full set of conditions can't be tested without other SVE ACLE patches.

2019-06-18  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64-modes.def (CC_NZC): New CC_MODE.
* config/aarch64/aarch64-sve.md (*<optab><mode>3_cc)
(ptest_ptrue<mode>, while_ult<GPI:mode><PRED_ALL:mode>)
(*while_ult<GPI:mode><PRED_ALL:mode>_cc, *cmp<cmp_op><mode>)
(*cmp<cmp_op><mode>_ptest, *cmp<cmp_op><mode>_cc)
(*pred_cmp<cmp_op><mode>_combine, *pred_cmp<cmp_op><mode>)
(vec_cmp<mode><vpred>, vec_cmpu<mode><vpred>, cbranch<mode>4):
Use CC_NZC instead of CC.
* config/aarch64/aarch64.md (condjump): Print a '.' in SVE conditions.
* config/aarch64/aarch64.c (aarch64_sve_condition_codes): New variable.
(aarch64_print_operand): Handle E_CC_NZCmode.
(aarch64_emit_sve_ptrue_op_cc): Use gen_set_clobber_cc_nzc instead
of gen_set_clobber_cc.

gcc/testsuite/
* gcc.target/aarch64/sve/struct_vect_18.c: Allow branches to
contain dots.
* gcc.target/aarch64/sve/struct_vect_19.c: Likewise.
* gcc.target/aarch64/sve/struct_vect_20.c: Likewise.
* gcc.target/aarch64/sve/struct_vect_21.c: Likewise.
* gcc.target/aarch64/sve/struct_vect_22.c: Likewise.
* gcc.target/aarch64/sve/struct_vect_23.c: Likewise.
* gcc.target/aarch64/sve/unroll-1.c: Likewise.
* gcc.target/aarch64/sve/while_1.c: Check for b.any.

From-SVN: r272427

14 files changed:
gcc/ChangeLog
gcc/config/aarch64/aarch64-modes.def
gcc/config/aarch64/aarch64-sve.md
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/sve/struct_vect_18.c
gcc/testsuite/gcc.target/aarch64/sve/struct_vect_19.c
gcc/testsuite/gcc.target/aarch64/sve/struct_vect_20.c
gcc/testsuite/gcc.target/aarch64/sve/struct_vect_21.c
gcc/testsuite/gcc.target/aarch64/sve/struct_vect_22.c
gcc/testsuite/gcc.target/aarch64/sve/struct_vect_23.c
gcc/testsuite/gcc.target/aarch64/sve/unroll-1.c
gcc/testsuite/gcc.target/aarch64/sve/while_1.c

index 4ce44041cb2be74bab86462e24857c616a7f5774..f0a3c3919804877285046beef105f725b496c124 100644 (file)
@@ -1,3 +1,19 @@
+2019-06-18  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/aarch64/aarch64-modes.def (CC_NZC): New CC_MODE.
+       * config/aarch64/aarch64-sve.md (*<optab><mode>3_cc)
+       (ptest_ptrue<mode>, while_ult<GPI:mode><PRED_ALL:mode>)
+       (*while_ult<GPI:mode><PRED_ALL:mode>_cc, *cmp<cmp_op><mode>)
+       (*cmp<cmp_op><mode>_ptest, *cmp<cmp_op><mode>_cc)
+       (*pred_cmp<cmp_op><mode>_combine, *pred_cmp<cmp_op><mode>)
+       (vec_cmp<mode><vpred>, vec_cmpu<mode><vpred>, cbranch<mode>4):
+       Use CC_NZC instead of CC.
+       * config/aarch64/aarch64.md (condjump): Print a '.' in SVE conditions.
+       * config/aarch64/aarch64.c (aarch64_sve_condition_codes): New variable.
+       (aarch64_print_operand): Handle E_CC_NZCmode.
+       (aarch64_emit_sve_ptrue_op_cc): Use gen_set_clobber_cc_nzc instead
+       of gen_set_clobber_cc.
+
 2019-06-18  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/aarch64/aarch64-sve.md: Tabify file.
index 14c1a43fe8b10e22f07f15c87ccad2783a003177..e034ffc969b3f16399565c7ad749b85eec9f942a 100644 (file)
@@ -33,6 +33,8 @@
 CC_MODE (CCFP);
 CC_MODE (CCFPE);
 CC_MODE (CC_SWP);
+CC_MODE (CC_NZC);   /* Only N, Z and C bits of condition flags are valid.
+                      (Used with SVE predicate tests.)  */
 CC_MODE (CC_NZ);    /* Only N and Z bits of condition flags are valid.  */
 CC_MODE (CC_Z);     /* Only Z bit of condition flags is valid.  */
 CC_MODE (CC_C);     /* C represents unsigned overflow of a simple addition.  */
index eb20b8344441cd075d94b9855401776e152ae234..a09e8c7554633a6577c5c734ffb2dfe7bc523934 100644 (file)
 ;; UNSPEC_PTEST_PTRUE is logically redundant, but means that the tested
 ;; value is structurally equivalent to rhs of the second set.
 (define_insn "*<optab><mode>3_cc"
-  [(set (reg:CC CC_REGNUM)
-       (compare:CC
-         (unspec:SI [(match_operand:PRED_ALL 1 "register_operand" "Upa")
-                     (and:PRED_ALL
-                       (LOGICAL:PRED_ALL
-                         (match_operand:PRED_ALL 2 "register_operand" "Upa")
-                         (match_operand:PRED_ALL 3 "register_operand" "Upa"))
-                       (match_dup 1))]
-                    UNSPEC_PTEST_PTRUE)
-         (const_int 0)))
+  [(set (reg:CC_NZC CC_REGNUM)
+       (unspec:CC_NZC
+         [(match_operand:PRED_ALL 1 "register_operand" "Upa")
+          (and:PRED_ALL
+            (LOGICAL:PRED_ALL
+              (match_operand:PRED_ALL 2 "register_operand" "Upa")
+              (match_operand:PRED_ALL 3 "register_operand" "Upa"))
+            (match_dup 1))]
+         UNSPEC_PTEST_PTRUE))
    (set (match_operand:PRED_ALL 0 "register_operand" "=Upa")
        (and:PRED_ALL (LOGICAL:PRED_ALL (match_dup 2) (match_dup 3))
                      (match_dup 1)))]
 ;; the constant.  We would use a separate unspec code for PTESTs involving
 ;; GPs that might not be PTRUEs.
 (define_insn "ptest_ptrue<mode>"
-  [(set (reg:CC CC_REGNUM)
-       (compare:CC
-         (unspec:SI [(match_operand:PRED_ALL 0 "register_operand" "Upa")
-                     (match_operand:PRED_ALL 1 "register_operand" "Upa")]
-                    UNSPEC_PTEST_PTRUE)
-         (const_int 0)))]
+  [(set (reg:CC_NZC CC_REGNUM)
+       (unspec:CC_NZC
+         [(match_operand:PRED_ALL 0 "register_operand" "Upa")
+          (match_operand:PRED_ALL 1 "register_operand" "Upa")]
+         UNSPEC_PTEST_PTRUE))]
   "TARGET_SVE"
   "ptest\t%0, %1.b"
 )
        (unspec:PRED_ALL [(match_operand:GPI 1 "aarch64_reg_or_zero" "rZ")
                          (match_operand:GPI 2 "aarch64_reg_or_zero" "rZ")]
                         UNSPEC_WHILE_LO))
-   (clobber (reg:CC CC_REGNUM))]
+   (clobber (reg:CC_NZC CC_REGNUM))]
   "TARGET_SVE"
   "whilelo\t%0.<PRED_ALL:Vetype>, %<w>1, %<w>2"
 )
 ;; Handle the case in which both results are useful.  The GP operand
 ;; to the PTEST isn't needed, so we allow it to be anything.
 (define_insn_and_rewrite "*while_ult<GPI:mode><PRED_ALL:mode>_cc"
-  [(set (reg:CC CC_REGNUM)
-       (compare:CC
-         (unspec:SI [(match_operand:PRED_ALL 1)
-                     (unspec:PRED_ALL
-                       [(match_operand:GPI 2 "aarch64_reg_or_zero" "rZ")
-                        (match_operand:GPI 3 "aarch64_reg_or_zero" "rZ")]
-                       UNSPEC_WHILE_LO)]
-                    UNSPEC_PTEST_PTRUE)
-         (const_int 0)))
+  [(set (reg:CC_NZC CC_REGNUM)
+       (unspec:CC_NZC
+         [(match_operand:PRED_ALL 1)
+          (unspec:PRED_ALL
+            [(match_operand:GPI 2 "aarch64_reg_or_zero" "rZ")
+             (match_operand:GPI 3 "aarch64_reg_or_zero" "rZ")]
+            UNSPEC_WHILE_LO)]
+         UNSPEC_PTEST_PTRUE))
    (set (match_operand:PRED_ALL 0 "register_operand" "=Upa")
        (unspec:PRED_ALL [(match_dup 2)
                          (match_dup 3)]
             (match_operand:SVE_I 2 "register_operand" "w, w")
             (match_operand:SVE_I 3 "aarch64_sve_cmp_<sve_imm_con>_operand" "<sve_imm_con>, w"))]
          UNSPEC_MERGE_PTRUE))
-   (clobber (reg:CC CC_REGNUM))]
+   (clobber (reg:CC_NZC CC_REGNUM))]
   "TARGET_SVE"
   "@
    cmp<cmp_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, #%3
 ;; Integer comparisons predicated with a PTRUE in which only the flags result
 ;; is interesting.
 (define_insn "*cmp<cmp_op><mode>_ptest"
-  [(set (reg:CC CC_REGNUM)
-       (compare:CC
-         (unspec:SI
-           [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
-            (unspec:<VPRED>
-              [(match_dup 1)
-               (SVE_INT_CMP:<VPRED>
-                 (match_operand:SVE_I 2 "register_operand" "w, w")
-                 (match_operand:SVE_I 3 "aarch64_sve_cmp_<sve_imm_con>_operand" "<sve_imm_con>, w"))]
-              UNSPEC_MERGE_PTRUE)]
-           UNSPEC_PTEST_PTRUE)
-         (const_int 0)))
+  [(set (reg:CC_NZC CC_REGNUM)
+       (unspec:CC_NZC
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (unspec:<VPRED>
+            [(match_dup 1)
+             (SVE_INT_CMP:<VPRED>
+               (match_operand:SVE_I 2 "register_operand" "w, w")
+               (match_operand:SVE_I 3 "aarch64_sve_cmp_<sve_imm_con>_operand" "<sve_imm_con>, w"))]
+            UNSPEC_MERGE_PTRUE)]
+         UNSPEC_PTEST_PTRUE))
    (clobber (match_scratch:<VPRED> 0 "=Upa, Upa"))]
   "TARGET_SVE"
   "@
 ;; Integer comparisons predicated with a PTRUE in which both the flag and
 ;; predicate results are interesting.
 (define_insn "*cmp<cmp_op><mode>_cc"
-  [(set (reg:CC CC_REGNUM)
-       (compare:CC
-         (unspec:SI
-           [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
-            (unspec:<VPRED>
-              [(match_dup 1)
-               (SVE_INT_CMP:<VPRED>
-                 (match_operand:SVE_I 2 "register_operand" "w, w")
-                 (match_operand:SVE_I 3 "aarch64_sve_cmp_<sve_imm_con>_operand" "<sve_imm_con>, w"))]
-              UNSPEC_MERGE_PTRUE)]
-           UNSPEC_PTEST_PTRUE)
-         (const_int 0)))
+  [(set (reg:CC_NZC CC_REGNUM)
+       (unspec:CC_NZC
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (unspec:<VPRED>
+            [(match_dup 1)
+             (SVE_INT_CMP:<VPRED>
+               (match_operand:SVE_I 2 "register_operand" "w, w")
+               (match_operand:SVE_I 3 "aarch64_sve_cmp_<sve_imm_con>_operand" "<sve_imm_con>, w"))]
+            UNSPEC_MERGE_PTRUE)]
+         UNSPEC_PTEST_PTRUE))
    (set (match_operand:<VPRED> 0 "register_operand" "=Upa, Upa")
        (unspec:<VPRED>
          [(match_dup 1)
              (match_operand:SVE_I 3 "aarch64_sve_cmp_<sve_imm_con>_operand" "<sve_imm_con>, w"))]
           UNSPEC_MERGE_PTRUE)
         (match_operand:<VPRED> 4 "register_operand" "Upl, Upl")))
-   (clobber (reg:CC CC_REGNUM))]
+   (clobber (reg:CC_NZC CC_REGNUM))]
   "TARGET_SVE"
   "#"
   "&& 1"
              (match_dup 2)
              (match_dup 3))
            (match_dup 4)))
-      (clobber (reg:CC CC_REGNUM))])]
+      (clobber (reg:CC_NZC CC_REGNUM))])]
 )
 
 ;; Predicated integer comparisons.
            (match_operand:SVE_I 2 "register_operand" "w, w")
            (match_operand:SVE_I 3 "aarch64_sve_cmp_<sve_imm_con>_operand" "<sve_imm_con>, w"))
          (match_operand:<VPRED> 1 "register_operand" "Upl, Upl")))
-   (clobber (reg:CC CC_REGNUM))]
+   (clobber (reg:CC_NZC CC_REGNUM))]
   "TARGET_SVE"
   "@
    cmp<cmp_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, #%3
          (match_operator:<VPRED> 1 "comparison_operator"
            [(match_operand:SVE_I 2 "register_operand")
             (match_operand:SVE_I 3 "nonmemory_operand")]))
-     (clobber (reg:CC CC_REGNUM))])]
+     (clobber (reg:CC_NZC CC_REGNUM))])]
   "TARGET_SVE"
   {
     aarch64_expand_sve_vec_cmp_int (operands[0], GET_CODE (operands[1]),
          (match_operator:<VPRED> 1 "comparison_operator"
            [(match_operand:SVE_I 2 "register_operand")
             (match_operand:SVE_I 3 "nonmemory_operand")]))
-     (clobber (reg:CC CC_REGNUM))])]
+     (clobber (reg:CC_NZC CC_REGNUM))])]
   "TARGET_SVE"
   {
     aarch64_expand_sve_vec_cmp_int (operands[0], GET_CODE (operands[1]),
                                        operands[2]));
       }
     emit_insn (gen_ptest_ptrue<mode> (ptrue, pred));
-    operands[1] = gen_rtx_REG (CCmode, CC_REGNUM);
+    operands[1] = gen_rtx_REG (CC_NZCmode, CC_REGNUM);
     operands[2] = const0_rtx;
   }
 )
index 9a30d156d85897e553cbac4813982e756d3da983..285ae1cfa7c942433d32ef34f1110a5b40931e3a 100644 (file)
@@ -1308,6 +1308,13 @@ static const char * const aarch64_condition_codes[] =
   "hi", "ls", "ge", "lt", "gt", "le", "al", "nv"
 };
 
+/* The preferred condition codes for SVE conditions.  */
+static const char *const aarch64_sve_condition_codes[] =
+{
+  "none", "any", "nlast", "last", "first", "nfrst", "vs", "vc",
+  "pmore", "plast", "tcont", "tstop", "gt", "le", "al", "nv"
+};
+
 /* Generate code to enable conditional branches in functions over 1 MiB.  */
 const char *
 aarch64_gen_far_branch (rtx * operands, int pos_label, const char * dest,
@@ -7401,6 +7408,21 @@ aarch64_get_condition_code_1 (machine_mode mode, enum rtx_code comp_code)
        }
       break;
 
+    case E_CC_NZCmode:
+      switch (comp_code)
+       {
+       case NE: return AARCH64_NE; /* = any */
+       case EQ: return AARCH64_EQ; /* = none */
+       case GE: return AARCH64_PL; /* = nfrst */
+       case LT: return AARCH64_MI; /* = first */
+       case GEU: return AARCH64_CS; /* = nlast */
+       case GTU: return AARCH64_HI; /* = pmore */
+       case LEU: return AARCH64_LS; /* = plast */
+       case LTU: return AARCH64_CC; /* = last */
+       default: return -1;
+       }
+      break;
+
     case E_CC_NZmode:
       switch (comp_code)
        {
@@ -7734,7 +7756,10 @@ aarch64_print_operand (FILE *f, rtx x, int code)
         gcc_assert (cond_code >= 0);
        if (code == 'M')
          cond_code = AARCH64_INVERSE_CONDITION_CODE (cond_code);
-       fputs (aarch64_condition_codes[cond_code], f);
+       if (GET_MODE (XEXP (x, 0)) == CC_NZCmode)
+         fputs (aarch64_sve_condition_codes[cond_code], f);
+       else
+         fputs (aarch64_condition_codes[cond_code], f);
       }
       break;
 
@@ -17059,7 +17084,7 @@ aarch64_emit_sve_ptrue_op_cc (rtx target, rtx ptrue, rtx op)
   rtx unspec = gen_rtx_UNSPEC (GET_MODE (target),
                               gen_rtvec (2, ptrue, op),
                               UNSPEC_MERGE_PTRUE);
-  rtx_insn *insn = emit_insn (gen_set_clobber_cc (target, unspec));
+  rtx_insn *insn = emit_insn (gen_set_clobber_cc_nzc (target, unspec));
   set_unique_reg_note (insn, REG_EQUAL, copy_rtx (op));
 }
 
index 526c7fb0dabc540065d77d4a7922aeca16a402aa..91e46cf6bf2dc0f9ec71b1ca85424f8ac673951e 100644 (file)
                           (pc)))]
   ""
   {
+    /* GCC's traditional style has been to use "beq" instead of "b.eq", etc.,
+       but the "." is required for SVE conditions.  */
+    bool use_dot_p = GET_MODE (operands[1]) == CC_NZCmode;
     if (get_attr_length (insn) == 8)
-      return aarch64_gen_far_branch (operands, 2, "Lbcond", "b%M0\\t");
+      return aarch64_gen_far_branch (operands, 2, "Lbcond",
+                                    use_dot_p ? "b.%M0\\t" : "b%M0\\t");
     else
-      return  "b%m0\\t%l2";
+      return use_dot_p ? "b.%m0\\t%l2" : "b%m0\\t%l2";
   }
   [(set_attr "type" "branch")
    (set (attr "length")
 )
 
 ;; Helper for aarch64.c code.
-(define_expand "set_clobber_cc"
+(define_expand "set_clobber_cc_nzc"
   [(parallel [(set (match_operand 0)
                   (match_operand 1))
-             (clobber (reg:CC CC_REGNUM))])])
+             (clobber (reg:CC_NZC CC_REGNUM))])])
 
 ;; Hard speculation barrier.
 (define_insn "speculation_barrier"
index e04c0192817166f15aae2d50a4e51d229854d3de..cbbaacdeac62002940a8c6ad06942e09ec64ea96 100644 (file)
@@ -1,3 +1,15 @@
+2019-06-18  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * gcc.target/aarch64/sve/struct_vect_18.c: Allow branches to
+       contain dots.
+       * gcc.target/aarch64/sve/struct_vect_19.c: Likewise.
+       * gcc.target/aarch64/sve/struct_vect_20.c: Likewise.
+       * gcc.target/aarch64/sve/struct_vect_21.c: Likewise.
+       * gcc.target/aarch64/sve/struct_vect_22.c: Likewise.
+       * gcc.target/aarch64/sve/struct_vect_23.c: Likewise.
+       * gcc.target/aarch64/sve/unroll-1.c: Likewise.
+       * gcc.target/aarch64/sve/while_1.c: Check for b.any.
+
 2019-06-18  Uroš Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/i386/pr81563.c (dg-final): Check that no
index dc912e63c0452c228ddfb6000be71b90dd18a3b5..3bc53b69d1c8a2bc421789ad9d0b255fdb5ed4e0 100644 (file)
@@ -46,4 +46,4 @@ TEST (test)
 /* { dg-final { scan-assembler-times {\tstr\td} 1 } } */
 
 /* The only branches should be in the vectorized loop.  */
-/* { dg-final { scan-assembler-times {\tb[a-z]+\t} 4 } } */
+/* { dg-final { scan-assembler-times {\tb[.a-z]+\t} 4 } } */
index 6568dc71cfe7af6c4bf9df22aa9f78095d229901..833bf06698eb339036a2fd37c7d153c58b91dc79 100644 (file)
@@ -46,4 +46,4 @@ TEST (test)
 /* Each function should have three branches: one directly to the exit
    (n <= 0), one to the single scalar epilogue iteration (n == 1),
    and one branch-back for the vectorized loop.  */
-/* { dg-final { scan-assembler-times {\tb[a-z]+\t} 12 } } */
+/* { dg-final { scan-assembler-times {\tb[.a-z]+\t} 12 } } */
index 6c3520c2f54a552fcf9254365f1a64d5a2954710..858ca74f86c3f22175044b7b649cfe6f0e38f61b 100644 (file)
@@ -46,4 +46,4 @@ TEST (test)
 /* { dg-final { scan-assembler-times {\tstr\td} 1 } } */
 
 /* The only branches should be in the vectorized loop.  */
-/* { dg-final { scan-assembler-times {\tb[a-z]+\t} 4 } } */
+/* { dg-final { scan-assembler-times {\tb[.a-z]+\t} 4 } } */
index 4b2a5e463b1f691dcf6622c4e6ef004e76a47b5c..95691fe9ee3d094b6b2f5a3910e0dbcbafd35c0b 100644 (file)
@@ -46,4 +46,4 @@ TEST (test)
 /* Each function should have three branches: one directly to the exit
    (n <= 0), one to the single scalar epilogue iteration (n == 1),
    and one branch-back for the vectorized loop.  */
-/* { dg-final { scan-assembler-times {\tb[a-z]+\t} 12 } } */
+/* { dg-final { scan-assembler-times {\tb[.a-z]+\t} 12 } } */
index b615360536175d720ebf39d190d9e2356f7c1810..8eb072505751a60df22cfd8f6c5ffe8c63d31aa8 100644 (file)
@@ -46,4 +46,4 @@ TEST (test)
 /* { dg-final { scan-assembler-times {\tstr\td} 1 } } */
 
 /* The only branches should be in the vectorized loop.  */
-/* { dg-final { scan-assembler-times {\tb[a-z]+\t} 4 } } */
+/* { dg-final { scan-assembler-times {\tb[.a-z]+\t} 4 } } */
index b529e0386f7b8f193f79d33eeea5088b8cf2de09..705b2350ace81d146ed20a46a1e59311e953cbdd 100644 (file)
@@ -46,4 +46,4 @@ TEST (test)
 /* Each function should have three branches: one directly to the exit
    (n <= 0), one to the single scalar epilogue iteration (n == 1),
    and one branch-back for the vectorized loop.  */
-/* { dg-final { scan-assembler-times {\tb[a-z]+\t} 12 } } */
+/* { dg-final { scan-assembler-times {\tb[.a-z]+\t} 12 } } */
index d4353009e2145ec59b3ac74a8fc0a4a16e441581..e33777fc3911d0b612aef0073ae1333f8c2297a5 100644 (file)
@@ -10,4 +10,4 @@ fully_peel_me (double *x)
     x[i] = x[i] * 2;
 }
 
-/* { dg-final { scan-assembler-times {b..\t\.L.\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tb[.a-z]+\t} 1 } } */
index 05a486012210f1c3a9be8e254fe9f09938d03b34..2cfb3f697980bd207ba870eab6255361b5dfd8fe 100644 (file)
@@ -42,3 +42,4 @@ TEST_ALL (ADD_LOOP)
 /* { dg-final { scan-assembler-times {\tst1w\tz[0-9]+\.s, p[0-7], \[x0, x[0-9]+, lsl 2\]\n} 3 } } */
 /* { dg-final { scan-assembler-times {\tld1d\tz[0-9]+\.d, p[0-7]/z, \[x0, x[0-9]+, lsl 3\]\n} 3 } } */
 /* { dg-final { scan-assembler-times {\tst1d\tz[0-9]+\.d, p[0-7], \[x0, x[0-9]+, lsl 3\]\n} 3 } } */
+/* { dg-final { scan-assembler-times {\tb\.any\t} 10 } } */