Hello,

This patch supports following MVE ACLE intrinsics with unary operand.

vdupq_n_s8, vdupq_n_s16, vdupq_n_s32, vabsq_s8, vabsq_s16, vabsq_s32, vclsq_s8, 
vclsq_s16, vclsq_s32, vclzq_s8, vclzq_s16, vclzq_s32, vnegq_s8, vnegq_s16, 
vnegq_s32, vaddlvq_s32, vaddvq_s8, vaddvq_s16, vaddvq_s32, vmovlbq_s8, 
vmovlbq_s16, vmovltq_s8, vmovltq_s16, vmvnq_s8, vmvnq_s16, vmvnq_s32, 
vrev16q_s8, vrev32q_s8, vrev32q_s16, vqabsq_s8, vqabsq_s16, vqabsq_s32, 
vqnegq_s8, vqnegq_s16, vqnegq_s32, vcvtaq_s16_f16, vcvtaq_s32_f32, 
vcvtnq_s16_f16, vcvtnq_s32_f32, vcvtpq_s16_f16, vcvtpq_s32_f32, vcvtmq_s16_f16, 
vcvtmq_s32_f32, vmvnq_u8, vmvnq_u16, vmvnq_u32, vdupq_n_u8, vdupq_n_u16, 
vdupq_n_u32, vclzq_u8, vclzq_u16, vclzq_u32, vaddvq_u8, vaddvq_u16, vaddvq_u32, 
vrev32q_u8, vrev32q_u16, vmovltq_u8, vmovltq_u16, vmovlbq_u8, vmovlbq_u16, 
vrev16q_u8, vaddlvq_u32, vcvtpq_u16_f16, vcvtpq_u32_f32, vcvtnq_u16_f16, 
vcvtmq_u16_f16, vcvtmq_u32_f32, vcvtaq_u16_f16, vcvtaq_u32_f32, vdupq_n, vabsq, 
vclsq, vclzq, vnegq, vaddlvq, vaddvq, vmovlbq, vmovltq, vmvnq, vrev16q, 
vrev32q, vqabsq, vqnegq.

A new register class "EVEN_REGS" which allows only even registers is added in 
this patch.

The new constraint "e" allows only reigsters of EVEN_REGS class.

Please refer to M-profile Vector Extension (MVE) intrinsics [1]  for more 
details.
[1] 
https://developer.arm.com/architectures/instruction-sets/simd-isas/helium/mve-intrinsics

Regression tested on arm-none-eabi and found no regressions.

Ok for trunk?

Thanks,
Srinath.

gcc/ChangeLog:

