Hi Matthew, > -----Original Message----- > From: Matthew Malcomson <matthew.malcom...@arm.com> > Sent: 08 April 2020 09:22 > To: gcc-patches@gcc.gnu.org > Cc: nd <n...@arm.com>; Kyrylo Tkachov <kyrylo.tkac...@arm.com>; > Ramana Radhakrishnan <ramana.radhakrish...@arm.com>; Richard > Earnshaw <richard.earns...@arm.com>; ni...@redhat.com > Subject: [Arm] Implement CDE intrinsics for MVE registers. > > > This patch updates the previous one by rebasing onto the recent MVE > patches on > trunk. > > Implement CDE intrinsics on MVE registers. > > Other than the basics required for adding intrinsics this patch consists > of three changes. > > ** We separate out the MVE types and casts from the arm_mve.h header. > > This is so that the types can be used in arm_cde.h without the need to > include > the entire arm_mve.h header. > The only type that arm_cde.h needs is `uint8x16_t`, so this separation could > be > avoided by using a `typedef` in this file. > Since the introduced intrinsics are all defined to act on the full range of > MVE > types, declaring all such types seems intuitive since it will provide their > declaration to the user too. > > This arm_mve_types.h header not only includes the MVE types, but also > the conversion intrinsics between them. > Some of the conversion intrinsics are needed for arm_cde.h, but most are > not. We include all conversion intrinsics to keep the definition of > such conversion functions all in one place, on the understanding that > extra conversion functions being defined when including `arm_cde.h` is > not a problem. > > ** We define the TARGET_RESOLVE_OVERLOADED_BUILTIN hook for the > Arm backend. > > This is needed to implement the polymorphism for the required intrinsics. > The intrinsics have no specialised version, and the resulting assembly > instruction for all different types should be exactly the same. > Due to this we have implemented these intrinsics via one builtin on one type. > All other calls to the intrinsic with different types are implicitly cast to > the one type that is defined, and hence are all expanded to the same RTL > pattern that is only defined for one machine mode. > > ** We seperate the initialisation of the CDE intrinsics from others. > > This allows us to ensure that the CDE intrinsics acting on MVE registers > are only created when both CDE and MVE are available. > Only initialising these builtins when both features are available is > especially important since they require a type that is only initialised > when the target supports hard float. Hence trying to initialise these > builtins on a soft float target would cause an ICE. > > Testing done: > Full bootstrap and regtest on arm-none-linux-gnueabihf > Regression test on arm-none-eabi > > > NOTE: This patch depends on the CDE intrinsic framework patch by Dennis. > https://gcc.gnu.org/pipermail/gcc-patches/2020-March/542008.html > > > Ok for trunk?
Ok. Thanks, Kyrill > > gcc/ChangeLog: > > 2020-04-08 Matthew Malcomson <matthew.malcom...@arm.com> > > * config.gcc (arm_mve_types.h): New extra_header for arm. > * config/arm/arm-builtins.c (arm_resolve_overloaded_builtin): New. > (arm_init_cde_builtins): New. > (arm_init_acle_builtins): Remove initialisation of CDE builtins. > (arm_init_builtins): Call arm_init_cde_builtins when target > supports CDE. > * config/arm/arm-c.c (arm_resolve_overloaded_builtin): New > declaration. > (arm_register_target_pragmas): Initialise resolve_overloaded_builtin > hook to the implementation for the arm backend. > * config/arm/arm.h (ARM_MVE_CDE_CONST_1): New. > (ARM_MVE_CDE_CONST_2): New. > (ARM_MVE_CDE_CONST_3): New. > * config/arm/arm_cde.h (__arm_vcx1q_u8): New. > (__arm_vcx1qa): New. > (__arm_vcx2q): New. > (__arm_vcx2q_u8): New. > (__arm_vcx2qa): New. > (__arm_vcx3q): New. > (__arm_vcx3q_u8): New. > (__arm_vcx3qa): New. > * config/arm/arm_cde_builtins.def (vcx1q, vcx1qa, vcx2q, vcx2qa, > vcx3q, > vcx3qa): New builtins defined. > * config/arm/arm_mve.h: Move typedefs and conversion intrinsics > to arm_mve_types.h header. > * config/arm/arm_mve_types.h: New file. > * config/arm/mve.md (arm_vcx1qv16qi, arm_vcx1qav16qi, > arm_vcx2qv16qi, > arm_vcx2qav16qi, arm_vcx3qv16qi, arm_vcx3qav16qi): New patterns. > * config/arm/predicates.md (const_int_mve_cde1_operand, > const_int_mve_cde2_operand, const_int_mve_cde3_operand): New. > > gcc/testsuite/ChangeLog: > > 2020-04-08 Matthew Malcomson <matthew.malcom...@arm.com> > Dennis Zhang <dennis.zh...@arm.com> > > * gcc.target/arm/acle/cde-mve-error-1.c: New test. > * gcc.target/arm/acle/cde-mve-error-2.c: New test. > * gcc.target/arm/acle/cde-mve-error-3.c: New test. > * gcc.target/arm/acle/cde-mve-full-assembly.c: New test. > * gcc.target/arm/acle/cde-mve-tests.c: New test. > * lib/target-supports.exp (arm_v8_1m_main_cde_mve_fp): New > check > effective.