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 9declare {i16, i32} @llvm.x86.rdseed.16() 10declare {i32, i32} @llvm.x86.rdseed.32() 11declare {i64, i32} @llvm.x86.rdseed.64() 12 13define 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 48define 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 83define 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