2019-10-21  Andre Vieira  <andre.simoesdiasvie...@arm.com>
            Mihail Ionescu  <mihail.ione...@arm.com>
            Srinath Parvathaneni  <srinath.parvathan...@arm.com>

        * config/arm/arm.h (enum reg_class): Define new class EVEN_REGS.
        * config/arm/arm_mve.h (vdupq_n_s8): Define macro.
        (vdupq_n_s16): Likewise.
        (vdupq_n_s32): Likewise.
        (vabsq_s8): Likewise.
        (vabsq_s16): Likewise.
        (vabsq_s32): Likewise.
        (vclsq_s8): Likewise.
        (vclsq_s16): Likewise.
        (vclsq_s32): Likewise.
        (vclzq_s8): Likewise.
        (vclzq_s16): Likewise.
        (vclzq_s32): Likewise.
        (vnegq_s8): Likewise.
        (vnegq_s16): Likewise.
        (vnegq_s32): Likewise.
        (vaddlvq_s32): Likewise.
        (vaddvq_s8): Likewise.
        (vaddvq_s16): Likewise.
        (vaddvq_s32): Likewise.
        (vmovlbq_s8): Likewise.
        (vmovlbq_s16): Likewise.
        (vmovltq_s8): Likewise.
        (vmovltq_s16): Likewise.
        (vmvnq_s8): Likewise.
        (vmvnq_s16): Likewise.
        (vmvnq_s32): Likewise.
        (vrev16q_s8): Likewise.
        (vrev32q_s8): Likewise.
        (vrev32q_s16): Likewise.
        (vqabsq_s8): Likewise.
        (vqabsq_s16): Likewise.
        (vqabsq_s32): Likewise.
        (vqnegq_s8): Likewise.
        (vqnegq_s16): Likewise.
        (vqnegq_s32): Likewise.
        (vcvtaq_s16_f16): Likewise.
        (vcvtaq_s32_f32): Likewise.
        (vcvtnq_s16_f16): Likewise.
        (vcvtnq_s32_f32): Likewise.
        (vcvtpq_s16_f16): Likewise.
        (vcvtpq_s32_f32): Likewise.
        (vcvtmq_s16_f16): Likewise.
        (vcvtmq_s32_f32): Likewise.
        (vmvnq_u8): Likewise.
        (vmvnq_u16): Likewise.
        (vmvnq_u32): Likewise.
        (vdupq_n_u8): Likewise.
        (vdupq_n_u16): Likewise.
        (vdupq_n_u32): Likewise.
        (vclzq_u8): Likewise.
        (vclzq_u16): Likewise.
        (vclzq_u32): Likewise.
        (vaddvq_u8): Likewise.
        (vaddvq_u16): Likewise.
        (vaddvq_u32): Likewise.
        (vrev32q_u8): Likewise.
        (vrev32q_u16): Likewise.
        (vmovltq_u8): Likewise.
        (vmovltq_u16): Likewise.
        (vmovlbq_u8): Likewise.
        (vmovlbq_u16): Likewise.
        (vrev16q_u8): Likewise.
        (vaddlvq_u32): Likewise.
        (vcvtpq_u16_f16): Likewise.
        (vcvtpq_u32_f32): Likewise.
        (vcvtnq_u16_f16): Likewise.
        (vcvtmq_u16_f16): Likewise.
        (vcvtmq_u32_f32): Likewise.
        (vcvtaq_u16_f16): Likewise.
        (vcvtaq_u32_f32): Likewise.
        (__arm_vdupq_n_s8): Define intrinsic.
        (__arm_vdupq_n_s16): Likewise.
        (__arm_vdupq_n_s32): Likewise.
        (__arm_vabsq_s8): Likewise.
        (__arm_vabsq_s16): Likewise.
        (__arm_vabsq_s32): Likewise.
        (__arm_vclsq_s8): Likewise.
        (__arm_vclsq_s16): Likewise.
        (__arm_vclsq_s32): Likewise.
        (__arm_vclzq_s8): Likewise.
        (__arm_vclzq_s16): Likewise.
        (__arm_vclzq_s32): Likewise.
        (__arm_vnegq_s8): Likewise.
        (__arm_vnegq_s16): Likewise.
        (__arm_vnegq_s32): Likewise.
        (__arm_vaddlvq_s32): Likewise.
        (__arm_vaddvq_s8): Likewise.
        (__arm_vaddvq_s16): Likewise.
        (__arm_vaddvq_s32): Likewise.
        (__arm_vmovlbq_s8): Likewise.
        (__arm_vmovlbq_s16): Likewise.
        (__arm_vmovltq_s8): Likewise.
        (__arm_vmovltq_s16): Likewise.
        (__arm_vmvnq_s8): Likewise.
        (__arm_vmvnq_s16): Likewise.
        (__arm_vmvnq_s32): Likewise.
        (__arm_vrev16q_s8): Likewise.
        (__arm_vrev32q_s8): Likewise.
        (__arm_vrev32q_s16): Likewise.
        (__arm_vqabsq_s8): Likewise.
        (__arm_vqabsq_s16): Likewise.
        (__arm_vqabsq_s32): Likewise.
        (__arm_vqnegq_s8): Likewise.
        (__arm_vqnegq_s16): Likewise.
        (__arm_vqnegq_s32): Likewise.
        (__arm_vmvnq_u8): Likewise.
        (__arm_vmvnq_u16): Likewise.
        (__arm_vmvnq_u32): Likewise.
        (__arm_vdupq_n_u8): Likewise.
        (__arm_vdupq_n_u16): Likewise.
        (__arm_vdupq_n_u32): Likewise.
        (__arm_vclzq_u8): Likewise.
        (__arm_vclzq_u16): Likewise.
        (__arm_vclzq_u32): Likewise.
        (__arm_vaddvq_u8): Likewise.
        (__arm_vaddvq_u16): Likewise.
        (__arm_vaddvq_u32): Likewise.
        (__arm_vrev32q_u8): Likewise.
        (__arm_vrev32q_u16): Likewise.
        (__arm_vmovltq_u8): Likewise.
        (__arm_vmovltq_u16): Likewise.
        (__arm_vmovlbq_u8): Likewise.
        (__arm_vmovlbq_u16): Likewise.
        (__arm_vrev16q_u8): Likewise.
        (__arm_vaddlvq_u32): Likewise.
        (__arm_vcvtpq_u16_f16): Likewise.
        (__arm_vcvtpq_u32_f32): Likewise.
        (__arm_vcvtnq_u16_f16): Likewise.
        (__arm_vcvtmq_u16_f16): Likewise.
        (__arm_vcvtmq_u32_f32): Likewise.
        (__arm_vcvtaq_u16_f16): Likewise.
        (__arm_vcvtaq_u32_f32): Likewise.
        (__arm_vcvtaq_s16_f16): Likewise.
        (__arm_vcvtaq_s32_f32): Likewise.
        (__arm_vcvtnq_s16_f16): Likewise.
        (__arm_vcvtnq_s32_f32): Likewise.
        (__arm_vcvtpq_s16_f16): Likewise.
        (__arm_vcvtpq_s32_f32): Likewise.
        (__arm_vcvtmq_s16_f16): Likewise.
        (__arm_vcvtmq_s32_f32): Likewise.
        (vdupq_n): Define polymorphic variant.
        (vabsq): Likewise.
        (vclsq): Likewise.
        (vclzq): Likewise.
        (vnegq): Likewise.
        (vaddlvq): Likewise.
        (vaddvq): Likewise.
        (vmovlbq): Likewise.
        (vmovltq): Likewise.
        (vmvnq): Likewise.
        (vrev16q): Likewise.
        (vrev32q): Likewise.
        (vqabsq): Likewise.
        (vqnegq): Likewise.
        * config/arm/arm_mve_builtins.def (UNOP_SNONE_SNONE): Use it.
        (UNOP_SNONE_NONE): Likewise.
        (UNOP_UNONE_UNONE): Likewise.
        (UNOP_UNONE_NONE): Likewise.
        * config/arm/constraints.md (e): Define new constriant to allow only
        even registers.
        * config/arm/mve.md (mve_vqabsq_s<mode>): Define RTL pattern.
        (mve_vnegq_s<mode>): Likewise.
        (mve_vmvnq_<supf><mode>): Likewise.
        (mve_vdupq_n_<supf><mode>): Likewise.
        (mve_vclzq_<supf><mode>): Likewise.
        (mve_vclsq_s<mode>): Likewise.
        (mve_vaddvq_<supf><mode>): Likewise.
        (mve_vabsq_s<mode>): Likewise.
        (mve_vrev32q_<supf><mode>): Likewise.
        (mve_vmovltq_<supf><mode>): Likewise.
        (mve_vmovlbq_<supf><mode>): Likewise.
        (mve_vcvtpq_<supf><mode>): Likewise.
        (mve_vcvtnq_<supf><mode>): Likewise.
        (mve_vcvtmq_<supf><mode>): Likewise.
        (mve_vcvtaq_<supf><mode>): Likewise.
        (mve_vrev16q_<supf>v16qi): Likewise.
        (mve_vaddlvq_<supf>v4si): Likewise.

