Hi Andre,

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?

Same as with the previous two patches the define_insns need constraints
and also I believe you'll want to rebase this patch on top of Richard's rework 
of the
architecture feature bits for the ARMv5TE hunk.

Thanks,
Kyrill

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.


Reply via email to