<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>