gcc/testsuite/ChangeLog:

2019-10-21  Andre Vieira  <andre.simoesdiasvie...@arm.com>
            Mihail Ionescu  <mihail.ione...@arm.com>
            Srinath Parvathaneni  <srinath.parvathan...@arm.com>

        * gcc.target/arm/mve/intrinsics/vabsq_s16.c: New test.
        * gcc.target/arm/mve/intrinsics/vabsq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vabsq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddlvq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddlvq_u32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddvq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddvq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddvq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddvq_u16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddvq_u32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vaddvq_u8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclsq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclsq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclsq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclzq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclzq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclzq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclzq_u16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclzq_u32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vclzq_u8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtaq_s16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtaq_s32_f32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtaq_u16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtaq_u32_f32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtmq_s16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtmq_s32_f32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtmq_u16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtmq_u32_f32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtnq_s16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtnq_s32_f32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtnq_u16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtpq_s16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtpq_s32_f32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtpq_u16_f16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vcvtpq_u32_f32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vdupq_n_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vdupq_n_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vdupq_n_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vdupq_n_u16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vdupq_n_u32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vdupq_n_u8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovlbq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovlbq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovlbq_u16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovlbq_u8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovltq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovltq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovltq_u16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmovltq_u8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmvnq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmvnq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmvnq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmvnq_u16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmvnq_u32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vmvnq_u8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vnegq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vnegq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vnegq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vqabsq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vqabsq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vqabsq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vqnegq_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vqnegq_s32.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vqnegq_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vrev16q_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vrev16q_u8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vrev32q_s16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vrev32q_s8.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vrev32q_u16.c: Likewise.
        * gcc.target/arm/mve/intrinsics/vrev32q_u8.c: Likewise.

Attachment: diff06.patch.gz
Description: diff06.patch.gz

Reply via email to