On 09/11/16 10:12, Andre Vieira (lists) wrote: > Hi, > > This patch implements support for the ARM ACLE Coprocessor MCR and MRC > intrinsics. See below a table mapping the intrinsics to their respective > instructions: > > +-------------------------------------------------------------------+---------------------------------------+ > | Intrinsic signature | > Instruction pattern | > +-------------------------------------------------------------------+---------------------------------------+ > |void __arm_mcrr(coproc, opc1, uint64_t value, CRm) | > MCRR coproc, opc1, Rt, Rt2, CRm | > +-------------------------------------------------------------------+---------------------------------------+ > |void __arm_mcrr2(coproc, opc1, uint64_t value, CRm) | > MCRR2 coproc, opc1, Rt, Rt2, CRm | > +-------------------------------------------------------------------+---------------------------------------+ > |uint64_t __arm_mrrc(coproc, opc1, CRm) | > MRRC coproc, opc1, Rt, Rt2, CRm | > +-------------------------------------------------------------------+---------------------------------------+ > |uint64_t __arm_mrrc2(coproc, opc1, CRm) | > MRRC2 coproc, opc1, Rt, Rt2, CRm | > +-------------------------------------------------------------------+---------------------------------------+ > Note that any untyped variable in the intrinsic signature is required to > be a compiler-time constant and has the type 'unsigned int'. We do some > boundary checks for coproc:[0-15], opc1[0-7] CR*:[0-31]. If either of > these requirements are not met a diagnostic is issued. > > I added a new arm_arch variable for ARMv5TE to use when deciding whether > or not the MCRR and MRCC intrinsics are available. > > Is this OK for trunk? > > Regards, > Andre > > gcc/ChangeLog: > 2016-11-09 Andre Vieira <andre.simoesdiasvie...@arm.com> > > * config/arm/arm.md (<mcrr>): New. > (<mrrc>): New. > * config/arm/arm.c (arm_arch5te): New. > (arm_option_override): Set arm_arch5te. > (arm_coproc_builtin_available): Add support for mcrr, mcrr2, mrrc > and mrrc2. > * config/arm/arm-builtins.c (MCRR_QUALIFIERS): Define to... > (arm_mcrr_qualifiers): ... this. New. > (MRRC_QUALIFIERS): Define to... > (arm_mrrc_qualifiers): ... this. New. > * config/arm/arm_acle.h (__arm_mcrr, __arm_mcrr2, __arm_mrrc, > __arm_mrrc2): New. > * config/arm/arm_acle_builtins.def (mcrr, mcrr2, mrrc, mrrc2): New. > * config/arm/iterators.md (MCRRI, mcrr, MCRR): New. > (MRRCI, mrrc, MRRC): New. > * config/arm/unspecs.md (VUNSPEC_MCRR, VUNSPEC_MCRR2, VUNSPEC_MRRC, > VUNSPEC_MRRC2): New. > > gcc/testsuite/ChangeLog: > > 2016-11-09 Andre Vieira <andre.simoesdiasvie...@arm.com> > > * gcc.target/arm/acle/mcrr: New. > * gcc.target/arm/acle/mcrr2: New. > * gcc.target/arm/acle/mrrc: New. > * gcc.target/arm/acle/mrrc2: New. > Hi,
I realize I forgot to mention that for these intrinsics 'Rt' will hold the low half and 'Rt2' the higher half of either the argument 'value' for MCRR{,2} or the return value for MRRC{,2}. Cheers, Andre