1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mattr=+sse4.1,-avx,+rdrnd,+rdseed | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(<2 x i64> %c, i32 %a, i32 %b) { 4*9880d681SAndroid Build Coastguard Worker %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c) 5*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 6*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 %a, i32 %b 7*9880d681SAndroid Build Coastguard Worker ret i32 %t3 8*9880d681SAndroid Build Coastguard Worker; CHECK: foo 9*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 10*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: testl 11*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 12*9880d681SAndroid Build Coastguard Worker; CHECK: ret 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(<2 x i64> %c) { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker %0 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c) 18*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i32 %0, 0 19*9880d681SAndroid Build Coastguard Worker br i1 %1, label %if-true-block, label %endif-block 20*9880d681SAndroid Build Coastguard Workerif-true-block: ; preds = %entry 21*9880d681SAndroid Build Coastguard Worker ret i32 0 22*9880d681SAndroid Build Coastguard Workerendif-block: ; preds = %entry, 23*9880d681SAndroid Build Coastguard Worker ret i32 1 24*9880d681SAndroid Build Coastguard Worker; CHECK: bar 25*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 26*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: testl 27*9880d681SAndroid Build Coastguard Worker; CHECK: jne 28*9880d681SAndroid Build Coastguard Worker; CHECK: ret 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i32 @bax(<2 x i64> %c) { 32*9880d681SAndroid Build Coastguard Worker %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c) 33*9880d681SAndroid Build Coastguard Worker %t2 = icmp eq i32 %t1, 1 34*9880d681SAndroid Build Coastguard Worker %t3 = zext i1 %t2 to i32 35*9880d681SAndroid Build Coastguard Worker ret i32 %t3 36*9880d681SAndroid Build Coastguard Worker; CHECK: bax 37*9880d681SAndroid Build Coastguard Worker; CHECK: ptest 38*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl 39*9880d681SAndroid Build Coastguard Worker; CHECK: ret 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine i16 @rnd16(i16 %arg) nounwind uwtable { 43*9880d681SAndroid Build Coastguard Worker %1 = tail call { i16, i32 } @llvm.x86.rdrand.16() nounwind 44*9880d681SAndroid Build Coastguard Worker %2 = extractvalue { i16, i32 } %1, 0 45*9880d681SAndroid Build Coastguard Worker %3 = extractvalue { i16, i32 } %1, 1 46*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 47*9880d681SAndroid Build Coastguard Worker %5 = select i1 %4, i16 0, i16 %arg 48*9880d681SAndroid Build Coastguard Worker %6 = add i16 %5, %2 49*9880d681SAndroid Build Coastguard Worker ret i16 %6 50*9880d681SAndroid Build Coastguard Worker; CHECK: rnd16 51*9880d681SAndroid Build Coastguard Worker; CHECK: rdrand 52*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 54*9880d681SAndroid Build Coastguard Worker; CHECK: ret 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i32 @rnd32(i32 %arg) nounwind uwtable { 58*9880d681SAndroid Build Coastguard Worker %1 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind 59*9880d681SAndroid Build Coastguard Worker %2 = extractvalue { i32, i32 } %1, 0 60*9880d681SAndroid Build Coastguard Worker %3 = extractvalue { i32, i32 } %1, 1 61*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 62*9880d681SAndroid Build Coastguard Worker %5 = select i1 %4, i32 0, i32 %arg 63*9880d681SAndroid Build Coastguard Worker %6 = add i32 %5, %2 64*9880d681SAndroid Build Coastguard Worker ret i32 %6 65*9880d681SAndroid Build Coastguard Worker; CHECK: rnd32 66*9880d681SAndroid Build Coastguard Worker; CHECK: rdrand 67*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 68*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 69*9880d681SAndroid Build Coastguard Worker; CHECK: ret 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i64 @rnd64(i64 %arg) nounwind uwtable { 73*9880d681SAndroid Build Coastguard Worker %1 = tail call { i64, i32 } @llvm.x86.rdrand.64() nounwind 74*9880d681SAndroid Build Coastguard Worker %2 = extractvalue { i64, i32 } %1, 0 75*9880d681SAndroid Build Coastguard Worker %3 = extractvalue { i64, i32 } %1, 1 76*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 77*9880d681SAndroid Build Coastguard Worker %5 = select i1 %4, i64 0, i64 %arg 78*9880d681SAndroid Build Coastguard Worker %6 = add i64 %5, %2 79*9880d681SAndroid Build Coastguard Worker ret i64 %6 80*9880d681SAndroid Build Coastguard Worker; CHECK: rnd64 81*9880d681SAndroid Build Coastguard Worker; CHECK: rdrand 82*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 84*9880d681SAndroid Build Coastguard Worker; CHECK: ret 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine i16 @seed16(i16 %arg) nounwind uwtable { 88*9880d681SAndroid Build Coastguard Worker %1 = tail call { i16, i32 } @llvm.x86.rdseed.16() nounwind 89*9880d681SAndroid Build Coastguard Worker %2 = extractvalue { i16, i32 } %1, 0 90*9880d681SAndroid Build Coastguard Worker %3 = extractvalue { i16, i32 } %1, 1 91*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 92*9880d681SAndroid Build Coastguard Worker %5 = select i1 %4, i16 0, i16 %arg 93*9880d681SAndroid Build Coastguard Worker %6 = add i16 %5, %2 94*9880d681SAndroid Build Coastguard Worker ret i16 %6 95*9880d681SAndroid Build Coastguard Worker; CHECK: seed16 96*9880d681SAndroid Build Coastguard Worker; CHECK: rdseed 97*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 98*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 99*9880d681SAndroid Build Coastguard Worker; CHECK: ret 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine i32 @seed32(i32 %arg) nounwind uwtable { 103*9880d681SAndroid Build Coastguard Worker %1 = tail call { i32, i32 } @llvm.x86.rdseed.32() nounwind 104*9880d681SAndroid Build Coastguard Worker %2 = extractvalue { i32, i32 } %1, 0 105*9880d681SAndroid Build Coastguard Worker %3 = extractvalue { i32, i32 } %1, 1 106*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 107*9880d681SAndroid Build Coastguard Worker %5 = select i1 %4, i32 0, i32 %arg 108*9880d681SAndroid Build Coastguard Worker %6 = add i32 %5, %2 109*9880d681SAndroid Build Coastguard Worker ret i32 %6 110*9880d681SAndroid Build Coastguard Worker; CHECK: seed32 111*9880d681SAndroid Build Coastguard Worker; CHECK: rdseed 112*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 113*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 114*9880d681SAndroid Build Coastguard Worker; CHECK: ret 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine i64 @seed64(i64 %arg) nounwind uwtable { 118*9880d681SAndroid Build Coastguard Worker %1 = tail call { i64, i32 } @llvm.x86.rdseed.64() nounwind 119*9880d681SAndroid Build Coastguard Worker %2 = extractvalue { i64, i32 } %1, 0 120*9880d681SAndroid Build Coastguard Worker %3 = extractvalue { i64, i32 } %1, 1 121*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 122*9880d681SAndroid Build Coastguard Worker %5 = select i1 %4, i64 0, i64 %arg 123*9880d681SAndroid Build Coastguard Worker %6 = add i64 %5, %2 124*9880d681SAndroid Build Coastguard Worker ret i64 %6 125*9880d681SAndroid Build Coastguard Worker; CHECK: seed64 126*9880d681SAndroid Build Coastguard Worker; CHECK: rdseed 127*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 128*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 129*9880d681SAndroid Build Coastguard Worker; CHECK: ret 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone 133*9880d681SAndroid Build Coastguard Workerdeclare { i16, i32 } @llvm.x86.rdrand.16() nounwind 134*9880d681SAndroid Build Coastguard Workerdeclare { i32, i32 } @llvm.x86.rdrand.32() nounwind 135*9880d681SAndroid Build Coastguard Workerdeclare { i64, i32 } @llvm.x86.rdrand.64() nounwind 136*9880d681SAndroid Build Coastguard Workerdeclare { i16, i32 } @llvm.x86.rdseed.16() nounwind 137*9880d681SAndroid Build Coastguard Workerdeclare { i32, i32 } @llvm.x86.rdseed.32() nounwind 138*9880d681SAndroid Build Coastguard Workerdeclare { i64, i32 } @llvm.x86.rdseed.64() nounwind 139