Home | History | Annotate | Download | only in X86
      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