1 /* { dg-do run { target aarch64_sve_hw } } */
2 /* { dg-options "-O0 -ffixed-z0 -ffixed-p0" } */
3 
4 #include <arm_sve.h>
5 
6 #define ASM_FUNCTION(NAME, RET_TYPE, ARG_TYPE, INSN) \
7 extern RET_TYPE NAME (svbool_t, ARG_TYPE);	\
8   asm(						\
9 "	.type	" #NAME ", %function\n"		\
10 #NAME ":\n"					\
11 "	" INSN "\n"				\
12 "	ret\n"					\
13 "	.size	" #NAME ", .-" #NAME "\n"	\
14 )
15 
16 ASM_FUNCTION (u8_callee, svuint8_t, svuint8x2_t,
17 	      "add z0.b, p0/m, z0.b, z1.b");
18 ASM_FUNCTION (u16_callee, svuint16_t, svuint16x2_t,
19 	      "add z0.h, p0/m, z0.h, z1.h");
20 ASM_FUNCTION (u32_callee, svuint32_t, svuint32x2_t,
21 	      "add z0.s, p0/m, z0.s, z1.s");
22 ASM_FUNCTION (u64_callee, svuint64_t, svuint64x2_t,
23 	      "add z0.d, p0/m, z0.d, z1.d");
24 
25 ASM_FUNCTION (s8_callee, svint8_t, svint8x2_t,
26 	      "add z0.b, p0/m, z0.b, z1.b");
27 ASM_FUNCTION (s16_callee, svint16_t, svint16x2_t,
28 	      "add z0.h, p0/m, z0.h, z1.h");
29 ASM_FUNCTION (s32_callee, svint32_t, svint32x2_t,
30 	      "add z0.s, p0/m, z0.s, z1.s");
31 ASM_FUNCTION (s64_callee, svint64_t, svint64x2_t,
32 	      "add z0.d, p0/m, z0.d, z1.d");
33 
34 ASM_FUNCTION (f16_callee, svfloat16_t, svfloat16x2_t,
35 	      "fadd z0.h, p0/m, z0.h, z1.h");
36 ASM_FUNCTION (f32_callee, svfloat32_t, svfloat32x2_t,
37 	      "fadd z0.s, p0/m, z0.s, z1.s");
38 ASM_FUNCTION (f64_callee, svfloat64_t, svfloat64x2_t,
39 	      "fadd z0.d, p0/m, z0.d, z1.d");
40 
41 int
main(void)42 main (void)
43 {
44 #define CHECK(SUFFIX)							\
45   if (svptest_any (svptrue_b8 (),					\
46 		   svcmpne (svptrue_b8 (),				\
47 			    SUFFIX##_callee (svptrue_b8 (),		\
48 					     svcreate2 (svdup_##SUFFIX (3), \
49 							svdup_##SUFFIX (6))), \
50 			    svdup_##SUFFIX (9))))			\
51     __builtin_abort ()
52 
53   CHECK (u8);
54   CHECK (u16);
55   CHECK (u32);
56   CHECK (u64);
57 
58   CHECK (s8);
59   CHECK (s16);
60   CHECK (s32);
61   CHECK (s64);
62 
63   CHECK (f16);
64   CHECK (f32);
65   CHECK (f64);
66 
67   return 0;
68 }
69