Viewing file: vmul_high_cost.c (3.07 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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" } } */
|