• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=x86-64 -mattr=+rdrnd | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=goldmont | FileCheck %s --check-prefix=CHECK --check-prefix=GOLDMONT
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge | FileCheck %s --check-prefix=CHECK --check-prefix=IVY
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=broadwell | FileCheck %s --check-prefix=CHECK --check-prefix=BROADWELL
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake | FileCheck %s --check-prefix=CHECK --check-prefix=SKYLAKE
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skx | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 | FileCheck %s --check-prefix=CHECK --check-prefix=ZNVER1
10
11declare {i16, i32} @llvm.x86.rdrand.16()
12declare {i32, i32} @llvm.x86.rdrand.32()
13declare {i64, i32} @llvm.x86.rdrand.64()
14
15define i16 @test_rdrand_16(i16* %random_val) {
16; GENERIC-LABEL: test_rdrand_16:
17; GENERIC:       # %bb.0:
18; GENERIC-NEXT:    rdrandw %ax # sched: [100:0.33]
19; GENERIC-NEXT:    retq # sched: [1:1.00]
20;
21; GOLDMONT-LABEL: test_rdrand_16:
22; GOLDMONT:       # %bb.0:
23; GOLDMONT-NEXT:    rdrandw %ax # sched: [100:1.00]
24; GOLDMONT-NEXT:    retq # sched: [4:1.00]
25;
26; IVY-LABEL: test_rdrand_16:
27; IVY:       # %bb.0:
28; IVY-NEXT:    rdrandw %ax # sched: [100:0.33]
29; IVY-NEXT:    retq # sched: [1:1.00]
30;
31; HASWELL-LABEL: test_rdrand_16:
32; HASWELL:       # %bb.0:
33; HASWELL-NEXT:    rdrandw %ax # sched: [1:5.33]
34; HASWELL-NEXT:    retq # sched: [7:1.00]
35;
36; BROADWELL-LABEL: test_rdrand_16:
37; BROADWELL:       # %bb.0:
38; BROADWELL-NEXT:    rdrandw %ax # sched: [9:1.00]
39; BROADWELL-NEXT:    retq # sched: [7:1.00]
40;
41; SKYLAKE-LABEL: test_rdrand_16:
42; SKYLAKE:       # %bb.0:
43; SKYLAKE-NEXT:    rdrandw %ax # sched: [100:0.25]
44; SKYLAKE-NEXT:    retq # sched: [7:1.00]
45;
46; SKX-LABEL: test_rdrand_16:
47; SKX:       # %bb.0:
48; SKX-NEXT:    rdrandw %ax # sched: [100:0.25]
49; SKX-NEXT:    retq # sched: [7:1.00]
50;
51; ZNVER1-LABEL: test_rdrand_16:
52; ZNVER1:       # %bb.0:
53; ZNVER1-NEXT:    rdrandw %ax # sched: [100:0.25]
54; ZNVER1-NEXT:    retq # sched: [1:0.50]
55  %call = call {i16, i32} @llvm.x86.rdrand.16()
56  %randval = extractvalue {i16, i32} %call, 0
57  ret i16 %randval
58}
59
60define i32 @test_rdrand_32(i32* %random_val) {
61; GENERIC-LABEL: test_rdrand_32:
62; GENERIC:       # %bb.0:
63; GENERIC-NEXT:    rdrandl %eax # sched: [100:0.33]
64; GENERIC-NEXT:    retq # sched: [1:1.00]
65;
66; GOLDMONT-LABEL: test_rdrand_32:
67; GOLDMONT:       # %bb.0:
68; GOLDMONT-NEXT:    rdrandl %eax # sched: [100:1.00]
69; GOLDMONT-NEXT:    retq # sched: [4:1.00]
70;
71; IVY-LABEL: test_rdrand_32:
72; IVY:       # %bb.0:
73; IVY-NEXT:    rdrandl %eax # sched: [100:0.33]
74; IVY-NEXT:    retq # sched: [1:1.00]
75;
76; HASWELL-LABEL: test_rdrand_32:
77; HASWELL:       # %bb.0:
78; HASWELL-NEXT:    rdrandl %eax # sched: [1:5.33]
79; HASWELL-NEXT:    retq # sched: [7:1.00]
80;
81; BROADWELL-LABEL: test_rdrand_32:
82; BROADWELL:       # %bb.0:
83; BROADWELL-NEXT:    rdrandl %eax # sched: [9:1.00]
84; BROADWELL-NEXT:    retq # sched: [7:1.00]
85;
86; SKYLAKE-LABEL: test_rdrand_32:
87; SKYLAKE:       # %bb.0:
88; SKYLAKE-NEXT:    rdrandl %eax # sched: [100:0.25]
89; SKYLAKE-NEXT:    retq # sched: [7:1.00]
90;
91; SKX-LABEL: test_rdrand_32:
92; SKX:       # %bb.0:
93; SKX-NEXT:    rdrandl %eax # sched: [100:0.25]
94; SKX-NEXT:    retq # sched: [7:1.00]
95;
96; ZNVER1-LABEL: test_rdrand_32:
97; ZNVER1:       # %bb.0:
98; ZNVER1-NEXT:    rdrandl %eax # sched: [100:0.25]
99; ZNVER1-NEXT:    retq # sched: [1:0.50]
100  %call = call {i32, i32} @llvm.x86.rdrand.32()
101  %randval = extractvalue {i32, i32} %call, 0
102  ret i32 %randval
103}
104
105define i64 @test_rdrand_64(i64* %random_val) {
106; GENERIC-LABEL: test_rdrand_64:
107; GENERIC:       # %bb.0:
108; GENERIC-NEXT:    rdrandq %rax # sched: [100:0.33]
109; GENERIC-NEXT:    retq # sched: [1:1.00]
110;
111; GOLDMONT-LABEL: test_rdrand_64:
112; GOLDMONT:       # %bb.0:
113; GOLDMONT-NEXT:    rdrandq %rax # sched: [100:1.00]
114; GOLDMONT-NEXT:    retq # sched: [4:1.00]
115;
116; IVY-LABEL: test_rdrand_64:
117; IVY:       # %bb.0:
118; IVY-NEXT:    rdrandq %rax # sched: [100:0.33]
119; IVY-NEXT:    retq # sched: [1:1.00]
120;
121; HASWELL-LABEL: test_rdrand_64:
122; HASWELL:       # %bb.0:
123; HASWELL-NEXT:    rdrandq %rax # sched: [1:5.33]
124; HASWELL-NEXT:    retq # sched: [7:1.00]
125;
126; BROADWELL-LABEL: test_rdrand_64:
127; BROADWELL:       # %bb.0:
128; BROADWELL-NEXT:    rdrandq %rax # sched: [9:1.00]
129; BROADWELL-NEXT:    retq # sched: [7:1.00]
130;
131; SKYLAKE-LABEL: test_rdrand_64:
132; SKYLAKE:       # %bb.0:
133; SKYLAKE-NEXT:    rdrandq %rax # sched: [100:0.25]
134; SKYLAKE-NEXT:    retq # sched: [7:1.00]
135;
136; SKX-LABEL: test_rdrand_64:
137; SKX:       # %bb.0:
138; SKX-NEXT:    rdrandq %rax # sched: [100:0.25]
139; SKX-NEXT:    retq # sched: [7:1.00]
140;
141; ZNVER1-LABEL: test_rdrand_64:
142; ZNVER1:       # %bb.0:
143; ZNVER1-NEXT:    rdrandq %rax # sched: [100:0.25]
144; ZNVER1-NEXT:    retq # sched: [1:0.50]
145  %call = call {i64, i32} @llvm.x86.rdrand.64()
146  %randval = extractvalue {i64, i32} %call, 0
147  ret i64 %randval
148}
149