[cfe-dev] rdrand intrinsic under -O0

Craig Topper craig.topper at gmail.com
Fri Oct 24 23:04:25 PDT 2014


>From the comment in the code in X86ISelLowering that did this.

    // If the value returned by RDRAND/RDSEED was valid (CF=1), return 1.
    // Otherwise return the value from Rand, which is always 0, casted to
i32.

On Fri, Oct 24, 2014 at 4:39 PM, Xin Li <delphij at delphij.net> wrote:

> Hi,
>
> I wrote a small test program that uses the _rdrand64_step intrinsic,
> where I think I might have hit a bug with clang.
>
> The core portion of the program is:
>
> static inline int
> ivy_rng_store(long *buf)
> {
>         unsigned long long tmp;
>         int retry;
>
>         retry = RETRY_COUNT;
>         do {
>                 if (_rdrand64_step(&tmp) == 1) {
>                         *buf = (long)tmp;
>                         break;
>                 }
>                 retry--;
>         } while (retry > 0);
>
>         return (retry);
> }
>
> When compiled with -O0, I got:
>
> 00000000004009b0 <ivy_rng_store>:
>   4009b0:       55                      push   %rbp
>   4009b1:       48 89 e5                mov    %rsp,%rbp
>   4009b4:       48 89 7d f0             mov    %rdi,-0x10(%rbp)
>   4009b8:       c7 45 e4 0a 00 00 00    movl   $0xa,-0x1c(%rbp)
>   4009bf:       48 8d 45 e8             lea    -0x18(%rbp),%rax
>   4009c3:       48 89 45 f8             mov    %rax,-0x8(%rbp)
>   4009c7:       48 8b 45 f8             mov    -0x8(%rbp),%rax
>   4009cb:       48 0f c7 f1             rdrand %rcx
>   4009cf:       89 ca                   mov    %ecx,%edx  # ???
>   4009d1:       be 01 00 00 00          mov    $0x1,%esi
>   4009d6:       0f 42 d6                cmovb  %esi,%edx
>   4009d9:       48 89 08                mov    %rcx,(%rax)
>   4009dc:       81 fa 01 00 00 00       cmp    $0x1,%edx
>   4009e2:       0f 85 10 00 00 00       jne    4009f8 <ivy_rng_store+0x48>
>   4009e8:       48 8b 45 e8             mov    -0x18(%rbp),%rax
>   4009ec:       48 8b 4d f0             mov    -0x10(%rbp),%rcx
>   4009f0:       48 89 01                mov    %rax,(%rcx)
>   4009f3:       e9 18 00 00 00          jmpq   400a10 <ivy_rng_store+0x60>
>   4009f8:       8b 45 e4                mov    -0x1c(%rbp),%eax
>   4009fb:       05 ff ff ff ff          add    $0xffffffff,%eax
>   400a00:       89 45 e4                mov    %eax,-0x1c(%rbp)
>   400a03:       81 7d e4 00 00 00 00    cmpl   $0x0,-0x1c(%rbp)
>   400a0a:       0f 8f af ff ff ff       jg     4009bf <ivy_rng_store+0xf>
>   400a10:       8b 45 e4                mov    -0x1c(%rbp),%eax
>   400a13:       5d                      pop    %rbp
>   400a14:       c3                      retq
>
> It seems that, as the # ??? line suggests, that the compiler assumes
> %ecx after rdrand %rcx would never be 1?
>
> Version:
>
> FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512
> Target: x86_64-unknown-freebsd11.0
> Thread model: posix
>
> Options used:
>
> -O2 -pipe   -mrdrnd -mmmx -O0 -std=gnu99 -fstack-protector
> -Qunused-arguments
>
> Thanks in advance!
>
> Cheers,
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>



-- 
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141024/0df1b474/attachment.html>


More information about the cfe-dev mailing list