xref: /llvm-project/llvm/test/CodeGen/X86/rdseed.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown-unknown -mcpu=core-avx-i -mattr=+rdseed | FileCheck %s --check-prefix=X86
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=core-avx-i -mattr=+rdseed | FileCheck %s --check-prefix=X64
4
5declare {i16, i32} @llvm.x86.rdseed.16()
6declare {i32, i32} @llvm.x86.rdseed.32()
7
8define i32 @_rdseed16_step(ptr %random_val) {
9; X86-LABEL: _rdseed16_step:
10; X86:       # %bb.0:
11; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
12; X86-NEXT:    rdseedw %ax
13; X86-NEXT:    movzwl %ax, %edx
14; X86-NEXT:    movl $1, %eax
15; X86-NEXT:    cmovael %edx, %eax
16; X86-NEXT:    movw %dx, (%ecx)
17; X86-NEXT:    retl
18;
19; X64-LABEL: _rdseed16_step:
20; X64:       # %bb.0:
21; X64-NEXT:    rdseedw %ax
22; X64-NEXT:    movzwl %ax, %ecx
23; X64-NEXT:    movl $1, %eax
24; X64-NEXT:    cmovael %ecx, %eax
25; X64-NEXT:    movw %cx, (%rdi)
26; X64-NEXT:    retq
27  %call = call {i16, i32} @llvm.x86.rdseed.16()
28  %randval = extractvalue {i16, i32} %call, 0
29  store i16 %randval, ptr %random_val
30  %isvalid = extractvalue {i16, i32} %call, 1
31  ret i32 %isvalid
32}
33
34define i32 @_rdseed32_step(ptr %random_val) {
35; X86-LABEL: _rdseed32_step:
36; X86:       # %bb.0:
37; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
38; X86-NEXT:    rdseedl %edx
39; X86-NEXT:    movl $1, %eax
40; X86-NEXT:    cmovael %edx, %eax
41; X86-NEXT:    movl %edx, (%ecx)
42; X86-NEXT:    retl
43;
44; X64-LABEL: _rdseed32_step:
45; X64:       # %bb.0:
46; X64-NEXT:    rdseedl %ecx
47; X64-NEXT:    movl $1, %eax
48; X64-NEXT:    cmovael %ecx, %eax
49; X64-NEXT:    movl %ecx, (%rdi)
50; X64-NEXT:    retq
51  %call = call {i32, i32} @llvm.x86.rdseed.32()
52  %randval = extractvalue {i32, i32} %call, 0
53  store i32 %randval, ptr %random_val
54  %isvalid = extractvalue {i32, i32} %call, 1
55  ret i32 %isvalid
56}
57