1 /* { dg-do compile } */
2 /* { dg-options "-O3" } */
3
4 #include <arm_neon.h>
5
6 #define TEST_ADDL(rettype, intype, ts, rs) \
7 rettype test_vaddl_ ## ts (intype a, intype b, intype c) \
8 { \
9 rettype t0 = vaddl_ ## ts (vget_high_ ## ts (a), \
10 vget_high_ ## ts (c)); \
11 rettype t1 = vaddl_ ## ts (vget_high_ ## ts (b), \
12 vget_high_ ## ts (c)); \
13 return vaddq ## _ ## rs (t0, t1); \
14 }
15
16 TEST_ADDL (int16x8_t, int8x16_t, s8, s16)
17 TEST_ADDL (uint16x8_t, uint8x16_t, u8, u16)
18 TEST_ADDL (int32x4_t, int16x8_t, s16, s32)
19 TEST_ADDL (uint32x4_t, uint16x8_t, u16, u32)
20 TEST_ADDL (int64x2_t, int32x4_t, s32, s64)
21 TEST_ADDL (uint64x2_t, uint32x4_t, u32, u64)
22
23 #define TEST_ADDW(rettype, intype, intypel, ts, rs) \
24 rettype test_vaddw_ ## ts (intype a, intype b, intypel c) \
25 { \
26 rettype t0 = vaddw_ ## ts (a, vget_high_ ## ts (c)); \
27 rettype t1 = vaddw_ ## ts (b, vget_high_ ## ts (c)); \
28 return vaddq ## _ ## rs (t0, t1); \
29 }
30
31 TEST_ADDW (int16x8_t, int16x8_t, int8x16_t, s8, s16)
32 TEST_ADDW (uint16x8_t, uint16x8_t, uint8x16_t, u8, u16)
33 TEST_ADDW (int32x4_t, int32x4_t, int16x8_t, s16, s32)
34 TEST_ADDW (uint32x4_t, uint32x4_t, uint16x8_t, u16, u32)
35 TEST_ADDW (int64x2_t, int64x2_t, int32x4_t, s32, s64)
36 TEST_ADDW (uint64x2_t, uint64x2_t, uint32x4_t, u32, u64)
37
38 /* { dg-final { scan-assembler-not "dup\\t" } } */