Hi Alice,
 
> Some SME tests currently require SVE to be enabled as well.  Either mark
> this requirement explicitly in the test file (with a pragma), or
> eliminate it by modifying the test.
>
> For some check-function-bodies tests we take both approaches - that is,
> we add "+sve" to the existing test, and create a duplicate "+nosve" test
> that checks for the use of __arm_get_current_vg in the prologue.
>
> For vect-dotprod-twoway.c, the issue is that the number of
> udot/sdot/whilelo instructions depends on the selected tuning option.
> Pass an explicit -mtune option to preserve the expected codegen.

This is OK (I didn't see any specific objections in the thread about Darwin).
It's good to have testcases for lots of combinations, however the rather large
check-function-bodies will become a maintenance burden...

Cheers,
Wilco


gcc/testsuite/ChangeLog:

        * g++.target/aarch64/sme/exceptions_2.C: Add +sve pragma.
        * g++.target/aarch64/sme/exceptions_2_nosve.C: New test.
        * gcc.target/aarch64/sme/acle-asm/ldr_vnum_za_sc.c: Remove
        svbool_t parameters.
        * gcc.target/aarch64/sme/acle-asm/ldr_za_sc.c: Ditto.
        * gcc.target/aarch64/sme/acle-asm/str_vnum_za_sc.c: Ditto.
        * gcc.target/aarch64/sme/acle-asm/str_za_sc.c: Ditto.
        * gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
        (TEST_LOAD_ZA_NOPRED, TEST_STORE_ZA_NOPRED): New macros.
        * gcc.target/aarch64/sme/call_sm_switch_1.c: Add +sve pragma.
        * gcc.target/aarch64/sme/call_sm_switch_1_nosve.c: New test.
        * gcc.target/aarch64/sme/call_sm_switch_3.c: Add +sve pragma.
        * gcc.target/aarch64/sme/call_sm_switch_3_nosve.c: New test.
        * gcc.target/aarch64/sme/call_sm_switch_5.c: Add +sve pragma.
        * gcc.target/aarch64/sme/call_sm_switch_6.c: Add +sve pragma.
        * gcc.target/aarch64/sme/call_sm_switch_11.c: Add +sve pragma.
        * gcc.target/aarch64/sme/call_sm_switch_11_nosve.c: New test.
        * gcc.target/aarch64/sme/inlining_9.c: Add +sve pragma.
        * gcc.target/aarch64/sme/inlining_10.c: Add +sve pragma.
        * gcc.target/aarch64/sme/inlining_11.c: Add +sve pragma.
        * gcc.target/aarch64/sme/pr121028.c: Add +sve to pragma.
        * gcc.target/aarch64/sme/vect-dotprod-twoway.c: Add -mtune.
        * gcc.target/aarch64/sme2/acle-asm/ldr_zt.c: Use svcntsb instead
        of svcntb.
        * gcc.target/aarch64/sme2/acle-asm/str_zt.c: Ditto.


diff --git a/gcc/testsuite/g++.target/aarch64/sme/exceptions_2.C 
b/gcc/testsuite/g++.target/aarch64/sme/exceptions_2.C
index 
f791b6ecc5487e949488c338af63aa43f56efdec..b0be27661e634b292afad55cfb3cb56945c51623
 100644
--- a/gcc/testsuite/g++.target/aarch64/sme/exceptions_2.C
+++ b/gcc/testsuite/g++.target/aarch64/sme/exceptions_2.C
@@ -1,6 +1,8 @@
 // { dg-options "-O -fno-optimize-sibling-calls" }
 // { dg-final { check-function-bodies "**" "" } }
 
+#pragma GCC target "+sve"
+
 void n_callee();
 void s_callee() __arm_streaming;
 void sc_callee() __arm_streaming_compatible;
diff --git a/gcc/testsuite/g++.target/aarch64/sme/exceptions_2_nosve.C 
b/gcc/testsuite/g++.target/aarch64/sme/exceptions_2_nosve.C
new file mode 100644
index 
0000000000000000000000000000000000000000..4e68ad60f23bb17f71cff9f83ca889918077182b
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/sme/exceptions_2_nosve.C
@@ -0,0 +1,150 @@
+// { dg-options "-O -fno-optimize-sibling-calls" }
+// { dg-final { check-function-bodies "**" "" } }
+
+#pragma GCC target "+nosve"
+
+void n_callee();
+void s_callee() __arm_streaming;
+void sc_callee() __arm_streaming_compatible;
+
+void n_callee_ne() noexcept;
+void s_callee_ne() noexcept __arm_streaming;
+void sc_callee_ne() noexcept __arm_streaming_compatible;
+
+void n_caller1()
+{
+  try
+    {
+      n_callee();
+      sc_callee();
+    }
+  catch (...)
+    {
+      n_callee_ne();
+      sc_callee_ne();
+    }
+}
+// { dg-final { scan-assembler {_Z9n_caller1v:(?:(?!smstart|smstop).)*\tret} } 
}
+
+/*
+** _Z9n_caller2v:
+**     ...
+**     bl      __arm_get_current_vg
+**     str     x0, [^\n]+
+**     ...
+**     bl      __cxa_begin_catch
+**     smstart sm
+**     bl      _Z11s_callee_nev
+**     smstop  sm
+**     bl      __cxa_end_catch
+**     ...
+*/
+void n_caller2()
+{
+  try
+    {
+      n_callee();
+      sc_callee();
+    }
+  catch (...)
+    {
+      s_callee_ne();
+    }
+}
+
+/*
+** _Z9s_caller1v:
+**     ...
+**     bl      __cxa_end_catch
+**     smstart sm
+**     ...
+*/
+int s_caller1() __arm_streaming
+{
+  try
+    {
+      s_callee();
+      return 1;
+    }
+  catch (...)
+    {
+      return 2;
+    }
+}
+
+/*
+** _Z9s_caller2v:
+**     ...
+**     bl      __cxa_begin_catch
+**     smstart sm
+**     bl      _Z11s_callee_nev
+**     smstop  sm
+**     bl      __cxa_end_catch
+**     smstart sm
+**     ...
+*/
+int s_caller2() __arm_streaming
+{
+  try
+    {
+      n_callee();
+      return 1;
+    }
+  catch (...)
+    {
+      s_callee_ne();
+      return 2;
+    }
+}
+
+/*
+** _Z10sc_caller1v:
+**     ...
+**     bl      __arm_get_current_vg
+**     str     x0, [^\n]+
+**     mrs     (x[0-9]+), svcr
+**     str     \2, ([^\n]+)
+**     ...
+**     bl      __cxa_end_catch
+**     ldr     (x[0-9]+), \3
+**     tbz     \4, 0, [^\n]+
+**     smstart sm
+**     ...
+*/
+int sc_caller1() __arm_streaming_compatible
+{
+  try
+    {
+      sc_callee();
+      return 1;
+    }
+  catch (...)
+    {
+      return 2;
+    }
+}
+
+/*
+** _Z10ls_caller1v:
+**     ...
+**     cntd    (x[0-9]+)
+**     str     \1, [^\n]+
+**     ...
+**     bl      __cxa_begin_catch
+**     smstart sm
+**     bl      _Z12sc_callee_nev
+**     smstop  sm
+**     bl      __cxa_end_catch
+**     ...
+*/
+__arm_locally_streaming void ls_caller1()
+{
+  try
+    {
+      sc_callee();
+    }
+  catch (...)
+    {
+      sc_callee_ne();
+    }
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_vnum_za_sc.c 
b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_vnum_za_sc.c
index 
dfc2d139f8197b2e31193a7509575a23570b78c9..09481ccf4dc68b74e113525b4754860f320644a2
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_vnum_za_sc.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_vnum_za_sc.c
@@ -9,7 +9,7 @@
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_0_0,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_0_0,
               svldr_vnum_za (0, x1, 0),
               svldr_vnum_za (0, x1, 0))
 
