162 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1,-avx,+rdrnd,+rdseed | FileCheck %s3 4define i32 @foo(<2 x i64> %c, i32 %a, i32 %b) {5; CHECK-LABEL: foo:6; CHECK: # %bb.0:7; CHECK-NEXT: movl %edi, %eax8; CHECK-NEXT: ptest %xmm0, %xmm09; CHECK-NEXT: cmovnel %esi, %eax10; CHECK-NEXT: retq11 %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)12 %t2 = icmp ne i32 %t1, 013 %t3 = select i1 %t2, i32 %a, i32 %b14 ret i32 %t315}16 17define i32 @bar(<2 x i64> %c) {18; CHECK-LABEL: bar:19; CHECK: # %bb.0: # %entry20; CHECK-NEXT: ptest %xmm0, %xmm021; CHECK-NEXT: jne .LBB1_222; CHECK-NEXT: # %bb.1: # %if-true-block23; CHECK-NEXT: xorl %eax, %eax24; CHECK-NEXT: retq25; CHECK-NEXT: .LBB1_2: # %endif-block26; CHECK-NEXT: movl $1, %eax27; CHECK-NEXT: retq28entry:29 %0 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)30 %1 = icmp ne i32 %0, 031 br i1 %1, label %if-true-block, label %endif-block32if-true-block:33 ret i32 034endif-block:35 ret i32 136}37 38define i32 @bax(<2 x i64> %c) {39; CHECK-LABEL: bax:40; CHECK: # %bb.0:41; CHECK-NEXT: xorl %eax, %eax42; CHECK-NEXT: ptest %xmm0, %xmm043; CHECK-NEXT: sete %al44; CHECK-NEXT: retq45 %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)46 %t2 = icmp eq i32 %t1, 147 %t3 = zext i1 %t2 to i3248 ret i32 %t349}50 51define i16 @rnd16(i16 %arg) nounwind {52; CHECK-LABEL: rnd16:53; CHECK: # %bb.0:54; CHECK-NEXT: xorl %eax, %eax55; CHECK-NEXT: rdrandw %cx56; CHECK-NEXT: cmovbl %edi, %eax57; CHECK-NEXT: addl %ecx, %eax58; CHECK-NEXT: # kill: def $ax killed $ax killed $eax59; CHECK-NEXT: retq60 %1 = tail call { i16, i32 } @llvm.x86.rdrand.16() nounwind61 %2 = extractvalue { i16, i32 } %1, 062 %3 = extractvalue { i16, i32 } %1, 163 %4 = icmp eq i32 %3, 064 %5 = select i1 %4, i16 0, i16 %arg65 %6 = add i16 %5, %266 ret i16 %667}68 69define i32 @rnd32(i32 %arg) nounwind {70; CHECK-LABEL: rnd32:71; CHECK: # %bb.0:72; CHECK-NEXT: xorl %eax, %eax73; CHECK-NEXT: rdrandl %ecx74; CHECK-NEXT: cmovbl %edi, %eax75; CHECK-NEXT: addl %ecx, %eax76; CHECK-NEXT: retq77 %1 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind78 %2 = extractvalue { i32, i32 } %1, 079 %3 = extractvalue { i32, i32 } %1, 180 %4 = icmp eq i32 %3, 081 %5 = select i1 %4, i32 0, i32 %arg82 %6 = add i32 %5, %283 ret i32 %684}85 86define i64 @rnd64(i64 %arg) nounwind {87; CHECK-LABEL: rnd64:88; CHECK: # %bb.0:89; CHECK-NEXT: xorl %eax, %eax90; CHECK-NEXT: rdrandq %rcx91; CHECK-NEXT: cmovbq %rdi, %rax92; CHECK-NEXT: addq %rcx, %rax93; CHECK-NEXT: retq94 %1 = tail call { i64, i32 } @llvm.x86.rdrand.64() nounwind95 %2 = extractvalue { i64, i32 } %1, 096 %3 = extractvalue { i64, i32 } %1, 197 %4 = icmp eq i32 %3, 098 %5 = select i1 %4, i64 0, i64 %arg99 %6 = add i64 %5, %2100 ret i64 %6101}102 103define i16 @seed16(i16 %arg) nounwind {104; CHECK-LABEL: seed16:105; CHECK: # %bb.0:106; CHECK-NEXT: xorl %eax, %eax107; CHECK-NEXT: rdseedw %cx108; CHECK-NEXT: cmovbl %edi, %eax109; CHECK-NEXT: addl %ecx, %eax110; CHECK-NEXT: # kill: def $ax killed $ax killed $eax111; CHECK-NEXT: retq112 %1 = tail call { i16, i32 } @llvm.x86.rdseed.16() nounwind113 %2 = extractvalue { i16, i32 } %1, 0114 %3 = extractvalue { i16, i32 } %1, 1115 %4 = icmp eq i32 %3, 0116 %5 = select i1 %4, i16 0, i16 %arg117 %6 = add i16 %5, %2118 ret i16 %6119}120 121define i32 @seed32(i32 %arg) nounwind {122; CHECK-LABEL: seed32:123; CHECK: # %bb.0:124; CHECK-NEXT: xorl %eax, %eax125; CHECK-NEXT: rdseedl %ecx126; CHECK-NEXT: cmovbl %edi, %eax127; CHECK-NEXT: addl %ecx, %eax128; CHECK-NEXT: retq129 %1 = tail call { i32, i32 } @llvm.x86.rdseed.32() nounwind130 %2 = extractvalue { i32, i32 } %1, 0131 %3 = extractvalue { i32, i32 } %1, 1132 %4 = icmp eq i32 %3, 0133 %5 = select i1 %4, i32 0, i32 %arg134 %6 = add i32 %5, %2135 ret i32 %6136}137 138define i64 @seed64(i64 %arg) nounwind {139; CHECK-LABEL: seed64:140; CHECK: # %bb.0:141; CHECK-NEXT: xorl %eax, %eax142; CHECK-NEXT: rdseedq %rcx143; CHECK-NEXT: cmovbq %rdi, %rax144; CHECK-NEXT: addq %rcx, %rax145; CHECK-NEXT: retq146 %1 = tail call { i64, i32 } @llvm.x86.rdseed.64() nounwind147 %2 = extractvalue { i64, i32 } %1, 0148 %3 = extractvalue { i64, i32 } %1, 1149 %4 = icmp eq i32 %3, 0150 %5 = select i1 %4, i64 0, i64 %arg151 %6 = add i64 %5, %2152 ret i64 %6153}154 155declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone156declare { i16, i32 } @llvm.x86.rdrand.16() nounwind157declare { i32, i32 } @llvm.x86.rdrand.32() nounwind158declare { i64, i32 } @llvm.x86.rdrand.64() nounwind159declare { i16, i32 } @llvm.x86.rdseed.16() nounwind160declare { i32, i32 } @llvm.x86.rdseed.32() nounwind161declare { i64, i32 } @llvm.x86.rdseed.64() nounwind162