[cfe-dev] rdrand intrinsic under -O0
Xin Li
delphij at delphij.net
Fri Oct 24 16:39:42 PDT 2014
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,
More information about the cfe-dev
mailing list