Add intrinsics for Ivy Bridge's rdrand instruction.
[oota-llvm.git] / test / CodeGen / X86 / rdrand.ll
1 ; RUN: llc < rdrand.ll -march=x86-64 -mattr=+rdrand | FileCheck %s
2 declare {i16, i32} @llvm.x86.rdrand.16()
3 declare {i32, i32} @llvm.x86.rdrand.32()
4 declare {i64, i32} @llvm.x86.rdrand.64()
5
6 define i32 @_rdrand16_step(i16* %random_val) {
7   %call = call {i16, i32} @llvm.x86.rdrand.16()
8   %randval = extractvalue {i16, i32} %call, 0
9   store i16 %randval, i16* %random_val
10   %isvalid = extractvalue {i16, i32} %call, 1
11   ret i32 %isvalid
12 ; CHECK: _rdrand16_step:
13 ; CHECK: rdrandw        %ax
14 ; CHECK: movw   %ax, (%rdi)
15 ; CHECK: movzwl %ax, %ecx
16 ; CHECK: movl   $1, %eax
17 ; CHECK: cmovael        %ecx, %eax
18 ; CHECK: ret
19 }
20
21 define i32 @_rdrand32_step(i32* %random_val) {
22   %call = call {i32, i32} @llvm.x86.rdrand.32()
23   %randval = extractvalue {i32, i32} %call, 0
24   store i32 %randval, i32* %random_val
25   %isvalid = extractvalue {i32, i32} %call, 1
26   ret i32 %isvalid
27 ; CHECK: _rdrand32_step:
28 ; CHECK: rdrandl        %ecx
29 ; CHECK: movl   %ecx, (%rdi)
30 ; CHECK: movl   $1, %eax
31 ; CHECK: cmovael        %ecx, %eax
32 ; CHECK: ret
33 }
34
35 define i32 @_rdrand64_step(i64* %random_val) {
36   %call = call {i64, i32} @llvm.x86.rdrand.64()
37   %randval = extractvalue {i64, i32} %call, 0
38   store i64 %randval, i64* %random_val
39   %isvalid = extractvalue {i64, i32} %call, 1
40   ret i32 %isvalid
41 ; CHECK: _rdrand64_step:
42 ; CHECK: rdrandq        %rcx
43 ; CHECK: movq   %rcx, (%rdi)
44 ; CHECK: movl   $1, %eax
45 ; CHECK: cmovael        %ecx, %eax
46 ; CHECK: ret
47 }