<div dir="ltr">From the comment in the code in X86ISelLowering that did this.<div><br></div><div><div>    // If the value returned by RDRAND/RDSEED was valid (CF=1), return 1.</div><div>    // Otherwise return the value from Rand, which is always 0, casted to i32.</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 24, 2014 at 4:39 PM, Xin Li <span dir="ltr"><<a href="mailto:delphij@delphij.net" target="_blank">delphij@delphij.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I wrote a small test program that uses the _rdrand64_step intrinsic,<br>
where I think I might have hit a bug with clang.<br>
<br>
The core portion of the program is:<br>
<br>
static inline int<br>
ivy_rng_store(long *buf)<br>
{<br>
        unsigned long long tmp;<br>
        int retry;<br>
<br>
        retry = RETRY_COUNT;<br>
        do {<br>
                if (_rdrand64_step(&tmp) == 1) {<br>
                        *buf = (long)tmp;<br>
                        break;<br>
                }<br>
                retry--;<br>
        } while (retry > 0);<br>
<br>
        return (retry);<br>
}<br>
<br>
When compiled with -O0, I got:<br>
<br>
00000000004009b0 <ivy_rng_store>:<br>
  4009b0:       55                      push   %rbp<br>
  4009b1:       48 89 e5                mov    %rsp,%rbp<br>
  4009b4:       48 89 7d f0             mov    %rdi,-0x10(%rbp)<br>
  4009b8:       c7 45 e4 0a 00 00 00    movl   $0xa,-0x1c(%rbp)<br>
  4009bf:       48 8d 45 e8             lea    -0x18(%rbp),%rax<br>
  4009c3:       48 89 45 f8             mov    %rax,-0x8(%rbp)<br>
  4009c7:       48 8b 45 f8             mov    -0x8(%rbp),%rax<br>
  4009cb:       48 0f c7 f1             rdrand %rcx<br>
  4009cf:       89 ca                   mov    %ecx,%edx  # ???<br>
  4009d1:       be 01 00 00 00          mov    $0x1,%esi<br>
  4009d6:       0f 42 d6                cmovb  %esi,%edx<br>
  4009d9:       48 89 08                mov    %rcx,(%rax)<br>
  4009dc:       81 fa 01 00 00 00       cmp    $0x1,%edx<br>
  4009e2:       0f 85 10 00 00 00       jne    4009f8 <ivy_rng_store+0x48><br>
  4009e8:       48 8b 45 e8             mov    -0x18(%rbp),%rax<br>
  4009ec:       48 8b 4d f0             mov    -0x10(%rbp),%rcx<br>
  4009f0:       48 89 01                mov    %rax,(%rcx)<br>
  4009f3:       e9 18 00 00 00          jmpq   400a10 <ivy_rng_store+0x60><br>
  4009f8:       8b 45 e4                mov    -0x1c(%rbp),%eax<br>
  4009fb:       05 ff ff ff ff          add    $0xffffffff,%eax<br>
  400a00:       89 45 e4                mov    %eax,-0x1c(%rbp)<br>
  400a03:       81 7d e4 00 00 00 00    cmpl   $0x0,-0x1c(%rbp)<br>
  400a0a:       0f 8f af ff ff ff       jg     4009bf <ivy_rng_store+0xf><br>
  400a10:       8b 45 e4                mov    -0x1c(%rbp),%eax<br>
  400a13:       5d                      pop    %rbp<br>
  400a14:       c3                      retq<br>
<br>
It seems that, as the # ??? line suggests, that the compiler assumes<br>
%ecx after rdrand %rcx would never be 1?<br>
<br>
Version:<br>
<br>
FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512<br>
Target: x86_64-unknown-freebsd11.0<br>
Thread model: posix<br>
<br>
Options used:<br>
<br>
-O2 -pipe   -mrdrnd -mmmx -O0 -std=gnu99 -fstack-protector<br>
-Qunused-arguments<br>
<br>
Thanks in advance!<br>
<br>
Cheers,<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>~Craig
</div>