blob: c153775f0914072fb985b18516f110aded7dccd5 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O3" } */
#include <arm_neon.h>
#define TEST_MUL_UNIFORM(name, q, vectype, ts) \
vectype test_ ## name ## q ## _ ## ts (vectype a, vectype b, vectype c) \
{ \
vectype t0 = name ## q ## _n_ ## ts (a, c[1]); \
vectype t1 = name ## q ## _n_ ## ts (b, c[1]); \
return vmul ## q ## _ ## ts (t0, t1); \
}
TEST_MUL_UNIFORM (vmul, , int16x4_t, s16)
TEST_MUL_UNIFORM (vmul, , uint16x4_t, u16)
TEST_MUL_UNIFORM (vmul, , int32x2_t, s32)
TEST_MUL_UNIFORM (vmul, , uint32x2_t, u32)
TEST_MUL_UNIFORM (vmul, , float32x2_t, f32)
TEST_MUL_UNIFORM (vmul, q, int16x8_t, s16)
TEST_MUL_UNIFORM (vmul, q, uint16x8_t, u16)
TEST_MUL_UNIFORM (vmul, q, int32x4_t, s32)
TEST_MUL_UNIFORM (vmul, q, uint32x4_t, u32)
TEST_MUL_UNIFORM (vmul, q, float32x4_t, f32)
TEST_MUL_UNIFORM (vmul, q, float64x2_t, f64)
#define TEST_MLX_UNIFORM(name, q, vectype, ts) \
vectype test_ ## name ## q ## _ ## ts (vectype acc, vectype a, vectype b) \
{ \
acc = name ## q ## _n_ ## ts (acc, a, b[1]); \
return name ## q ## _n_ ## ts (acc, a, b[1]); \
}
TEST_MLX_UNIFORM (vmla, , int16x4_t, s16)
TEST_MLX_UNIFORM (vmla, , uint16x4_t, u16)
TEST_MLX_UNIFORM (vmla, , int32x2_t, s32)
TEST_MLX_UNIFORM (vmla, , uint32x2_t, u32)
TEST_MLX_UNIFORM (vmla, , float32x2_t, f32)
TEST_MLX_UNIFORM (vmla, q, int16x8_t, s16)
TEST_MLX_UNIFORM (vmla, q, uint16x8_t, u16)
TEST_MLX_UNIFORM (vmla, q, int32x4_t, s32)
TEST_MLX_UNIFORM (vmla, q, uint32x4_t, u32)
TEST_MLX_UNIFORM (vmla, q, float32x4_t, f32)
TEST_MLX_UNIFORM (vmls, , int16x4_t, s16)
TEST_MLX_UNIFORM (vmls, , uint16x4_t, u16)
TEST_MLX_UNIFORM (vmls, , int32x2_t, s32)
TEST_MLX_UNIFORM (vmls, , uint32x2_t, u32)
TEST_MLX_UNIFORM (vmls, , float32x2_t, f32)
TEST_MLX_UNIFORM (vmls, q, int16x8_t, s16)
TEST_MLX_UNIFORM (vmls, q, uint16x8_t, u16)
TEST_MLX_UNIFORM (vmls, q, int32x4_t, s32)
TEST_MLX_UNIFORM (vmls, q, uint32x4_t, u32)
TEST_MLX_UNIFORM (vmls, q, float32x4_t, f32)
#define TEST_MUL_LONG(name, rettype, intype, ts, rs) \
rettype test_ ## name ## ts (intype a, intype b, intype c) \
{ \
rettype t0 = name ## ts (a, c[1]); \
rettype t1 = name ## ts (b, c[1]); \
return vqaddq ## _ ## rs (t0, t1); \
}
TEST_MUL_LONG (vmull_n_, int32x4_t, int16x4_t, s16, s32)
TEST_MUL_LONG (vmull_n_, uint32x4_t, uint16x4_t, u16, u32)
TEST_MUL_LONG (vmull_n_, int64x2_t, int32x2_t, s32, s64)
TEST_MUL_LONG (vmull_n_, uint64x2_t, uint32x2_t, u32, u64)
TEST_MUL_LONG (vqdmull_n_, int32x4_t, int16x4_t, s16, s32)
TEST_MUL_LONG (vqdmull_n_, int64x2_t, int32x2_t, s32, s64)
#define TEST_MLX_LONG(name, rettype, intype, ts, rs) \
rettype test_ ## name ## _ ## ts (rettype acc, intype a, intype b) \
{ \
acc = name ## ts (acc, a, b[1]); \
return name ## ts (acc, a, b[1]); \
}
TEST_MLX_LONG (vmlal_n_, int32x4_t, int16x4_t, s16, s32)
TEST_MLX_LONG (vmlal_n_, uint32x4_t, uint16x4_t, u16, u32)
TEST_MLX_LONG (vmlal_n_, int64x2_t, int32x2_t, s32, s64)
TEST_MLX_LONG (vmlal_n_, uint64x2_t, uint32x2_t, u32, u64)
TEST_MLX_LONG (vmlsl_n_, int32x4_t, int16x4_t, s16, s32)
TEST_MLX_LONG (vmlsl_n_, uint32x4_t, uint16x4_t, u16, u32)
TEST_MLX_LONG (vmlsl_n_, int64x2_t, int32x2_t, s32, s64)
TEST_MLX_LONG (vmlsl_n_, uint64x2_t, uint32x2_t, u32, u64)
TEST_MLX_LONG (vqdmlal_n_, int32x4_t, int16x4_t, s16, s32)
TEST_MLX_LONG (vqdmlal_n_, int64x2_t, int32x2_t, s32, s64)
TEST_MLX_LONG (vqdmlsl_n_, int32x4_t, int16x4_t, s16, s32)
TEST_MLX_LONG (vqdmlsl_n_, int64x2_t, int32x2_t, s32, s64)
/* { dg-final { scan-assembler-not "dup\\t" } } */