Hi all,

This patch reimplements the vaddlv* intrinsics using builtins.
The vaddlv_s32 and vaddlv_u32 intrinsics actually perform a pairwise 
SADDLP/UADDLP
instead of a SADDLV/UADDLV but because they only use two elements it has the 
same semantics.

Bootstrapped and tested on aarch64-none-linux-gnu and aarch64_be-none-elf.
Pushing to trunk.
Thanks,
Kyrill

gcc/ChangeLog:

        * config/aarch64/aarch64-simd-builtins.def (saddlv, uaddlv):
        Define builtins.
        * config/aarch64/aarch64-simd.md (aarch64_<su>addlv<mode>): Define.
        * config/aarch64/arm_neon.h (vaddlv_s8): Reimplement using builtin.
        (vaddlv_s16): Likewise.
        (vaddlv_u8): Likewise.
        (vaddlv_u16): Likewise.
        (vaddlvq_s8): Likewise.
        (vaddlvq_s16): Likewise.
        (vaddlvq_s32): Likewise.
        (vaddlvq_u8): Likewise.
        (vaddlvq_u16): Likewise.
        (vaddlvq_u32): Likewise.
        (vaddlv_s32): Likewise.
        (vaddlv_u32): Likewise.
        * config/aarch64/iterators.md (VDQV_L): New mode iterator.
        (unspec): Add UNSPEC_SADDLV, UNSPEC_UADDLV.
        (Vwstype): New mode attribute.
        (Vwsuf): Likewise.
        (VWIDE_S): Likewise.
        (USADDLV): New int iterator.
        (su): Handle UNSPEC_SADDLV, UNSPEC_UADDLV.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/simd/vaddlv_1.c: New test.

Attachment: addlv.patch
Description: addlv.patch

Reply via email to