@@ -19,7 +19,7 @@ TEST_LOAD_ZA (ldr_vnum_za_0_0,
 **      ldr     za\[\1, 1\], \[x1(?:, #1, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_0_1,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_0_1,
               svldr_vnum_za (0, x1, 1),
               svldr_vnum_za (0, x1, 1))
 
@@ -29,7 +29,7 @@ TEST_LOAD_ZA (ldr_vnum_za_0_1,
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_1_0,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_1_0,
               svldr_vnum_za (1, x1, 0),
               svldr_vnum_za (1, x1, 0))
 
@@ -39,7 +39,7 @@ TEST_LOAD_ZA (ldr_vnum_za_1_0,
 **      ldr     za\[\1, 2\], \[x1(?:, #2, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_1_2,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_1_2,
               svldr_vnum_za (1, x1, 2),
               svldr_vnum_za (1, x1, 2))
 
@@ -49,7 +49,7 @@ TEST_LOAD_ZA (ldr_vnum_za_1_2,
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0_0,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0_0,
               svldr_vnum_za (w0, x1, 0),
               svldr_vnum_za (w0, x1, 0))
 
@@ -59,7 +59,7 @@ TEST_LOAD_ZA (ldr_vnum_za_w0_0,
 **      ldr     za\[\1, 1\], \[x1, #1, mul vl\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0_1,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0_1,
               svldr_vnum_za (w0, x1, 1),
               svldr_vnum_za (w0, x1, 1))
 
@@ -69,7 +69,7 @@ TEST_LOAD_ZA (ldr_vnum_za_w0_1,
 **      ldr     za\[\1, 13\], \[x1, #13, mul vl\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0_13,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0_13,
               svldr_vnum_za (w0, x1, 13),
               svldr_vnum_za (w0, x1, 13))
 
@@ -79,7 +79,7 @@ TEST_LOAD_ZA (ldr_vnum_za_w0_13,
 **      ldr     za\[\1, 15\], \[x1, #15, mul vl\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0_15,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0_15,
               svldr_vnum_za (w0, x1, 15),
               svldr_vnum_za (w0, x1, 15))
 
@@ -96,7 +96,7 @@ TEST_LOAD_ZA (ldr_vnum_za_w0_15,
 ** )
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0_16,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0_16,
               svldr_vnum_za (w0, x1, 16),
               svldr_vnum_za (w0, x1, 16))
 
@@ -113,7 +113,7 @@ TEST_LOAD_ZA (ldr_vnum_za_w0_16,
 ** )
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0_m1,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0_m1,
               svldr_vnum_za (w0, x1, -1),
               svldr_vnum_za (w0, x1, -1))
 
@@ -123,7 +123,7 @@ TEST_LOAD_ZA (ldr_vnum_za_w0_m1,
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0p1_0,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0p1_0,
               svldr_vnum_za (w0 + 1, x1, 0),
               svldr_vnum_za (w0 + 1, x1, 0))
 
@@ -133,7 +133,7 @@ TEST_LOAD_ZA (ldr_vnum_za_w0p1_0,
 **      ldr     za\[\1, 1\], \[x1(?:, #1, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0m1_1,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0m1_1,
               svldr_vnum_za (w0 - 1, x1, 1),
               svldr_vnum_za (w0 - 1, x1, 1))
 
@@ -143,6 +143,6 @@ TEST_LOAD_ZA (ldr_vnum_za_w0m1_1,
 **      ldr     za\[\1, 3\], \[x1(?:, #3, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_vnum_za_w0p2_3,
+TEST_LOAD_ZA_NOPRED (ldr_vnum_za_w0p2_3,
               svldr_vnum_za (w0 + 2, x1, 3),
               svldr_vnum_za (w0 + 2, x1, 3))
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_za_sc.c 
b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_za_sc.c
index 
a27be76719681252e1bfa1867e558955f3c5d0de..a358b016d8abce7d19e549dc6c694c53d6fa5f0c
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_za_sc.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/ldr_za_sc.c
@@ -9,7 +9,7 @@
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_za_0,
+TEST_LOAD_ZA_NOPRED (ldr_za_0,
               svldr_za (0, x1),
               svldr_za (0, x1))
 
@@ -19,7 +19,7 @@ TEST_LOAD_ZA (ldr_za_0,
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_za_1,
+TEST_LOAD_ZA_NOPRED (ldr_za_1,
               svldr_za (1, x1),
               svldr_za (1, x1))
 
@@ -29,7 +29,7 @@ TEST_LOAD_ZA (ldr_za_1,
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_za_w0,
+TEST_LOAD_ZA_NOPRED (ldr_za_w0,
               svldr_za (w0, x1),
               svldr_za (w0, x1))
 
@@ -39,7 +39,7 @@ TEST_LOAD_ZA (ldr_za_w0,
 **      ldr     za\[\1, 1\], \[x1, #1, mul vl\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_za_w0_1_vnum,
+TEST_LOAD_ZA_NOPRED (ldr_za_w0_1_vnum,
               svldr_za (w0 + 1, x1 + svcntsb ()),
               svldr_za (w0 + 1, x1 + svcntsb ()))
 
@@ -49,7 +49,7 @@ TEST_LOAD_ZA (ldr_za_w0_1_vnum,
 **      ldr     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_LOAD_ZA (ldr_za_w0p2,
+TEST_LOAD_ZA_NOPRED (ldr_za_w0p2,
               svldr_za (w0 + 2, x1),
               svldr_za (w0 + 2, x1))
 
@@ -66,6 +66,6 @@ TEST_LOAD_ZA (ldr_za_w0p2,
 ** )
 **      ret
 */
-TEST_LOAD_ZA (ldr_za_offset,
+TEST_LOAD_ZA_NOPRED (ldr_za_offset,
               svldr_za (w0, x1 + 1),
               svldr_za (w0, x1 + 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_vnum_za_sc.c 
b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_vnum_za_sc.c
index 
7cd09e67c93596c24f3d9844b326d79dd99f4f82..29dc00c3d5331a7b4b047b13bf14991bc3dea1da
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_vnum_za_sc.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_vnum_za_sc.c
@@ -9,7 +9,7 @@
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_0_0,
+TEST_STORE_ZA_NOPRED (str_vnum_za_0_0,
                svstr_vnum_za (0, x1, 0),
                svstr_vnum_za (0, x1, 0))
 
@@ -19,7 +19,7 @@ TEST_STORE_ZA (str_vnum_za_0_0,
 **      str     za\[\1, 1\], \[x1(?:, #1, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_0_1,
+TEST_STORE_ZA_NOPRED (str_vnum_za_0_1,
                svstr_vnum_za (0, x1, 1),
                svstr_vnum_za (0, x1, 1))
 
@@ -29,7 +29,7 @@ TEST_STORE_ZA (str_vnum_za_0_1,
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_1_0,
+TEST_STORE_ZA_NOPRED (str_vnum_za_1_0,
                svstr_vnum_za (1, x1, 0),
                svstr_vnum_za (1, x1, 0))
 
@@ -39,7 +39,7 @@ TEST_STORE_ZA (str_vnum_za_1_0,
 **      str     za\[\1, 2\], \[x1(?:, #2, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_1_2,
+TEST_STORE_ZA_NOPRED (str_vnum_za_1_2,
                svstr_vnum_za (1, x1, 2),
                svstr_vnum_za (1, x1, 2))
 
@@ -49,7 +49,7 @@ TEST_STORE_ZA (str_vnum_za_1_2,
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0_0,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0_0,
                svstr_vnum_za (w0, x1, 0),
                svstr_vnum_za (w0, x1, 0))
 
@@ -59,7 +59,7 @@ TEST_STORE_ZA (str_vnum_za_w0_0,
 **      str     za\[\1, 1\], \[x1, #1, mul vl\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0_1,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0_1,
                svstr_vnum_za (w0, x1, 1),
                svstr_vnum_za (w0, x1, 1))
 
@@ -69,7 +69,7 @@ TEST_STORE_ZA (str_vnum_za_w0_1,
 **      str     za\[\1, 13\], \[x1, #13, mul vl\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0_13,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0_13,
                svstr_vnum_za (w0, x1, 13),
                svstr_vnum_za (w0, x1, 13))
 
@@ -79,7 +79,7 @@ TEST_STORE_ZA (str_vnum_za_w0_13,
 **      str     za\[\1, 15\], \[x1, #15, mul vl\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0_15,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0_15,
                svstr_vnum_za (w0, x1, 15),
                svstr_vnum_za (w0, x1, 15))
 
@@ -96,7 +96,7 @@ TEST_STORE_ZA (str_vnum_za_w0_15,
 ** )
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0_16,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0_16,
                svstr_vnum_za (w0, x1, 16),
                svstr_vnum_za (w0, x1, 16))
 
@@ -113,7 +113,7 @@ TEST_STORE_ZA (str_vnum_za_w0_16,
 ** )
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0_m1,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0_m1,
                svstr_vnum_za (w0, x1, -1),
                svstr_vnum_za (w0, x1, -1))
 
@@ -123,7 +123,7 @@ TEST_STORE_ZA (str_vnum_za_w0_m1,
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0p1_0,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0p1_0,
                svstr_vnum_za (w0 + 1, x1, 0),
                svstr_vnum_za (w0 + 1, x1, 0))
 
@@ -133,7 +133,7 @@ TEST_STORE_ZA (str_vnum_za_w0p1_0,
 **      str     za\[\1, 1\], \[x1(?:, #1, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0m1_1,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0m1_1,
                svstr_vnum_za (w0 - 1, x1, 1),
                svstr_vnum_za (w0 - 1, x1, 1))
 
@@ -143,6 +143,6 @@ TEST_STORE_ZA (str_vnum_za_w0m1_1,
 **      str     za\[\1, 3\], \[x1(?:, #3, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_vnum_za_w0p2_3,
+TEST_STORE_ZA_NOPRED (str_vnum_za_w0p2_3,
                svstr_vnum_za (w0 + 2, x1, 3),
                svstr_vnum_za (w0 + 2, x1, 3))
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_za_sc.c 
b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_za_sc.c
index 
3406055e70d31955290504f11b4e72280766cd23..a0aa1c7ca7dad74f45cd5c7c7d4a895440186d14
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_za_sc.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/str_za_sc.c
@@ -9,7 +9,7 @@
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_za_0,
+TEST_STORE_ZA_NOPRED (str_za_0,
                svstr_za (0, x1),
                svstr_za (0, x1))
 
@@ -19,7 +19,7 @@ TEST_STORE_ZA (str_za_0,
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_za_1,
+TEST_STORE_ZA_NOPRED (str_za_1,
                svstr_za (1, x1),
                svstr_za (1, x1))
 
@@ -29,7 +29,7 @@ TEST_STORE_ZA (str_za_1,
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_za_w0,
+TEST_STORE_ZA_NOPRED (str_za_w0,
                svstr_za (w0, x1),
                svstr_za (w0, x1))
 
@@ -39,7 +39,7 @@ TEST_STORE_ZA (str_za_w0,
 **      str     za\[\1, 1\], \[x1, #1, mul vl\]
 **      ret
 */
-TEST_STORE_ZA (str_za_w0_1_vnum,
+TEST_STORE_ZA_NOPRED (str_za_w0_1_vnum,
                svstr_za (w0 + 1, x1 + svcntsb ()),
                svstr_za (w0 + 1, x1 + svcntsb ()))
 
@@ -49,7 +49,7 @@ TEST_STORE_ZA (str_za_w0_1_vnum,
 **      str     za\[\1, 0\], \[x1(?:, #0, mul vl)?\]
 **      ret
 */
-TEST_STORE_ZA (str_za_w0p2,
+TEST_STORE_ZA_NOPRED (str_za_w0p2,
                svstr_za (w0 + 2, x1),
                svstr_za (w0 + 2, x1))
 
@@ -66,6 +66,6 @@ TEST_STORE_ZA (str_za_w0p2,
 ** )
 **      ret
 */
-TEST_STORE_ZA (str_za_offset,
+TEST_STORE_ZA_NOPRED (str_za_offset,
                svstr_za (w0, x1 + 1),
                svstr_za (w0, x1 + 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h 
b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
index 
75e3413768e29a0917dc86d25e00f24d78949c81..c81bf074c50173e7f59ce6c9df7074fbb60c37c1
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
+++ b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
@@ -29,6 +29,20 @@
     INVOKE (CODE1, CODE2);                                     \
   }
 
+#define TEST_LOAD_ZA_NOPRED(NAME, CODE1, CODE2)                        \
+  PROTO (NAME, void, (int32_t w0, const char *x1,              \
+                     uint64_t x2))                              \
+  {                                                            \
+    INVOKE (CODE1, CODE2);                                     \
+  }
+
+#define TEST_STORE_ZA_NOPRED(NAME, CODE1, CODE2)               \
+  PROTO (NAME, void, (int32_t w0, char *x1,                    \
+                     uint64_t x2))                              \
+  {                                                            \
+    INVOKE (CODE1, CODE2);                                     \
+  }
+
 #define TEST_READ_ZA(NAME, TYPE, CODE1, CODE2)                  \
   PROTO (NAME, TYPE, (TYPE z0, TYPE z1, svbool_t p0,           \
                       int32_t w0))                               \
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1.c
index 
3a63da7439cce7bca22413d63324eb0b6945e4ac..ed4674a6c84af7df6111af01255124f2312bd9d4
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1.c
@@ -1,6 +1,8 @@
 // { dg-options "-O -fomit-frame-pointer -fno-optimize-sibling-calls 
-funwind-tables" }
 // { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {\t\.inst} 
} }
 
+#pragma GCC target "+sve"
+
 void ns_callee ();
  void s_callee () [[arm::streaming]];
  void sc_callee () [[arm::streaming_compatible]];
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11.c
index 
c72d03f33b971e0cdc299ef1795abd60c33b72a6..78ac503f2e2c3fe854ca10e4aa33602b436cd85a
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11.c
@@ -1,6 +1,7 @@
 // { dg-options "-O -fomit-frame-pointer -fno-optimize-sibling-calls 
-funwind-tables -mtrack-speculation" }
 // { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {\t\.inst} 
} }
 
+#pragma GCC target "+sve"
 
 void ns_callee ();
  void s_callee () [[arm::streaming]];
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11_nosve.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11_nosve.c
new file mode 100644
index 
0000000000000000000000000000000000000000..8f8b25ad89c0f82a5a1db6b566054d912744a27b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11_nosve.c
@@ -0,0 +1,222 @@
+// { dg-options "-O -fomit-frame-pointer -fno-optimize-sibling-calls 
-funwind-tables -mtrack-speculation" }
+// { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {\t\.inst} 
} }
+
+#pragma GCC target "+nosve"
+
+void ns_callee ();
+ void s_callee () [[arm::streaming]];
+ void sc_callee () [[arm::streaming_compatible]];
+
+void ns_callee_stack (int, int, int, int, int, int, int, int, int);
+
+struct callbacks {
+  void (*ns_ptr) ();
+  void (*s_ptr) () [[arm::streaming]];
+  void (*sc_ptr) () [[arm::streaming_compatible]];
+};
+
+/*
+** sc_caller_sme:
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     stp     x29, x30, \[sp, #?-96\]!
+**     mov     x29, sp
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     bl      __arm_get_current_vg
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     str     x0, \[sp, #?24\]
+**     stp     d8, d9, \[sp, #?32\]
+**     stp     d10, d11, \[sp, #?48\]
+**     stp     d12, d13, \[sp, #?64\]
+**     stp     d14, d15, \[sp, #?80\]
+**     mrs     x16, svcr
+**     str     x16, \[x29, #?16\]
+**     ldr     x16, \[x29, #?16\]
+**     tst     x16, #?1
+**     beq     [^\n]*
+**     csel    x15, x15, xzr, ne
+**     smstop  sm
+**     b       [^\n]*
+**     csel    x15, x15, xzr, eq
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     bl      ns_callee
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     ldr     x16, \[x29, #?16\]
+**     tst     x16, #?1
+**     beq     [^\n]*
+**     csel    x15, x15, xzr, ne
+**     smstart sm
+**     b       [^\n]*
+**     csel    x15, x15, xzr, eq
+**     ldr     x16, \[x29, #?16\]
+**     tst     x16, #?1
+**     bne     [^\n]*
+**     csel    x15, x15, xzr, eq
+**     smstart sm
+**     b       [^\n]*
+**     csel    x15, x15, xzr, ne
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     bl      s_callee
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     ldr     x16, \[x29, #?16\]
+**     tst     x16, #?1
+**     bne     [^\n]*
+**     csel    x15, x15, xzr, eq
+**     smstop  sm
+**     b       [^\n]*
+**     csel    x15, x15, xzr, ne
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     bl      sc_callee
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     ldp     d8, d9, \[sp, #?32\]
+**     ldp     d10, d11, \[sp, #?48\]
+**     ldp     d12, d13, \[sp, #?64\]
+**     ldp     d14, d15, \[sp, #?80\]
+**     ldp     x29, x30, \[sp\], #?96
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     ret
+*/
+void
+sc_caller_sme () [[arm::streaming_compatible]]
+{
+  ns_callee ();
+  s_callee ();
+  sc_callee ();
+}
+
+#pragma GCC target "+nosme"
+
+/*
+** sc_caller:
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     stp     x29, x30, \[sp, #?-96\]!
+**     mov     x29, sp
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     bl      __arm_get_current_vg
+**     str     x0, \[sp, #?24\]
+**     stp     d8, d9, \[sp, #?32\]
+**     stp     d10, d11, \[sp, #?48\]
+**     stp     d12, d13, \[sp, #?64\]
+**     stp     d14, d15, \[sp, #?80\]
+**     bl      __arm_sme_state
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     str     x0, \[x29, #?16\]
+**     ...
+**     bl      sc_callee
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     ldp     d8, d9, \[sp, #?32\]
+**     ldp     d10, d11, \[sp, #?48\]
+**     ldp     d12, d13, \[sp, #?64\]
+**     ldp     d14, d15, \[sp, #?80\]
+**     ldp     x29, x30, \[sp\], #?96
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     ret
+*/
+void
+sc_caller () [[arm::streaming_compatible]]
+{
+  ns_callee ();
+  sc_callee ();
+}
+
+/*
+** sc_caller_x0:
+**     ...
+**     mov     x10, x0
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     bl      __arm_get_current_vg
+**     ...
+**     bl      __arm_sme_state
+**     ...
+**     str     wzr, \[x10\]
+**     ...
+*/
+void
+sc_caller_x0 (int *ptr) [[arm::streaming_compatible]]
+{
+  *ptr = 0;
+  ns_callee ();
+  sc_callee ();
+}
+
+/*
+** sc_caller_x1:
+**     ...
+**     mov     x10, x0
+**     mov     x14, sp
+**     and     x14, x14, x15
+**     mov     sp, x14
+**     bl      __arm_get_current_vg
+**     ...
+**     mov     x11, x1
+**     bl      __arm_sme_state
+**     ...
+**     str     w11, \[x10\]
+**     ...
+*/
+void
+sc_caller_x1 (int *ptr, int a) [[arm::streaming_compatible]]
+{
+  *ptr = a;
+  ns_callee ();
+  sc_callee ();
+}
+
+/*
+** sc_caller_stack:
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     sub     sp, sp, #112
+**     stp     x29, x30, \[sp, #?16\]
+**     add     x29, sp, #?16
+**     ...
+**     bl      __arm_get_current_vg
+**     ...
+**     stp     d8, d9, \[sp, #?48\]
+**     ...
+**     bl      __arm_sme_state
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     str     x0, \[x29, #?16\]
+**     ...
+**     bl      ns_callee_stack
+**     cmp     sp, #?0
+**     csetm   x15, ne
+**     ldr     x16, \[x29, #?16\]
+**     tst     x16, #?1
+**     beq     [^\n]*
+**     csel    x15, x15, xzr, ne
+**     .inst 0xd503437f // smstart sm
+**     ...
+*/
+void
+sc_caller_stack () [[arm::streaming_compatible]]
+{
+  ns_callee_stack (0, 0, 0, 0, 0, 0, 0, 0, 0);
+}
+
+/* { dg-final { scan-assembler {sc_caller_sme:(?:(?!ret).)*\.cfi_offset 46, 
-72\n} } } */
+/* { dg-final { scan-assembler {sc_caller:(?:(?!ret).)*\.cfi_offset 46, -72\n} 
} } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1_nosve.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1_nosve.c
new file mode 100644
index 
0000000000000000000000000000000000000000..970fa4a3cc147265a47a228030d03d458da368f5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1_nosve.c
@@ -0,0 +1,240 @@
+// { dg-options "-O -fomit-frame-pointer -fno-optimize-sibling-calls 
-funwind-tables" }
+// { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {\t\.inst} 
} }
+
+#pragma GCC target "+nosve"
+
+void ns_callee ();
+ void s_callee () [[arm::streaming]];
+ void sc_callee () [[arm::streaming_compatible]];
+
+void ns_callee_stack (int, int, int, int, int, int, int, int, int);
+
+struct callbacks {
+  void (*ns_ptr) ();
+   void (*s_ptr) () [[arm::streaming]];
+   void (*sc_ptr) () [[arm::streaming_compatible]];
+};
+
+/*
+** n_caller:   { target lp64 }
+**     stp     x30, (x19|x2[0-8]), \[sp, #?-96\]!
+**     mov     (x9|x1[0-5]), x0
+**     bl      __arm_get_current_vg
+**     str     x0, \[sp, #?16\]
+**     stp     d8, d9, \[sp, #?32\]
+**     stp     d10, d11, \[sp, #?48\]
+**     stp     d12, d13, \[sp, #?64\]
+**     stp     d14, d15, \[sp, #?80\]
+**     mov     \1, \2
+**     bl      ns_callee
+**     smstart sm
+**     bl      s_callee
+**     smstop  sm
+**     bl      sc_callee
+**     ldr     (x[0-9]+), \[\1\]
+**     blr     \3
+**     ldr     (x[0-9]+), \[\1, #?8\]
+**     smstart sm
+**     blr     \4
+**     smstop  sm
+**     ldr     (x[0-9]+), \[\1, #?16\]
+**     blr     \5
+**     ldp     d8, d9, \[sp, #?32\]
+**     ldp     d10, d11, \[sp, #?48\]
+**     ldp     d12, d13, \[sp, #?64\]
+**     ldp     d14, d15, \[sp, #?80\]
+**     ldp     x30, \1, \[sp\], #?96
+**     ret
+*/
+void
+n_caller (struct callbacks *c)
+{
+  ns_callee ();
+  s_callee ();
+  sc_callee ();
+
+  c->ns_ptr ();
+  c->s_ptr ();
+  c->sc_ptr ();
+}
+
+/*
+** s_caller:   { target lp64 }
+**     stp     x30, (x19|x2[0-8]), \[sp, #?-96\]!
+**     cntd    x16
+**     str     x16, \[sp, #?16\]
+**     stp     d8, d9, \[sp, #?32\]
+**     stp     d10, d11, \[sp, #?48\]
+**     stp     d12, d13, \[sp, #?64\]
+**     stp     d14, d15, \[sp, #?80\]
+**     mov     \1, x0
+**     smstop  sm
+**     bl      ns_callee
+**     smstart sm
+**     bl      s_callee
+**     bl      sc_callee
+**     ldr     (x[0-9]+), \[\1\]
+**     smstop  sm
+**     blr     \2
+**     smstart sm
+**     ldr     (x[0-9]+), \[\1, #?8\]
+**     blr     \3
+**     ldr     (x[0-9]+), \[\1, #?16\]
+**     blr     \4
+**     ldp     d8, d9, \[sp, #?32\]
+**     ldp     d10, d11, \[sp, #?48\]
+**     ldp     d12, d13, \[sp, #?64\]
+**     ldp     d14, d15, \[sp, #?80\]
+**     ldp     x30, \1, \[sp\], #?96
+**     ret
+*/
+void
+s_caller (struct callbacks *c) [[arm::streaming]]
+{
+  ns_callee ();
+  s_callee ();
+  sc_callee ();
+
+  c->ns_ptr ();
+  c->s_ptr ();
+  c->sc_ptr ();
+}
+
+/*
+** sc_caller_sme:
+**     stp     x29, x30, \[sp, #?-96\]!
+**     mov     x29, sp
+**     bl      __arm_get_current_vg
+**     str     x0, \[sp, #?24\]
+**     stp     d8, d9, \[sp, #?32\]
+**     stp     d10, d11, \[sp, #?48\]
+**     stp     d12, d13, \[sp, #?64\]
+**     stp     d14, d15, \[sp, #?80\]
+**     mrs     x16, svcr
+**     str     x16, \[x29, #?16\]
+**     ldr     x16, \[x29, #?16\]
+**     tbz     x16, 0, .*
+**     smstop  sm
+**     bl      ns_callee
+**     ldr     x16, \[x29, #?16\]
+**     tbz     x16, 0, .*
+**     smstart sm
+**     ldr     x16, \[x29, #?16\]
+**     tbnz    x16, 0, .*
+**     smstart sm
+**     bl      s_callee
+**     ldr     x16, \[x29, #?16\]
+**     tbnz    x16, 0, .*
+**     smstop  sm
+**     bl      sc_callee
+**     ldp     d8, d9, \[sp, #?32\]
+**     ldp     d10, d11, \[sp, #?48\]
+**     ldp     d12, d13, \[sp, #?64\]
+**     ldp     d14, d15, \[sp, #?80\]
+**     ldp     x29, x30, \[sp\], #?96
+**     ret
+*/
+void
+sc_caller_sme () [[arm::streaming_compatible]]
+{
+  ns_callee ();
+  s_callee ();
+  sc_callee ();
+}
+
+#pragma GCC target "+nosme"
+
+/*
+** sc_caller:
+**     stp     x29, x30, \[sp, #?-96\]!
+**     mov     x29, sp
+**     bl      __arm_get_current_vg
+**     str     x0, \[sp, #?24\]
+**     stp     d8, d9, \[sp, #?32\]
+**     stp     d10, d11, \[sp, #?48\]
+**     stp     d12, d13, \[sp, #?64\]
+**     stp     d14, d15, \[sp, #?80\]
+**     bl      __arm_sme_state
+**     str     x0, \[x29, #?16\]
+**     ...
+**     bl      sc_callee
+**     ldp     d8, d9, \[sp, #?32\]
+**     ldp     d10, d11, \[sp, #?48\]
+**     ldp     d12, d13, \[sp, #?64\]
+**     ldp     d14, d15, \[sp, #?80\]
+**     ldp     x29, x30, \[sp\], #?96
+**     ret
+*/
+void
+sc_caller () [[arm::streaming_compatible]]
+{
+  ns_callee ();
+  sc_callee ();
+}
+
+/*
+** sc_caller_x0:
+**     ...
+**     mov     x10, x0
+**     bl      __arm_get_current_vg
+**     ...
+**     bl      __arm_sme_state
+**     ...
+**     str     wzr, \[x10\]
+**     ...
+*/
+void
+sc_caller_x0 (int *ptr) [[arm::streaming_compatible]]
+{
+  *ptr = 0;
+  ns_callee ();
+  sc_callee ();
+}
+
+/*
+** sc_caller_x1:
+**     ...
+**     mov     x10, x0
+**     bl      __arm_get_current_vg
+**     ...
+**     mov     x11, x1
+**     bl      __arm_sme_state
+**     ...
+**     str     w11, \[x10\]
+**     ...
+*/
+void
+sc_caller_x1 (int *ptr, int a) [[arm::streaming_compatible]]
+{
+  *ptr = a;
+  ns_callee ();
+  sc_callee ();
+}
+
+/*
+** sc_caller_stack:
+**     sub     sp, sp, #112
+**     stp     x29, x30, \[sp, #?16\]
+**     add     x29, sp, #?16
+**     ...
+**     stp     d8, d9, \[sp, #?48\]
+**     ...
+**     bl      __arm_sme_state
+**     str     x0, \[x29, #?16\]
+**     ...
+**     bl      ns_callee_stack
+**     ldr     x16, \[x29, #?16\]
+**     tbz     x16, 0, .*
+**     .inst 0xd503437f // smstart sm
+**     ...
+*/
+void
+sc_caller_stack () [[arm::streaming_compatible]]
+{
+  ns_callee_stack (0, 0, 0, 0, 0, 0, 0, 0, 0);
+}
+
+/* { dg-final { scan-assembler {n_caller:(?:(?!ret).)*\.cfi_offset 46, -80\n} 
} } */
+/* { dg-final { scan-assembler {s_caller:(?:(?!ret).)*\.cfi_offset 46, -80\n} 
} } */
+/* { dg-final { scan-assembler {sc_caller_sme:(?:(?!ret).)*\.cfi_offset 46, 
-72\n} } } */
+/* { dg-final { scan-assembler {sc_caller:(?:(?!ret).)*\.cfi_offset 46, -72\n} 
} } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_3.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_3.c
index 
4250fe7984cd363dbfb3b24300133a900852ebec..cdfd31340103f776299d17c861320691623255ce
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_3.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_3.c
@@ -1,6 +1,8 @@
 // { dg-options "-O -fomit-frame-pointer -fno-optimize-sibling-calls 
-funwind-tables" }
 // { dg-final { check-function-bodies "**" "" } }
 
+#pragma GCC target "+sve"
+
 __attribute__((aarch64_vector_pcs)) void ns_callee ();
 __attribute__((aarch64_vector_pcs)) void s_callee () [[arm::streaming]];
 __attribute__((aarch64_vector_pcs)) void sc_callee () 
[[arm::streaming_compatible]];
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_3_nosve.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_3_nosve.c
new file mode 100644
index 
0000000000000000000000000000000000000000..9a1b4af20c977e1753c7fe0c3603272df07f50a3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_3_nosve.c
@@ -0,0 +1,169 @@
+// { dg-options "-O -fomit-frame-pointer -fno-optimize-sibling-calls 
-funwind-tables" }
+// { dg-final { check-function-bodies "**" "" } }
+
+#pragma GCC target "+nosve"
+
+__attribute__((aarch64_vector_pcs)) void ns_callee ();
+__attribute__((aarch64_vector_pcs)) void s_callee () [[arm::streaming]];
+__attribute__((aarch64_vector_pcs)) void sc_callee () 
[[arm::streaming_compatible]];
+
+struct callbacks {
+  __attribute__((aarch64_vector_pcs)) void (*ns_ptr) ();
+  __attribute__((aarch64_vector_pcs)) void (*s_ptr) () [[arm::streaming]];
+  __attribute__((aarch64_vector_pcs)) void (*sc_ptr) () 
[[arm::streaming_compatible]];
+};
+
+/*
+** n_caller:   { target lp64 }
+**     stp     x30, (x19|x2[0-8]), \[sp, #?-288\]!
+**     mov     (x9|x1[0-5]), x0
+**     bl      __arm_get_current_vg
+**     str     x0, \[sp, #?16\]
+**     stp     q8, q9, \[sp, #?32\]
+**     stp     q10, q11, \[sp, #?64\]
+**     stp     q12, q13, \[sp, #?96\]
+**     stp     q14, q15, \[sp, #?128\]
+**     stp     q16, q17, \[sp, #?160\]
+**     stp     q18, q19, \[sp, #?192\]
+**     stp     q20, q21, \[sp, #?224\]
+**     stp     q22, q23, \[sp, #?256\]
+**     mov     \1, \2
+**     bl      ns_callee
+**     smstart sm
+**     bl      s_callee
+**     smstop  sm
+**     bl      sc_callee
+**     ldr     (x[0-9]+), \[\1\]
+**     blr     \3
+**     ldr     (x[0-9]+), \[\1, #?8\]
+**     smstart sm
+**     blr     \4
+**     smstop  sm
+**     ldr     (x[0-9]+), \[\1, #?16\]
+**     blr     \5
+**     ldp     q8, q9, \[sp, #?32\]
+**     ldp     q10, q11, \[sp, #?64\]
+**     ldp     q12, q13, \[sp, #?96\]
+**     ldp     q14, q15, \[sp, #?128\]
+**     ldp     q16, q17, \[sp, #?160\]
+**     ldp     q18, q19, \[sp, #?192\]
+**     ldp     q20, q21, \[sp, #?224\]
+**     ldp     q22, q23, \[sp, #?256\]
+**     ldp     x30, \1, \[sp\], #?288
+**     ret
+*/
+void __attribute__((aarch64_vector_pcs))
+n_caller (struct callbacks *c)
+{
+  ns_callee ();
+  s_callee ();
+  sc_callee ();
+
+  c->ns_ptr ();
+  c->s_ptr ();
+  c->sc_ptr ();
+}
+
+/*
+** s_caller:   { target lp64 }
+**     stp     x30, (x19|x2[0-8]), \[sp, #?-288\]!
+**     cntd    x16
+**     str     x16, \[sp, #?16\]
+**     stp     q8, q9, \[sp, #?32\]
+**     stp     q10, q11, \[sp, #?64\]
+**     stp     q12, q13, \[sp, #?96\]
+**     stp     q14, q15, \[sp, #?128\]
+**     stp     q16, q17, \[sp, #?160\]
+**     stp     q18, q19, \[sp, #?192\]
+**     stp     q20, q21, \[sp, #?224\]
+**     stp     q22, q23, \[sp, #?256\]
+**     mov     \1, x0
+**     smstop  sm
+**     bl      ns_callee
+**     smstart sm
+**     bl      s_callee
+**     bl      sc_callee
+**     ldr     (x[0-9]+), \[\1\]
+**     smstop  sm
+**     blr     \2
+**     smstart sm
+**     ldr     (x[0-9]+), \[\1, #?8\]
+**     blr     \3
+**     ldr     (x[0-9]+), \[\1, #?16\]
+**     blr     \4
+**     ldp     q8, q9, \[sp, #?32\]
+**     ldp     q10, q11, \[sp, #?64\]
+**     ldp     q12, q13, \[sp, #?96\]
+**     ldp     q14, q15, \[sp, #?128\]
+**     ldp     q16, q17, \[sp, #?160\]
+**     ldp     q18, q19, \[sp, #?192\]
+**     ldp     q20, q21, \[sp, #?224\]
+**     ldp     q22, q23, \[sp, #?256\]
+**     ldp     x30, \1, \[sp\], #?288
+**     ret
+*/
+void __attribute__((aarch64_vector_pcs))
+s_caller (struct callbacks *c) [[arm::streaming]]
+{
+  ns_callee ();
+  s_callee ();
+  sc_callee ();
+
+  c->ns_ptr ();
+  c->s_ptr ();
+  c->sc_ptr ();
+}
+
+/*
+** sc_caller:
+**     stp     x29, x30, \[sp, #?-288\]!
+**     mov     x29, sp
+**     bl      __arm_get_current_vg
+**     str     x0, \[sp, #?24\]
+**     stp     q8, q9, \[sp, #?32\]
+**     stp     q10, q11, \[sp, #?64\]
+**     stp     q12, q13, \[sp, #?96\]
+**     stp     q14, q15, \[sp, #?128\]
+**     stp     q16, q17, \[sp, #?160\]
+**     stp     q18, q19, \[sp, #?192\]
+**     stp     q20, q21, \[sp, #?224\]
+**     stp     q22, q23, \[sp, #?256\]
+**     mrs     x16, svcr
+**     str     x16, \[x29, #?16\]
+**     ldr     x16, \[x29, #?16\]
+**     tbz     x16, 0, .*
+**     smstop  sm
+**     bl      ns_callee
+**     ldr     x16, \[x29, #?16\]
+**     tbz     x16, 0, .*
+**     smstart sm
+**     ldr     x16, \[x29, #?16\]
+**     tbnz    x16, 0, .*
+**     smstart sm
+**     bl      s_callee
+**     ldr     x16, \[x29, #?16\]
+**     tbnz    x16, 0, .*
+**     smstop  sm
+**     bl      sc_callee
+**     ldp     q8, q9, \[sp, #?32\]
+**     ldp     q10, q11, \[sp, #?64\]
+**     ldp     q12, q13, \[sp, #?96\]
+**     ldp     q14, q15, \[sp, #?128\]
+**     ldp     q16, q17, \[sp, #?160\]
+**     ldp     q18, q19, \[sp, #?192\]
+**     ldp     q20, q21, \[sp, #?224\]
+**     ldp     q22, q23, \[sp, #?256\]
+**     ldp     x29, x30, \[sp\], #?288
+**     ret
+*/
+void __attribute__((aarch64_vector_pcs))
+sc_caller () [[arm::streaming_compatible]]
+{
+  ns_callee ();
+  s_callee ();
+  sc_callee ();
+}
+
+/* { dg-final { scan-assembler {n_caller:(?:(?!ret).)*\.cfi_offset 46, -272\n} 
} } */
+/* { dg-final { scan-assembler {s_caller:(?:(?!ret).)*\.cfi_offset 46, -272\n} 
} } */
+/* { dg-final { scan-assembler {sc_caller:(?:(?!ret).)*\.cfi_offset 46, 
-264\n} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_5.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_5.c
index 
d31b6b91f1f02bb30a9d9925460f9590b103d8e0..86ebfcdcadaf6be6316a3fbedd0de1efe2271900
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_5.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_5.c
@@ -3,6 +3,8 @@
 
 #include <arm_sve.h>
 
+#pragma GCC target "+sve"
+
 svbool_t ns_callee ();
  svbool_t s_callee () [[arm::streaming]];
  svbool_t sc_callee () [[arm::streaming_compatible]];
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_6.c 
b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_6.c
index 
0f6bc4f6c9a5037936fcfb4f58540954a99d3fb0..165a4407d6f1edc958f063cb0b27e09ee041f313
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_6.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_6.c
@@ -2,6 +2,8 @@
 
 #include <arm_sve.h>
 
+#pragma GCC target "+sve"
+
 svbool_t ns_callee ();
  svbool_t s_callee () [[arm::streaming]];
  svbool_t sc_callee () [[arm::streaming_compatible]];
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c 
b/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c
index 
adfd45a872fd5544c99daf7eb9900cddec0512e4..78e737e2f40bc9296b59f44666b9e927c1cd85b3
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c
@@ -3,6 +3,8 @@
 #include <arm_neon.h>
 #include <arm_sme.h>
 
+#pragma GCC target "+sve"
+
 uint8x16_t *neon;
 svint64_t *sve;
 int64_t *ptr;
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c 
b/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c
index 
d05a92c1c24f3efa3c290dd095f25066d33fcc40..0cd3487973e3212516a09ebf794cae4b019a27ef
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c
@@ -3,6 +3,8 @@
 #include <arm_neon.h>
 #include <arm_sme.h>
 
+#pragma GCC target "+sve"
+
 uint8x16_t *neon;
 svint64_t *sve;
 int64_t *ptr;
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/inlining_9.c 
b/gcc/testsuite/gcc.target/aarch64/sme/inlining_9.c
index 
91520e3787b1df93cc3482e64e036a271afd4296..dfbfbcae8f362a098d7ee492b39cc68ff3b6109f
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/inlining_9.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/inlining_9.c
@@ -3,6 +3,8 @@
 #include <arm_neon.h>
 #include <arm_sme.h>
 
+#pragma GCC target "+sve"
+
 uint8x16_t *neon;
 svint64_t *sve;
 int64_t *ptr;
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/pr121028.c 
b/gcc/testsuite/gcc.target/aarch64/sme/pr121028.c
index 
a6aa11900f2ecdeb09f55646939737b23af649bb..b06e011c033da68f3f117c209458e472b68a6769
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/pr121028.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/pr121028.c
@@ -24,7 +24,9 @@ void sc_caller_sme() __arm_streaming_compatible
     ns_callee ();
 }
 
-#pragma GCC target "+nosme"
+/* Add +sve to prevent passing +fcma to the assembler, since +fcma was
+   added to assemblers later than SME support.  */
+#pragma GCC target "+sve+nosme"
 
 /*
 ** sc_caller_nosme:
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/vect-dotprod-twoway.c 
b/gcc/testsuite/gcc.target/aarch64/sme/vect-dotprod-twoway.c
index 
77a019a2f388ecc2fe472a770763b1755802c2a1..c8b68c797272451abfaf70b78b47f5ef773beb9e
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/vect-dotprod-twoway.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme/vect-dotprod-twoway.c
@@ -1,4 +1,4 @@
-/* { dg-additional-options "-O2 -ftree-vectorize" } */
+/* { dg-additional-options "-O2 -ftree-vectorize -mtune=generic-armv9-a" } */
 
 #include <stdint.h>
 #pragma GCC target "+sme2"
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/ldr_zt.c 
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/ldr_zt.c
index 
a614fbc9537cb8692bc1e266c5504872bdcc4a58..1baf719fb0a449ce89bca3f9d7a9043cc4297341
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/ldr_zt.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/ldr_zt.c
@@ -29,8 +29,8 @@ PROTO (ldr_zt0_x0p64, void, (char *x0)) { svldr_zt (0, x0 + 
64); }
 
 /*
 ** ldr_zt0_x0_vl1:
-**     incb    x0
+**     addsvl  x0, x0, #?1
 **      ldr     zt0, \[x0\]
 **      ret
 */
-PROTO (ldr_zt0_x0_vl1, void, (char *x0)) { svldr_zt (0, x0 + svcntb()); }
+PROTO (ldr_zt0_x0_vl1, void, (char *x0)) { svldr_zt (0, x0 + svcntsb()); }
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/str_zt.c 
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/str_zt.c
index 
c8ecacb10a01db4d98be08f28741f8ec06f17f5e..9e146ed1fc8db18b5d248b1c251e0d28d18b3bd1
 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/str_zt.c
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/str_zt.c
@@ -29,8 +29,8 @@ PROTO (str_zt0_x0p64, void, (char *x0)) { svstr_zt (0, x0 + 
64); }
 
 /*
 ** str_zt0_x0_vl1:
-**     incb    x0
+**     addsvl  x0, x0, #?1
 **      str     zt0, \[x0\]
 **      ret
 */
-PROTO (str_zt0_x0_vl1, void, (char *x0)) { svstr_zt (0, x0 + svcntb()); }
+PROTO (str_zt0_x0_vl1, void, (char *x0)) { svstr_zt (0, x0 + svcntsb()); }

Reply via email to