1 /* { dg-do compile } */
2 /* { dg-options "-O -g" } */
3 /* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
4 
5 #include <arm_sve.h>
6 
7 /*
8 ** callee_pred:
9 **	addvl	sp, sp, #-1
10 **	str	p[0-9]+, \[sp\]
11 **	str	p[0-9]+, \[sp, #1, mul vl\]
12 **	ldr	(p[0-9]+), \[x0\]
13 **	ldr	(p[0-9]+), \[x1\]
14 **	brkpa	(p[0-7])\.b, p0/z, p1\.b, p2\.b
15 **	brkpb	(p[0-7])\.b, \3/z, p3\.b, \1\.b
16 **	brka	p0\.b, \4/z, \2\.b
17 **	ldr	p[0-9]+, \[sp\]
18 **	ldr	p[0-9]+, \[sp, #1, mul vl\]
19 **	addvl	sp, sp, #1
20 **	ret
21 */
22 __SVBool_t __attribute__((noipa))
callee_pred(__SVBool_t p0,__SVBool_t p1,__SVBool_t p2,__SVBool_t p3,__SVBool_t mem0,__SVBool_t mem1)23 callee_pred (__SVBool_t p0, __SVBool_t p1, __SVBool_t p2, __SVBool_t p3,
24 	     __SVBool_t mem0, __SVBool_t mem1)
25 {
26   p0 = svbrkpa_z (p0, p1, p2);
27   p0 = svbrkpb_z (p0, p3, mem0);
28   return svbrka_z (p0, mem1);
29 }
30 
31 /*
32 ** caller_pred:
33 **	...
34 **	ptrue	(p[0-9]+)\.b, vl5
35 **	str	\1, \[x0\]
36 **	...
37 **	ptrue	(p[0-9]+)\.h, vl6
38 **	str	\2, \[x1\]
39 **	ptrue	p3\.d, vl4
40 **	ptrue	p2\.s, vl3
41 **	ptrue	p1\.h, vl2
42 **	ptrue	p0\.b, vl1
43 **	bl	callee_pred
44 **	...
45 */
46 __SVBool_t __attribute__((noipa))
caller_pred(void)47 caller_pred (void)
48 {
49   return callee_pred (svptrue_pat_b8 (SV_VL1),
50 		      svptrue_pat_b16 (SV_VL2),
51 		      svptrue_pat_b32 (SV_VL3),
52 		      svptrue_pat_b64 (SV_VL4),
53 		      svptrue_pat_b8 (SV_VL5),
54 		      svptrue_pat_b16 (SV_VL6));
55 }
56