1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse4.1,-avx < %s | FileCheck %s --check-prefix SSE41 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx,-avx2 < %s | FileCheck %s --check-prefix AVX 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @veccond128(<4 x i32> %input) { 5*9880d681SAndroid Build Coastguard Workerentry: 6*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i32> %input to i128 7*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i128 %0, 0 8*9880d681SAndroid Build Coastguard Worker br i1 %1, label %if-true-block, label %endif-block 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerif-true-block: ; preds = %entry 11*9880d681SAndroid Build Coastguard Worker ret i32 0 12*9880d681SAndroid Build Coastguard Workerendif-block: ; preds = %entry, 13*9880d681SAndroid Build Coastguard Worker ret i32 1 14*9880d681SAndroid Build Coastguard Worker; SSE41: veccond128 15*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 16*9880d681SAndroid Build Coastguard Worker; SSE41: ret 17*9880d681SAndroid Build Coastguard Worker; AVX: veccond128 18*9880d681SAndroid Build Coastguard Worker; AVX: vptest %xmm{{.*}}, %xmm{{.*}} 19*9880d681SAndroid Build Coastguard Worker; AVX: ret 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @veccond256(<8 x i32> %input) { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker %0 = bitcast <8 x i32> %input to i256 25*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i256 %0, 0 26*9880d681SAndroid Build Coastguard Worker br i1 %1, label %if-true-block, label %endif-block 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerif-true-block: ; preds = %entry 29*9880d681SAndroid Build Coastguard Worker ret i32 0 30*9880d681SAndroid Build Coastguard Workerendif-block: ; preds = %entry, 31*9880d681SAndroid Build Coastguard Worker ret i32 1 32*9880d681SAndroid Build Coastguard Worker; SSE41: veccond256 33*9880d681SAndroid Build Coastguard Worker; SSE41: por 34*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 35*9880d681SAndroid Build Coastguard Worker; SSE41: ret 36*9880d681SAndroid Build Coastguard Worker; AVX: veccond256 37*9880d681SAndroid Build Coastguard Worker; AVX: vptest %ymm{{.*}}, %ymm{{.*}} 38*9880d681SAndroid Build Coastguard Worker; AVX: ret 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i32 @veccond512(<16 x i32> %input) { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker %0 = bitcast <16 x i32> %input to i512 44*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i512 %0, 0 45*9880d681SAndroid Build Coastguard Worker br i1 %1, label %if-true-block, label %endif-block 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerif-true-block: ; preds = %entry 48*9880d681SAndroid Build Coastguard Worker ret i32 0 49*9880d681SAndroid Build Coastguard Workerendif-block: ; preds = %entry, 50*9880d681SAndroid Build Coastguard Worker ret i32 1 51*9880d681SAndroid Build Coastguard Worker; SSE41: veccond512 52*9880d681SAndroid Build Coastguard Worker; SSE41: por 53*9880d681SAndroid Build Coastguard Worker; SSE41: por 54*9880d681SAndroid Build Coastguard Worker; SSE41: por 55*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 56*9880d681SAndroid Build Coastguard Worker; SSE41: ret 57*9880d681SAndroid Build Coastguard Worker; AVX: veccond512 58*9880d681SAndroid Build Coastguard Worker; AVX: vorps 59*9880d681SAndroid Build Coastguard Worker; AVX: vptest %ymm{{.*}}, %ymm{{.*}} 60*9880d681SAndroid Build Coastguard Worker; AVX: ret 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine i32 @vectest128(<4 x i32> %input) { 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i32> %input to i128 66*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i128 %0, 0 67*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 68*9880d681SAndroid Build Coastguard Worker ret i32 %2 69*9880d681SAndroid Build Coastguard Worker; SSE41: vectest128 70*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 71*9880d681SAndroid Build Coastguard Worker; SSE41: ret 72*9880d681SAndroid Build Coastguard Worker; AVX: vectest128 73*9880d681SAndroid Build Coastguard Worker; AVX: vptest %xmm{{.*}}, %xmm{{.*}} 74*9880d681SAndroid Build Coastguard Worker; AVX: ret 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine i32 @vectest256(<8 x i32> %input) { 78*9880d681SAndroid Build Coastguard Workerentry: 79*9880d681SAndroid Build Coastguard Worker %0 = bitcast <8 x i32> %input to i256 80*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i256 %0, 0 81*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 82*9880d681SAndroid Build Coastguard Worker ret i32 %2 83*9880d681SAndroid Build Coastguard Worker; SSE41: vectest256 84*9880d681SAndroid Build Coastguard Worker; SSE41: por 85*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 86*9880d681SAndroid Build Coastguard Worker; SSE41: ret 87*9880d681SAndroid Build Coastguard Worker; AVX: vectest256 88*9880d681SAndroid Build Coastguard Worker; AVX: vptest %ymm{{.*}}, %ymm{{.*}} 89*9880d681SAndroid Build Coastguard Worker; AVX: ret 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine i32 @vectest512(<16 x i32> %input) { 93*9880d681SAndroid Build Coastguard Workerentry: 94*9880d681SAndroid Build Coastguard Worker %0 = bitcast <16 x i32> %input to i512 95*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i512 %0, 0 96*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 97*9880d681SAndroid Build Coastguard Worker ret i32 %2 98*9880d681SAndroid Build Coastguard Worker; SSE41: vectest512 99*9880d681SAndroid Build Coastguard Worker; SSE41: por 100*9880d681SAndroid Build Coastguard Worker; SSE41: por 101*9880d681SAndroid Build Coastguard Worker; SSE41: por 102*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 103*9880d681SAndroid Build Coastguard Worker; SSE41: ret 104*9880d681SAndroid Build Coastguard Worker; AVX: vectest512 105*9880d681SAndroid Build Coastguard Worker; AVX: vorps 106*9880d681SAndroid Build Coastguard Worker; AVX: vptest %ymm{{.*}}, %ymm{{.*}} 107*9880d681SAndroid Build Coastguard Worker; AVX: ret 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerdefine i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) { 111*9880d681SAndroid Build Coastguard Workerentry: 112*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i32> %input to i128 113*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i128 %0, 0 114*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, i32 %a, i32 %b 115*9880d681SAndroid Build Coastguard Worker ret i32 %2 116*9880d681SAndroid Build Coastguard Worker; SSE41: vecsel128 117*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 118*9880d681SAndroid Build Coastguard Worker; SSE41: ret 119*9880d681SAndroid Build Coastguard Worker; AVX: vecsel128 120*9880d681SAndroid Build Coastguard Worker; AVX: vptest %xmm{{.*}}, %xmm{{.*}} 121*9880d681SAndroid Build Coastguard Worker; AVX: ret 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdefine i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) { 125*9880d681SAndroid Build Coastguard Workerentry: 126*9880d681SAndroid Build Coastguard Worker %0 = bitcast <8 x i32> %input to i256 127*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i256 %0, 0 128*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, i32 %a, i32 %b 129*9880d681SAndroid Build Coastguard Worker ret i32 %2 130*9880d681SAndroid Build Coastguard Worker; SSE41: vecsel256 131*9880d681SAndroid Build Coastguard Worker; SSE41: por 132*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 133*9880d681SAndroid Build Coastguard Worker; SSE41: ret 134*9880d681SAndroid Build Coastguard Worker; AVX: vecsel256 135*9880d681SAndroid Build Coastguard Worker; AVX: vptest %ymm{{.*}}, %ymm{{.*}} 136*9880d681SAndroid Build Coastguard Worker; AVX: ret 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) { 140*9880d681SAndroid Build Coastguard Workerentry: 141*9880d681SAndroid Build Coastguard Worker %0 = bitcast <16 x i32> %input to i512 142*9880d681SAndroid Build Coastguard Worker %1 = icmp ne i512 %0, 0 143*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, i32 %a, i32 %b 144*9880d681SAndroid Build Coastguard Worker ret i32 %2 145*9880d681SAndroid Build Coastguard Worker; SSE41: vecsel512 146*9880d681SAndroid Build Coastguard Worker; SSE41: por 147*9880d681SAndroid Build Coastguard Worker; SSE41: por 148*9880d681SAndroid Build Coastguard Worker; SSE41: por 149*9880d681SAndroid Build Coastguard Worker; SSE41: ptest 150*9880d681SAndroid Build Coastguard Worker; SSE41: ret 151*9880d681SAndroid Build Coastguard Worker; AVX: vecsel512 152*9880d681SAndroid Build Coastguard Worker; AVX: vorps 153*9880d681SAndroid Build Coastguard Worker; AVX: vptest %ymm{{.*}}, %ymm{{.*}} 154*9880d681SAndroid Build Coastguard Worker; AVX: ret 155*9880d681SAndroid Build Coastguard Worker} 156