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 11 declare {i16, i32} @llvm.x86.rdrand.16() 12 declare {i32, i32} @llvm.x86.rdrand.32() 13 declare {i64, i32} @llvm.x86.rdrand.64() 14 15 define 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 60 define 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 105 define 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