blob: ecc02e652a4ba40e2fd68154ca8be5d322f43468 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O3" } */
#include <arm_neon.h>
#define TEST_MULL_VEC(name, rettype, intype, ts, rs) \
rettype test_ ## name ## _ ## ts (intype a, intype b, intype c) \
{ \
rettype t0 = name ## _ ## ts (vget_high_ ## ts (a), \
vget_high_ ## ts (c)); \
rettype t1 = name ## _ ## ts (vget_high_ ## ts (b), \
vget_high_ ## ts (c)); \
return vqaddq ## _ ## rs (t0, t1); \
}
TEST_MULL_VEC (vmull, int16x8_t, int8x16_t, s8, s16)
TEST_MULL_VEC (vmull, uint16x8_t, uint8x16_t, u8, u16)
TEST_MULL_VEC (vmull, int32x4_t, int16x8_t, s16, s32)
TEST_MULL_VEC (vmull, uint32x4_t, uint16x8_t, u16, u32)
TEST_MULL_VEC (vmull, int64x2_t, int32x4_t, s32, s64)
TEST_MULL_VEC (vmull, uint64x2_t, uint32x4_t, u32, u64)
TEST_MULL_VEC (vqdmull, int32x4_t, int16x8_t, s16, s32)
TEST_MULL_VEC (vqdmull, int64x2_t, int32x4_t, s32, s64)
#define TEST_MULL_N(name, rettype, intype, ts, rs) \
rettype test_ ## name ## _ ## ts (intype a, intype b, intype c) \
{ \
rettype t0 = name ## _ ## ts (vget_high_ ## ts (a), b[1]); \
rettype t1 = name ## _ ## ts (vget_high_ ## ts (a), c[1]); \
return vqaddq ## _ ## rs (t0, t1); \
}
TEST_MULL_N (vmull_n, int32x4_t, int16x8_t, s16, s32)
TEST_MULL_N (vmull_n, uint32x4_t, uint16x8_t, u16, u32)
TEST_MULL_N (vmull_n, int64x2_t, int32x4_t, s32, s64)
TEST_MULL_N (vmull_n, uint64x2_t, uint32x4_t, u32, u64)
TEST_MULL_N (vqdmull_n, int32x4_t, int16x8_t, s16, s32)
TEST_MULL_N (vqdmull_n, int64x2_t, int32x4_t, s32, s64)
#define TEST_MLXL_VEC(name, rettype, intype, ts) \
rettype test_ ## name ## _ ## ts (rettype acc, intype a, intype b, \
intype c) \
{ \
acc = name ## _ ## ts (acc, vget_high_ ## ts (a), \
vget_high_ ## ts (b)); \
return name ## _ ## ts (acc, vget_high_ ## ts (a), \
vget_high_ ## ts (c)); \
}
TEST_MLXL_VEC (vmlal, int16x8_t, int8x16_t, s8)
TEST_MLXL_VEC (vmlal, uint16x8_t, uint8x16_t, u8)
TEST_MLXL_VEC (vmlal, int32x4_t, int16x8_t, s16)
TEST_MLXL_VEC (vmlal, uint32x4_t, uint16x8_t, u16)
TEST_MLXL_VEC (vmlsl, int16x8_t, int8x16_t, s8)
TEST_MLXL_VEC (vmlsl, uint16x8_t, uint8x16_t, u8)
TEST_MLXL_VEC (vmlsl, int32x4_t, int16x8_t, s16)
TEST_MLXL_VEC (vmlsl, uint32x4_t, uint16x8_t, u16)
#define TEST_MLXL_N(name, rettype, intype, ts) \
rettype test_ ## name ## _ ## ts (rettype acc, intype a, intype b) \
{ \
acc = name ## _ ## ts (acc, vget_high_ ## ts (a), b[1]); \
return name ## _ ## ts (acc, vget_high_ ## ts (a), b[1]); \
}
TEST_MLXL_N (vmlal_n, int32x4_t, int16x8_t, s16)
TEST_MLXL_N (vmlal_n, uint32x4_t, uint16x8_t, u16)
TEST_MLXL_N (vmlal_n, int64x2_t, int32x4_t, s32)
TEST_MLXL_N (vmlal_n, uint64x2_t, uint32x4_t, u32)
TEST_MLXL_N (vmlsl_n, int32x4_t, int16x8_t, s16)
TEST_MLXL_N (vmlsl_n, uint32x4_t, uint16x8_t, u16)
TEST_MLXL_N (vmlsl_n, int64x2_t, int32x4_t, s32)
TEST_MLXL_N (vmlsl_n, uint64x2_t, uint32x4_t, u32)
TEST_MLXL_N (vqdmlal_n, int32x4_t, int16x8_t, s16)
TEST_MLXL_N (vqdmlal_n, int64x2_t, int32x4_t, s32)
TEST_MLXL_N (vqdmlsl_n, int32x4_t, int16x8_t, s16)
TEST_MLXL_N (vqdmlsl_n, int64x2_t, int32x4_t, s32)
/* { dg-final { scan-assembler-not "dup\\t" } } */