1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86-64 -mattr=sse4.1 < %s | FileCheck %s -check-prefix=SSE4 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86-64 -mattr=avx < %s | FileCheck %s -check-prefix=AVX1 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86-64 -mattr=avx2 < %s | FileCheck %s -check-prefix=AVX2 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @split16(<16 x i16> %a, <16 x i16> %b, <16 x i8> %__mask) { 6*9880d681SAndroid Build Coastguard Worker; SSE4-LABEL: split16: 7*9880d681SAndroid Build Coastguard Worker; SSE4: pminuw 8*9880d681SAndroid Build Coastguard Worker; SSE4: pminuw 9*9880d681SAndroid Build Coastguard Worker; SSE4: ret 10*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: split16: 11*9880d681SAndroid Build Coastguard Worker; AVX1: vpminuw 12*9880d681SAndroid Build Coastguard Worker; AVX1: vpminuw 13*9880d681SAndroid Build Coastguard Worker; AVX1: ret 14*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: split16: 15*9880d681SAndroid Build Coastguard Worker; AVX2: vpminuw 16*9880d681SAndroid Build Coastguard Worker; AVX2: ret 17*9880d681SAndroid Build Coastguard Worker %1 = icmp ult <16 x i16> %a, %b 18*9880d681SAndroid Build Coastguard Worker %2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b 19*9880d681SAndroid Build Coastguard Worker ret <16 x i16> %2 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine <32 x i16> @split32(<32 x i16> %a, <32 x i16> %b, <32 x i8> %__mask) { 23*9880d681SAndroid Build Coastguard Worker; SSE4-LABEL: split32: 24*9880d681SAndroid Build Coastguard Worker; SSE4: pminuw 25*9880d681SAndroid Build Coastguard Worker; SSE4: pminuw 26*9880d681SAndroid Build Coastguard Worker; SSE4: pminuw 27*9880d681SAndroid Build Coastguard Worker; SSE4: pminuw 28*9880d681SAndroid Build Coastguard Worker; SSE4: ret 29*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: split32: 30*9880d681SAndroid Build Coastguard Worker; AVX1: vpminuw 31*9880d681SAndroid Build Coastguard Worker; AVX1: vpminuw 32*9880d681SAndroid Build Coastguard Worker; AVX1: vpminuw 33*9880d681SAndroid Build Coastguard Worker; AVX1: vpminuw 34*9880d681SAndroid Build Coastguard Worker; AVX1: ret 35*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: split32: 36*9880d681SAndroid Build Coastguard Worker; AVX2: vpminuw 37*9880d681SAndroid Build Coastguard Worker; AVX2: vpminuw 38*9880d681SAndroid Build Coastguard Worker; AVX2: ret 39*9880d681SAndroid Build Coastguard Worker %1 = icmp ult <32 x i16> %a, %b 40*9880d681SAndroid Build Coastguard Worker %2 = select <32 x i1> %1, <32 x i16> %a, <32 x i16> %b 41*9880d681SAndroid Build Coastguard Worker ret <32 x i16> %2 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; PR19492 45*9880d681SAndroid Build Coastguard Workerdefine i128 @split128(<2 x i128> %a, <2 x i128> %b) { 46*9880d681SAndroid Build Coastguard Worker; SSE4-LABEL: split128: 47*9880d681SAndroid Build Coastguard Worker; SSE4: addq 48*9880d681SAndroid Build Coastguard Worker; SSE4: adcq 49*9880d681SAndroid Build Coastguard Worker; SSE4: addq 50*9880d681SAndroid Build Coastguard Worker; SSE4: adcq 51*9880d681SAndroid Build Coastguard Worker; SSE4: addq 52*9880d681SAndroid Build Coastguard Worker; SSE4: adcq 53*9880d681SAndroid Build Coastguard Worker; SSE4: ret 54*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: split128: 55*9880d681SAndroid Build Coastguard Worker; AVX1: addq 56*9880d681SAndroid Build Coastguard Worker; AVX1: adcq 57*9880d681SAndroid Build Coastguard Worker; AVX1: addq 58*9880d681SAndroid Build Coastguard Worker; AVX1: adcq 59*9880d681SAndroid Build Coastguard Worker; AVX1: addq 60*9880d681SAndroid Build Coastguard Worker; AVX1: adcq 61*9880d681SAndroid Build Coastguard Worker; AVX1: ret 62*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: split128: 63*9880d681SAndroid Build Coastguard Worker; AVX2: addq 64*9880d681SAndroid Build Coastguard Worker; AVX2: adcq 65*9880d681SAndroid Build Coastguard Worker; AVX2: addq 66*9880d681SAndroid Build Coastguard Worker; AVX2: adcq 67*9880d681SAndroid Build Coastguard Worker; AVX2: addq 68*9880d681SAndroid Build Coastguard Worker; AVX2: adcq 69*9880d681SAndroid Build Coastguard Worker; AVX2: ret 70*9880d681SAndroid Build Coastguard Worker %add = add nsw <2 x i128> %a, %b 71*9880d681SAndroid Build Coastguard Worker %rdx.shuf = shufflevector <2 x i128> %add, <2 x i128> undef, <2 x i32> <i32 undef, i32 0> 72*9880d681SAndroid Build Coastguard Worker %bin.rdx = add <2 x i128> %add, %rdx.shuf 73*9880d681SAndroid Build Coastguard Worker %e = extractelement <2 x i128> %bin.rdx, i32 1 74*9880d681SAndroid Build Coastguard Worker ret i128 %e 75*9880d681SAndroid Build Coastguard Worker} 76