1 /* { dg-do compile { target lp64 } } */
2 /* { dg-options "-O -mlittle-endian -fno-stack-clash-protection -g" } */
3 /* { dg-final { check-function-bodies "**" "" } } */
4
5 #pragma GCC aarch64 "arm_sve.h"
6
7 /*
8 ** callee:
9 ** (
10 ** ldr (z[0-9]+), \[x1, #1, mul vl\]
11 ** ldr (z[0-9]+), \[x1\]
12 ** st2b {\2\.b - \1\.b}, p0, \[x0\]
13 ** |
14 ** ldr (z[0-9]+), \[x1\]
15 ** ldr (z[0-9]+), \[x1, #1, mul vl\]
16 ** st2b {\3\.b - \4\.b}, p0, \[x0\]
17 ** )
18 ** st4b {z0\.b - z3\.b}, p1, \[x0\]
19 ** st3b {z4\.b - z6\.b}, p2, \[x0\]
20 ** st1b z7\.b, p3, \[x0\]
21 ** ret
22 */
23 void __attribute__((noipa))
callee(void * x0,svuint8x4_t z0,svuint8x3_t z4,svuint8x2_t stack,svuint8_t z7,svbool_t p0,svbool_t p1,svbool_t p2,svbool_t p3)24 callee (void *x0, svuint8x4_t z0, svuint8x3_t z4, svuint8x2_t stack,
25 svuint8_t z7, svbool_t p0, svbool_t p1, svbool_t p2, svbool_t p3)
26 {
27 svst2 (p0, x0, stack);
28 svst4 (p1, x0, z0);
29 svst3 (p2, x0, z4);
30 svst1_u8 (p3, x0, z7);
31 }
32
33 void __attribute__((noipa))
caller(void * x0)34 caller (void *x0)
35 {
36 svbool_t pg;
37 pg = svptrue_b8 ();
38 callee (x0,
39 svld4_vnum_u8 (pg, x0, -8),
40 svld3_vnum_u8 (pg, x0, -3),
41 svld2_vnum_u8 (pg, x0, 0),
42 svld1_vnum_u8 (pg, x0, 2),
43 svptrue_pat_b8 (SV_VL1),
44 svptrue_pat_b16 (SV_VL2),
45 svptrue_pat_b32 (SV_VL3),
46 svptrue_pat_b64 (SV_VL4));
47 }
48
49 /* { dg-final { scan-assembler {\tld4b\t{z0\.b - z3\.b}, p[0-7]/z, \[x0, #-8, mul vl\]\n} } } */
50 /* { dg-final { scan-assembler {\tld3b\t{z4\.b - z6\.b}, p[0-7]/z, \[x0, #-3, mul vl\]\n} } } */
51 /* { dg-final { scan-assembler {\tld1b\tz7\.b, p[0-7]/z, \[x0, #2, mul vl\]\n} } } */
52 /* { dg-final { scan-assembler {\tmov\tx1, sp\n} } } */
53 /* { dg-final { scan-assembler {\tld2b\t{(z[0-9]+)\.b - z[0-9]+\.b}.*\tstr\t\1, \[x1\]\n} } } */
54 /* { dg-final { scan-assembler {\tld2b\t{z[0-9]+\.b - (z[0-9]+)\.b}.*\tstr\t\1, \[x1, #1, mul vl\]\n} } } */
55 /* { dg-final { scan-assembler {\tptrue\tp0\.b, vl1\n} } } */
56 /* { dg-final { scan-assembler {\tptrue\tp1\.h, vl2\n} } } */
57 /* { dg-final { scan-assembler {\tptrue\tp2\.s, vl3\n} } } */
58 /* { dg-final { scan-assembler {\tptrue\tp3\.d, vl4\n} } } */
59