https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71233

--- Comment #43 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-8 branch has been updated by Kyrylo Tkachov
<ktkac...@gcc.gnu.org>:

https://gcc.gnu.org/g:26020c849802a03f7a0634636d752ffbc7729096

commit r8-10535-g26020c849802a03f7a0634636d752ffbc7729096
Author: Kyrylo Tkachov <kyrylo.tkac...@arm.com>
Date:   Mon Oct 21 10:52:05 2019 +0000

    AArch64: Implement __rndr, __rndrrs intrinsics

    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.

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

    gcc/
            PR target/71233
            * 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.
            (AARCH64_FL_RNG): Likewise.
            * config/aarch64/aarch64-option-extensions.def (rng): Define.
            * config/aarch64/aarch64-builtins.c (enum aarch64_builtins):
            Add AARCH64_BUILTIN_RNG_RNDR, AARCH64_BUILTIN_RNG_RNDRRS.
            (aarch64_init_rng_builtins): Define.
            (aarch64_init_builtins): Call aarch64_init_rng_builtins.
            (aarch64_expand_rng_builtin): Define.
            (aarch64_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.

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

Reply via email to