brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 52f767a Raw
139 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mcpu=core-avx-i -mattr=+rdrnd | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=core-avx-i -mattr=+rdrnd | FileCheck %s --check-prefix=X644 5declare {i16, i32} @llvm.x86.rdrand.16()6declare {i32, i32} @llvm.x86.rdrand.32()7 8define i32 @_rdrand16_step(ptr %random_val) {9; X86-LABEL: _rdrand16_step:10; X86:       # %bb.0:11; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx12; X86-NEXT:    rdrandw %ax13; X86-NEXT:    movzwl %ax, %edx14; X86-NEXT:    movl $1, %eax15; X86-NEXT:    cmovael %edx, %eax16; X86-NEXT:    movw %dx, (%ecx)17; X86-NEXT:    retl18;19; X64-LABEL: _rdrand16_step:20; X64:       # %bb.0:21; X64-NEXT:    rdrandw %ax22; X64-NEXT:    movzwl %ax, %ecx23; X64-NEXT:    movl $1, %eax24; X64-NEXT:    cmovael %ecx, %eax25; X64-NEXT:    movw %cx, (%rdi)26; X64-NEXT:    retq27  %call = call {i16, i32} @llvm.x86.rdrand.16()28  %randval = extractvalue {i16, i32} %call, 029  store i16 %randval, ptr %random_val30  %isvalid = extractvalue {i16, i32} %call, 131  ret i32 %isvalid32}33 34define i32 @_rdrand32_step(ptr %random_val) {35; X86-LABEL: _rdrand32_step:36; X86:       # %bb.0:37; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx38; X86-NEXT:    rdrandl %edx39; X86-NEXT:    movl $1, %eax40; X86-NEXT:    cmovael %edx, %eax41; X86-NEXT:    movl %edx, (%ecx)42; X86-NEXT:    retl43;44; X64-LABEL: _rdrand32_step:45; X64:       # %bb.0:46; X64-NEXT:    rdrandl %ecx47; X64-NEXT:    movl $1, %eax48; X64-NEXT:    cmovael %ecx, %eax49; X64-NEXT:    movl %ecx, (%rdi)50; X64-NEXT:    retq51  %call = call {i32, i32} @llvm.x86.rdrand.32()52  %randval = extractvalue {i32, i32} %call, 053  store i32 %randval, ptr %random_val54  %isvalid = extractvalue {i32, i32} %call, 155  ret i32 %isvalid56}57 58; Check that MachineCSE doesn't eliminate duplicate rdrand instructions.59define i32 @CSE() nounwind {60; X86-LABEL: CSE:61; X86:       # %bb.0:62; X86-NEXT:    rdrandl %ecx63; X86-NEXT:    rdrandl %eax64; X86-NEXT:    addl %ecx, %eax65; X86-NEXT:    retl66;67; X64-LABEL: CSE:68; X64:       # %bb.0:69; X64-NEXT:    rdrandl %ecx70; X64-NEXT:    rdrandl %eax71; X64-NEXT:    addl %ecx, %eax72; X64-NEXT:    retq73 %rand1 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind74 %v1 = extractvalue { i32, i32 } %rand1, 075 %rand2 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind76 %v2 = extractvalue { i32, i32 } %rand2, 077 %add = add i32 %v2, %v178 ret i32 %add79}80 81; Check that MachineLICM doesn't hoist rdrand instructions.82define void @loop(ptr %p, i32 %n) nounwind {83; X86-LABEL: loop:84; X86:       # %bb.0: # %entry85; X86-NEXT:    pushl %esi86; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax87; X86-NEXT:    testl %eax, %eax88; X86-NEXT:    je .LBB3_389; X86-NEXT:  # %bb.1: # %while.body.preheader90; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx91; X86-NEXT:    xorl %edx, %edx92; X86-NEXT:    .p2align 493; X86-NEXT:  .LBB3_2: # %while.body94; X86-NEXT:    # =>This Inner Loop Header: Depth=195; X86-NEXT:    rdrandl %esi96; X86-NEXT:    movl %esi, (%ecx,%edx,4)97; X86-NEXT:    incl %edx98; X86-NEXT:    cmpl %edx, %eax99; X86-NEXT:    jne .LBB3_2100; X86-NEXT:  .LBB3_3: # %while.end101; X86-NEXT:    popl %esi102; X86-NEXT:    retl103;104; X64-LABEL: loop:105; X64:       # %bb.0: # %entry106; X64-NEXT:    testl %esi, %esi107; X64-NEXT:    je .LBB3_3108; X64-NEXT:  # %bb.1: # %while.body.preheader109; X64-NEXT:    movl %esi, %eax110; X64-NEXT:    xorl %ecx, %ecx111; X64-NEXT:    .p2align 4112; X64-NEXT:  .LBB3_2: # %while.body113; X64-NEXT:    # =>This Inner Loop Header: Depth=1114; X64-NEXT:    rdrandl %edx115; X64-NEXT:    movl %edx, (%rdi,%rcx,4)116; X64-NEXT:    incq %rcx117; X64-NEXT:    cmpl %ecx, %eax118; X64-NEXT:    jne .LBB3_2119; X64-NEXT:  .LBB3_3: # %while.end120; X64-NEXT:    retq121entry:122  %tobool1 = icmp eq i32 %n, 0123  br i1 %tobool1, label %while.end, label %while.body124 125while.body:                                       ; preds = %entry, %while.body126  %p.addr.03 = phi ptr [ %incdec.ptr, %while.body ], [ %p, %entry ]127  %n.addr.02 = phi i32 [ %dec, %while.body ], [ %n, %entry ]128  %dec = add nsw i32 %n.addr.02, -1129  %incdec.ptr = getelementptr inbounds i32, ptr %p.addr.03, i64 1130  %rand = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind131  %v1 = extractvalue { i32, i32 } %rand, 0132  store i32 %v1, ptr %p.addr.03, align 4133  %tobool = icmp eq i32 %dec, 0134  br i1 %tobool, label %while.end, label %while.body135 136while.end:                                        ; preds = %while.body, %entry137  ret void138}139