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=+rdseed | 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=broadwell | FileCheck %s --check-prefix=CHECK --check-prefix=BROADWELL 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake | FileCheck %s --check-prefix=CHECK --check-prefix=SKYLAKE 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skx | FileCheck %s --check-prefix=CHECK --check-prefix=SKX 7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 | FileCheck %s --check-prefix=CHECK --check-prefix=ZNVER1 8 9 declare {i16, i32} @llvm.x86.rdseed.16() 10 declare {i32, i32} @llvm.x86.rdseed.32() 11 declare {i64, i32} @llvm.x86.rdseed.64() 12 13 define i16 @test_rdseed_16(i16* %random_val) { 14 ; GENERIC-LABEL: test_rdseed_16: 15 ; GENERIC: # %bb.0: 16 ; GENERIC-NEXT: rdseedw %ax # sched: [100:0.33] 17 ; GENERIC-NEXT: retq # sched: [1:1.00] 18 ; 19 ; GOLDMONT-LABEL: test_rdseed_16: 20 ; GOLDMONT: # %bb.0: 21 ; GOLDMONT-NEXT: rdseedw %ax # sched: [100:1.00] 22 ; GOLDMONT-NEXT: retq # sched: [4:1.00] 23 ; 24 ; BROADWELL-LABEL: test_rdseed_16: 25 ; BROADWELL: # %bb.0: 26 ; BROADWELL-NEXT: rdseedw %ax # sched: [100:0.25] 27 ; BROADWELL-NEXT: retq # sched: [7:1.00] 28 ; 29 ; SKYLAKE-LABEL: test_rdseed_16: 30 ; SKYLAKE: # %bb.0: 31 ; SKYLAKE-NEXT: rdseedw %ax # sched: [100:0.25] 32 ; SKYLAKE-NEXT: retq # sched: [7:1.00] 33 ; 34 ; SKX-LABEL: test_rdseed_16: 35 ; SKX: # %bb.0: 36 ; SKX-NEXT: rdseedw %ax # sched: [100:0.25] 37 ; SKX-NEXT: retq # sched: [7:1.00] 38 ; 39 ; ZNVER1-LABEL: test_rdseed_16: 40 ; ZNVER1: # %bb.0: 41 ; ZNVER1-NEXT: rdseedw %ax # sched: [100:0.25] 42 ; ZNVER1-NEXT: retq # sched: [1:0.50] 43 %call = call {i16, i32} @llvm.x86.rdseed.16() 44 %randval = extractvalue {i16, i32} %call, 0 45 ret i16 %randval 46 } 47 48 define i32 @test_rdseed_32(i16* %random_val) { 49 ; GENERIC-LABEL: test_rdseed_32: 50 ; GENERIC: # %bb.0: 51 ; GENERIC-NEXT: rdseedl %eax # sched: [100:0.33] 52 ; GENERIC-NEXT: retq # sched: [1:1.00] 53 ; 54 ; GOLDMONT-LABEL: test_rdseed_32: 55 ; GOLDMONT: # %bb.0: 56 ; GOLDMONT-NEXT: rdseedl %eax # sched: [100:1.00] 57 ; GOLDMONT-NEXT: retq # sched: [4:1.00] 58 ; 59 ; BROADWELL-LABEL: test_rdseed_32: 60 ; BROADWELL: # %bb.0: 61 ; BROADWELL-NEXT: rdseedl %eax # sched: [100:0.25] 62 ; BROADWELL-NEXT: retq # sched: [7:1.00] 63 ; 64 ; SKYLAKE-LABEL: test_rdseed_32: 65 ; SKYLAKE: # %bb.0: 66 ; SKYLAKE-NEXT: rdseedl %eax # sched: [100:0.25] 67 ; SKYLAKE-NEXT: retq # sched: [7:1.00] 68 ; 69 ; SKX-LABEL: test_rdseed_32: 70 ; SKX: # %bb.0: 71 ; SKX-NEXT: rdseedl %eax # sched: [100:0.25] 72 ; SKX-NEXT: retq # sched: [7:1.00] 73 ; 74 ; ZNVER1-LABEL: test_rdseed_32: 75 ; ZNVER1: # %bb.0: 76 ; ZNVER1-NEXT: rdseedl %eax # sched: [100:0.25] 77 ; ZNVER1-NEXT: retq # sched: [1:0.50] 78 %call = call {i32, i32} @llvm.x86.rdseed.32() 79 %randval = extractvalue {i32, i32} %call, 0 80 ret i32 %randval 81 } 82 83 define i64 @test_rdseed_64(i64* %random_val) { 84 ; GENERIC-LABEL: test_rdseed_64: 85 ; GENERIC: # %bb.0: 86 ; GENERIC-NEXT: rdseedq %rax # sched: [100:0.33] 87 ; GENERIC-NEXT: retq # sched: [1:1.00] 88 ; 89 ; GOLDMONT-LABEL: test_rdseed_64: 90 ; GOLDMONT: # %bb.0: 91 ; GOLDMONT-NEXT: rdseedq %rax # sched: [100:1.00] 92 ; GOLDMONT-NEXT: retq # sched: [4:1.00] 93 ; 94 ; BROADWELL-LABEL: test_rdseed_64: 95 ; BROADWELL: # %bb.0: 96 ; BROADWELL-NEXT: rdseedq %rax # sched: [100:0.25] 97 ; BROADWELL-NEXT: retq # sched: [7:1.00] 98 ; 99 ; SKYLAKE-LABEL: test_rdseed_64: 100 ; SKYLAKE: # %bb.0: 101 ; SKYLAKE-NEXT: rdseedq %rax # sched: [100:0.25] 102 ; SKYLAKE-NEXT: retq # sched: [7:1.00] 103 ; 104 ; SKX-LABEL: test_rdseed_64: 105 ; SKX: # %bb.0: 106 ; SKX-NEXT: rdseedq %rax # sched: [100:0.25] 107 ; SKX-NEXT: retq # sched: [7:1.00] 108 ; 109 ; ZNVER1-LABEL: test_rdseed_64: 110 ; ZNVER1: # %bb.0: 111 ; ZNVER1-NEXT: rdseedq %rax # sched: [100:0.25] 112 ; ZNVER1-NEXT: retq # sched: [1:0.50] 113 %call = call {i64, i32} @llvm.x86.rdseed.64() 114 %randval = extractvalue {i64, i32} %call, 0 115 ret i64 %randval 116 } 117