[PATCH][AArch64] Implement __rndr, __rndrrs intrinsics

Kyrill Tkachov kyrylo.tkachov@foss.arm.com
Mon Oct 21 10:06:00 GMT 2019


Hi all,

This patch implements the recently published[1] __rndr and __rndrrs 
intrinsics used to access the RNG in Armv8.5-A.
The __rndrrs intrinsics can be used to reseed the generator too.
They are guarded by the __ARM_FEATURE_RNG feature macro.
A quirk with these intrinsics is that they store the random number in 
their pointer argument and return a status
code if the generation succeeded.

The instructions themselves write the CC flags indicating the success of 
the operation that we can then read with a CSET.
Therefore this implementation makes use of the IGNORE indicator to the 
builtin expand machinery to avoid generating
the CSET if its result is unused (the CC reg clobbering effect is still 
reflected in the pattern).
I've checked that using unspec_volatile prevents undesirable CSEing of 
the instructions.

Bootstrapped and tested on aarch64-none-linux-gnu.

Committing to trunk.
Thanks,
Kyrill

[1] https://developer.arm.com/docs/101028/latest/data-processing-intrinsics


2019-10-21  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * config/aarch64/aarch64.md (UNSPEC_RNDR, UNSPEC_RNDRRS): Define.
     (aarch64_rndr): New define_insn.
     (aarch64_rndrrs): Likewise.
     * config/aarch64/aarch64.h (AARCH64_ISA_RNG): Define.
     (TARGET_RNG): Likewise.
     * config/aarch64/aarch64.c (aarch64_expand_builtin): Use IGNORE
     argument.
     * config/aarch64/aarch64-protos.h (aarch64_general_expand_builtin):
     Add fourth argument in prototype.
     * config/aarch64/aarch64-builtins.c (enum aarch64_builtins):
     Add AARCH64_BUILTIN_RNG_RNDR, AARCH64_BUILTIN_RNG_RNDRRS.
     (aarch64_init_rng_builtins): Define.
     (aarch64_general_init_builtins): Call aarch64_init_rng_builtins.
     (aarch64_expand_rng_builtin): Define.
     (aarch64_general_expand_builtin): Use IGNORE argument, handle
     RNG builtins.
     * config/aarch64/aarch64-c.c (aarch64_update_cpp_builtins): Define
     __ARM_FEATURE_RNG when TARGET_RNG.
     * config/aarch64/arm_acle.h (__rndr, __rndrrs): Define.

2019-10-21  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * gcc.target/aarch64/acle/rng_1.c: New test.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: aarch64-rnd.patch
Type: text/x-patch
Size: 10727 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20191021/4f582001/attachment.bin>


More information about the Gcc-patches mailing list