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