1*9880d681SAndroid Build Coastguard Worker; Test various representations of pack-like operations. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; One way of writing a <4 x i32> -> <8 x i16> pack. 6*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f1(<4 x i32> %val0, <4 x i32> %val1) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: vpkf %v24, %v24, %v26 9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 10*9880d681SAndroid Build Coastguard Worker %elem0 = extractelement <4 x i32> %val0, i32 0 11*9880d681SAndroid Build Coastguard Worker %elem1 = extractelement <4 x i32> %val0, i32 1 12*9880d681SAndroid Build Coastguard Worker %elem2 = extractelement <4 x i32> %val0, i32 2 13*9880d681SAndroid Build Coastguard Worker %elem3 = extractelement <4 x i32> %val0, i32 3 14*9880d681SAndroid Build Coastguard Worker %elem4 = extractelement <4 x i32> %val1, i32 0 15*9880d681SAndroid Build Coastguard Worker %elem5 = extractelement <4 x i32> %val1, i32 1 16*9880d681SAndroid Build Coastguard Worker %elem6 = extractelement <4 x i32> %val1, i32 2 17*9880d681SAndroid Build Coastguard Worker %elem7 = extractelement <4 x i32> %val1, i32 3 18*9880d681SAndroid Build Coastguard Worker %hboth0 = bitcast i32 %elem0 to <2 x i16> 19*9880d681SAndroid Build Coastguard Worker %hboth1 = bitcast i32 %elem1 to <2 x i16> 20*9880d681SAndroid Build Coastguard Worker %hboth2 = bitcast i32 %elem2 to <2 x i16> 21*9880d681SAndroid Build Coastguard Worker %hboth3 = bitcast i32 %elem3 to <2 x i16> 22*9880d681SAndroid Build Coastguard Worker %hboth4 = bitcast i32 %elem4 to <2 x i16> 23*9880d681SAndroid Build Coastguard Worker %hboth5 = bitcast i32 %elem5 to <2 x i16> 24*9880d681SAndroid Build Coastguard Worker %hboth6 = bitcast i32 %elem6 to <2 x i16> 25*9880d681SAndroid Build Coastguard Worker %hboth7 = bitcast i32 %elem7 to <2 x i16> 26*9880d681SAndroid Build Coastguard Worker %hlow0 = shufflevector <2 x i16> %hboth0, <2 x i16> %hboth1, 27*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 28*9880d681SAndroid Build Coastguard Worker %hlow1 = shufflevector <2 x i16> %hboth2, <2 x i16> %hboth3, 29*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 30*9880d681SAndroid Build Coastguard Worker %hlow2 = shufflevector <2 x i16> %hboth4, <2 x i16> %hboth5, 31*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 32*9880d681SAndroid Build Coastguard Worker %hlow3 = shufflevector <2 x i16> %hboth6, <2 x i16> %hboth7, 33*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 34*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <2 x i16> %hlow0, <2 x i16> %hlow1, 35*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 0, i32 1, i32 2, i32 3> 36*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <2 x i16> %hlow2, <2 x i16> %hlow3, 37*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 0, i32 1, i32 2, i32 3> 38*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <4 x i16> %join0, <4 x i16> %join1, 39*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 0, i32 1, i32 2, i32 3, 40*9880d681SAndroid Build Coastguard Worker i32 4, i32 5, i32 6, i32 7> 41*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; A different way of writing a <4 x i32> -> <8 x i16> pack. 45*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f2(<4 x i32> %val0, <4 x i32> %val1) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 47*9880d681SAndroid Build Coastguard Worker; CHECK: vpkf %v24, %v24, %v26 48*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 49*9880d681SAndroid Build Coastguard Worker %elem0 = extractelement <4 x i32> %val0, i32 0 50*9880d681SAndroid Build Coastguard Worker %elem1 = extractelement <4 x i32> %val0, i32 1 51*9880d681SAndroid Build Coastguard Worker %elem2 = extractelement <4 x i32> %val0, i32 2 52*9880d681SAndroid Build Coastguard Worker %elem3 = extractelement <4 x i32> %val0, i32 3 53*9880d681SAndroid Build Coastguard Worker %elem4 = extractelement <4 x i32> %val1, i32 0 54*9880d681SAndroid Build Coastguard Worker %elem5 = extractelement <4 x i32> %val1, i32 1 55*9880d681SAndroid Build Coastguard Worker %elem6 = extractelement <4 x i32> %val1, i32 2 56*9880d681SAndroid Build Coastguard Worker %elem7 = extractelement <4 x i32> %val1, i32 3 57*9880d681SAndroid Build Coastguard Worker %wvec0 = insertelement <4 x i32> undef, i32 %elem0, i32 0 58*9880d681SAndroid Build Coastguard Worker %wvec1 = insertelement <4 x i32> undef, i32 %elem1, i32 0 59*9880d681SAndroid Build Coastguard Worker %wvec2 = insertelement <4 x i32> undef, i32 %elem2, i32 0 60*9880d681SAndroid Build Coastguard Worker %wvec3 = insertelement <4 x i32> undef, i32 %elem3, i32 0 61*9880d681SAndroid Build Coastguard Worker %wvec4 = insertelement <4 x i32> undef, i32 %elem4, i32 0 62*9880d681SAndroid Build Coastguard Worker %wvec5 = insertelement <4 x i32> undef, i32 %elem5, i32 0 63*9880d681SAndroid Build Coastguard Worker %wvec6 = insertelement <4 x i32> undef, i32 %elem6, i32 0 64*9880d681SAndroid Build Coastguard Worker %wvec7 = insertelement <4 x i32> undef, i32 %elem7, i32 0 65*9880d681SAndroid Build Coastguard Worker %hvec0 = bitcast <4 x i32> %wvec0 to <8 x i16> 66*9880d681SAndroid Build Coastguard Worker %hvec1 = bitcast <4 x i32> %wvec1 to <8 x i16> 67*9880d681SAndroid Build Coastguard Worker %hvec2 = bitcast <4 x i32> %wvec2 to <8 x i16> 68*9880d681SAndroid Build Coastguard Worker %hvec3 = bitcast <4 x i32> %wvec3 to <8 x i16> 69*9880d681SAndroid Build Coastguard Worker %hvec4 = bitcast <4 x i32> %wvec4 to <8 x i16> 70*9880d681SAndroid Build Coastguard Worker %hvec5 = bitcast <4 x i32> %wvec5 to <8 x i16> 71*9880d681SAndroid Build Coastguard Worker %hvec6 = bitcast <4 x i32> %wvec6 to <8 x i16> 72*9880d681SAndroid Build Coastguard Worker %hvec7 = bitcast <4 x i32> %wvec7 to <8 x i16> 73*9880d681SAndroid Build Coastguard Worker %hlow0 = shufflevector <8 x i16> %hvec0, <8 x i16> %hvec1, 74*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 9, i32 undef, i32 undef, 75*9880d681SAndroid Build Coastguard Worker i32 undef, i32 undef, i32 undef, i32 undef> 76*9880d681SAndroid Build Coastguard Worker %hlow1 = shufflevector <8 x i16> %hvec2, <8 x i16> %hvec3, 77*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 9, i32 undef, i32 undef, 78*9880d681SAndroid Build Coastguard Worker i32 undef, i32 undef, i32 undef, i32 undef> 79*9880d681SAndroid Build Coastguard Worker %hlow2 = shufflevector <8 x i16> %hvec4, <8 x i16> %hvec5, 80*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 9, i32 undef, i32 undef, 81*9880d681SAndroid Build Coastguard Worker i32 undef, i32 undef, i32 undef, i32 undef> 82*9880d681SAndroid Build Coastguard Worker %hlow3 = shufflevector <8 x i16> %hvec6, <8 x i16> %hvec7, 83*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 9, i32 undef, i32 undef, 84*9880d681SAndroid Build Coastguard Worker i32 undef, i32 undef, i32 undef, i32 undef> 85*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <8 x i16> %hlow0, <8 x i16> %hlow1, 86*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 0, i32 1, i32 8, i32 9, 87*9880d681SAndroid Build Coastguard Worker i32 undef, i32 undef, i32 undef, i32 undef> 88*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <8 x i16> %hlow2, <8 x i16> %hlow3, 89*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 0, i32 1, i32 8, i32 9, 90*9880d681SAndroid Build Coastguard Worker i32 undef, i32 undef, i32 undef, i32 undef> 91*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <8 x i16> %join0, <8 x i16> %join1, 92*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 0, i32 1, i32 2, i32 3, 93*9880d681SAndroid Build Coastguard Worker i32 8, i32 9, i32 10, i32 11> 94*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; A direct pack operation. 98*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f3(<4 x i32> %val0, <4 x i32> %val1) { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 100*9880d681SAndroid Build Coastguard Worker; CHECK: vpkf %v24, %v24, %v26 101*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 102*9880d681SAndroid Build Coastguard Worker %bitcast0 = bitcast <4 x i32> %val0 to <8 x i16> 103*9880d681SAndroid Build Coastguard Worker %bitcast1 = bitcast <4 x i32> %val1 to <8 x i16> 104*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <8 x i16> %bitcast0, <8 x i16> %bitcast1, 105*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 3, i32 5, i32 7, 106*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15> 107*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; One way of writing a <4 x i32> -> <16 x i8> pack. It doesn't matter 111*9880d681SAndroid Build Coastguard Worker; whether the first pack is VPKF or VPKH since the even bytes of the 112*9880d681SAndroid Build Coastguard Worker; result are discarded. 113*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f4(<4 x i32> %val0, <4 x i32> %val1, 114*9880d681SAndroid Build Coastguard Worker <4 x i32> %val2, <4 x i32> %val3) { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 116*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hf]}} [[REG1:%v[0-9]+]], %v24, %v26 117*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hf]}} [[REG2:%v[0-9]+]], %v28, %v30 118*9880d681SAndroid Build Coastguard Worker; CHECK: vpkh %v24, [[REG1]], [[REG2]] 119*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 120*9880d681SAndroid Build Coastguard Worker %bitcast0 = bitcast <4 x i32> %val0 to <8 x i16> 121*9880d681SAndroid Build Coastguard Worker %bitcast1 = bitcast <4 x i32> %val1 to <8 x i16> 122*9880d681SAndroid Build Coastguard Worker %bitcast2 = bitcast <4 x i32> %val2 to <8 x i16> 123*9880d681SAndroid Build Coastguard Worker %bitcast3 = bitcast <4 x i32> %val3 to <8 x i16> 124*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <8 x i16> %bitcast0, <8 x i16> %bitcast1, 125*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 3, i32 5, i32 7, 126*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15> 127*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <8 x i16> %bitcast2, <8 x i16> %bitcast3, 128*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 3, i32 5, i32 7, 129*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15> 130*9880d681SAndroid Build Coastguard Worker %bitcast4 = bitcast <8 x i16> %join0 to <16 x i8> 131*9880d681SAndroid Build Coastguard Worker %bitcast5 = bitcast <8 x i16> %join1 to <16 x i8> 132*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <16 x i8> %bitcast4, <16 x i8> %bitcast5, 133*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 1, i32 3, i32 5, i32 7, 134*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15, 135*9880d681SAndroid Build Coastguard Worker i32 17, i32 19, i32 21, i32 23, 136*9880d681SAndroid Build Coastguard Worker i32 25, i32 27, i32 29, i32 31> 137*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; Check the same operation, but with elements being extracted from the result. 141*9880d681SAndroid Build Coastguard Workerdefine void @f5(<4 x i32> %val0, <4 x i32> %val1, 142*9880d681SAndroid Build Coastguard Worker <4 x i32> %val2, <4 x i32> %val3, 143*9880d681SAndroid Build Coastguard Worker i8 *%base) { 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 145*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vsteb %v24, 0(%r2), 11 146*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vsteb %v26, 1(%r2), 15 147*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vsteb %v28, 2(%r2), 3 148*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vsteb %v30, 3(%r2), 7 149*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 150*9880d681SAndroid Build Coastguard Worker %bitcast0 = bitcast <4 x i32> %val0 to <8 x i16> 151*9880d681SAndroid Build Coastguard Worker %bitcast1 = bitcast <4 x i32> %val1 to <8 x i16> 152*9880d681SAndroid Build Coastguard Worker %bitcast2 = bitcast <4 x i32> %val2 to <8 x i16> 153*9880d681SAndroid Build Coastguard Worker %bitcast3 = bitcast <4 x i32> %val3 to <8 x i16> 154*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <8 x i16> %bitcast0, <8 x i16> %bitcast1, 155*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 3, i32 5, i32 7, 156*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15> 157*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <8 x i16> %bitcast2, <8 x i16> %bitcast3, 158*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 3, i32 5, i32 7, 159*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15> 160*9880d681SAndroid Build Coastguard Worker %bitcast4 = bitcast <8 x i16> %join0 to <16 x i8> 161*9880d681SAndroid Build Coastguard Worker %bitcast5 = bitcast <8 x i16> %join1 to <16 x i8> 162*9880d681SAndroid Build Coastguard Worker %vec = shufflevector <16 x i8> %bitcast4, <16 x i8> %bitcast5, 163*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 1, i32 3, i32 5, i32 7, 164*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15, 165*9880d681SAndroid Build Coastguard Worker i32 17, i32 19, i32 21, i32 23, 166*9880d681SAndroid Build Coastguard Worker i32 25, i32 27, i32 29, i32 31> 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker %ptr0 = getelementptr i8, i8 *%base, i64 0 169*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr i8, i8 *%base, i64 1 170*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%base, i64 2 171*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr i8, i8 *%base, i64 3 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker %byte0 = extractelement <16 x i8> %vec, i32 2 174*9880d681SAndroid Build Coastguard Worker %byte1 = extractelement <16 x i8> %vec, i32 7 175*9880d681SAndroid Build Coastguard Worker %byte2 = extractelement <16 x i8> %vec, i32 8 176*9880d681SAndroid Build Coastguard Worker %byte3 = extractelement <16 x i8> %vec, i32 13 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker store i8 %byte0, i8 *%ptr0 179*9880d681SAndroid Build Coastguard Worker store i8 %byte1, i8 *%ptr1 180*9880d681SAndroid Build Coastguard Worker store i8 %byte2, i8 *%ptr2 181*9880d681SAndroid Build Coastguard Worker store i8 %byte3, i8 *%ptr3 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker ret void 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker; A different way of writing a <4 x i32> -> <16 x i8> pack. 187*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f6(<4 x i32> %val0, <4 x i32> %val1, 188*9880d681SAndroid Build Coastguard Worker <4 x i32> %val2, <4 x i32> %val3) { 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 190*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hf]}} [[REG1:%v[0-9]+]], %v24, %v26 191*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hf]}} [[REG2:%v[0-9]+]], %v28, %v30 192*9880d681SAndroid Build Coastguard Worker; CHECK: vpkh %v24, [[REG1]], [[REG2]] 193*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 194*9880d681SAndroid Build Coastguard Worker %elem0 = extractelement <4 x i32> %val0, i32 0 195*9880d681SAndroid Build Coastguard Worker %elem1 = extractelement <4 x i32> %val0, i32 1 196*9880d681SAndroid Build Coastguard Worker %elem2 = extractelement <4 x i32> %val0, i32 2 197*9880d681SAndroid Build Coastguard Worker %elem3 = extractelement <4 x i32> %val0, i32 3 198*9880d681SAndroid Build Coastguard Worker %elem4 = extractelement <4 x i32> %val1, i32 0 199*9880d681SAndroid Build Coastguard Worker %elem5 = extractelement <4 x i32> %val1, i32 1 200*9880d681SAndroid Build Coastguard Worker %elem6 = extractelement <4 x i32> %val1, i32 2 201*9880d681SAndroid Build Coastguard Worker %elem7 = extractelement <4 x i32> %val1, i32 3 202*9880d681SAndroid Build Coastguard Worker %elem8 = extractelement <4 x i32> %val2, i32 0 203*9880d681SAndroid Build Coastguard Worker %elem9 = extractelement <4 x i32> %val2, i32 1 204*9880d681SAndroid Build Coastguard Worker %elem10 = extractelement <4 x i32> %val2, i32 2 205*9880d681SAndroid Build Coastguard Worker %elem11 = extractelement <4 x i32> %val2, i32 3 206*9880d681SAndroid Build Coastguard Worker %elem12 = extractelement <4 x i32> %val3, i32 0 207*9880d681SAndroid Build Coastguard Worker %elem13 = extractelement <4 x i32> %val3, i32 1 208*9880d681SAndroid Build Coastguard Worker %elem14 = extractelement <4 x i32> %val3, i32 2 209*9880d681SAndroid Build Coastguard Worker %elem15 = extractelement <4 x i32> %val3, i32 3 210*9880d681SAndroid Build Coastguard Worker %bitcast0 = bitcast i32 %elem0 to <2 x i16> 211*9880d681SAndroid Build Coastguard Worker %bitcast1 = bitcast i32 %elem1 to <2 x i16> 212*9880d681SAndroid Build Coastguard Worker %bitcast2 = bitcast i32 %elem2 to <2 x i16> 213*9880d681SAndroid Build Coastguard Worker %bitcast3 = bitcast i32 %elem3 to <2 x i16> 214*9880d681SAndroid Build Coastguard Worker %bitcast4 = bitcast i32 %elem4 to <2 x i16> 215*9880d681SAndroid Build Coastguard Worker %bitcast5 = bitcast i32 %elem5 to <2 x i16> 216*9880d681SAndroid Build Coastguard Worker %bitcast6 = bitcast i32 %elem6 to <2 x i16> 217*9880d681SAndroid Build Coastguard Worker %bitcast7 = bitcast i32 %elem7 to <2 x i16> 218*9880d681SAndroid Build Coastguard Worker %bitcast8 = bitcast i32 %elem8 to <2 x i16> 219*9880d681SAndroid Build Coastguard Worker %bitcast9 = bitcast i32 %elem9 to <2 x i16> 220*9880d681SAndroid Build Coastguard Worker %bitcast10 = bitcast i32 %elem10 to <2 x i16> 221*9880d681SAndroid Build Coastguard Worker %bitcast11 = bitcast i32 %elem11 to <2 x i16> 222*9880d681SAndroid Build Coastguard Worker %bitcast12 = bitcast i32 %elem12 to <2 x i16> 223*9880d681SAndroid Build Coastguard Worker %bitcast13 = bitcast i32 %elem13 to <2 x i16> 224*9880d681SAndroid Build Coastguard Worker %bitcast14 = bitcast i32 %elem14 to <2 x i16> 225*9880d681SAndroid Build Coastguard Worker %bitcast15 = bitcast i32 %elem15 to <2 x i16> 226*9880d681SAndroid Build Coastguard Worker %low0 = shufflevector <2 x i16> %bitcast0, <2 x i16> %bitcast1, 227*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 228*9880d681SAndroid Build Coastguard Worker %low1 = shufflevector <2 x i16> %bitcast2, <2 x i16> %bitcast3, 229*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 230*9880d681SAndroid Build Coastguard Worker %low2 = shufflevector <2 x i16> %bitcast4, <2 x i16> %bitcast5, 231*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 232*9880d681SAndroid Build Coastguard Worker %low3 = shufflevector <2 x i16> %bitcast6, <2 x i16> %bitcast7, 233*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 234*9880d681SAndroid Build Coastguard Worker %low4 = shufflevector <2 x i16> %bitcast8, <2 x i16> %bitcast9, 235*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 236*9880d681SAndroid Build Coastguard Worker %low5 = shufflevector <2 x i16> %bitcast10, <2 x i16> %bitcast11, 237*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 238*9880d681SAndroid Build Coastguard Worker %low6 = shufflevector <2 x i16> %bitcast12, <2 x i16> %bitcast13, 239*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 240*9880d681SAndroid Build Coastguard Worker %low7 = shufflevector <2 x i16> %bitcast14, <2 x i16> %bitcast15, 241*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 242*9880d681SAndroid Build Coastguard Worker %bytes0 = bitcast <2 x i16> %low0 to <4 x i8> 243*9880d681SAndroid Build Coastguard Worker %bytes1 = bitcast <2 x i16> %low1 to <4 x i8> 244*9880d681SAndroid Build Coastguard Worker %bytes2 = bitcast <2 x i16> %low2 to <4 x i8> 245*9880d681SAndroid Build Coastguard Worker %bytes3 = bitcast <2 x i16> %low3 to <4 x i8> 246*9880d681SAndroid Build Coastguard Worker %bytes4 = bitcast <2 x i16> %low4 to <4 x i8> 247*9880d681SAndroid Build Coastguard Worker %bytes5 = bitcast <2 x i16> %low5 to <4 x i8> 248*9880d681SAndroid Build Coastguard Worker %bytes6 = bitcast <2 x i16> %low6 to <4 x i8> 249*9880d681SAndroid Build Coastguard Worker %bytes7 = bitcast <2 x i16> %low7 to <4 x i8> 250*9880d681SAndroid Build Coastguard Worker %blow0 = shufflevector <4 x i8> %bytes0, <4 x i8> %bytes1, 251*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 252*9880d681SAndroid Build Coastguard Worker %blow1 = shufflevector <4 x i8> %bytes2, <4 x i8> %bytes3, 253*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 254*9880d681SAndroid Build Coastguard Worker %blow2 = shufflevector <4 x i8> %bytes4, <4 x i8> %bytes5, 255*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 256*9880d681SAndroid Build Coastguard Worker %blow3 = shufflevector <4 x i8> %bytes6, <4 x i8> %bytes7, 257*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 258*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <4 x i8> %blow0, <4 x i8> %blow1, 259*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 0, i32 1, i32 2, i32 3, 260*9880d681SAndroid Build Coastguard Worker i32 4, i32 5, i32 6, i32 7> 261*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <4 x i8> %blow2, <4 x i8> %blow3, 262*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 0, i32 1, i32 2, i32 3, 263*9880d681SAndroid Build Coastguard Worker i32 4, i32 5, i32 6, i32 7> 264*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <8 x i8> %join0, <8 x i8> %join1, 265*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 0, i32 1, i32 2, i32 3, 266*9880d681SAndroid Build Coastguard Worker i32 4, i32 5, i32 6, i32 7, 267*9880d681SAndroid Build Coastguard Worker i32 8, i32 9, i32 10, i32 11, 268*9880d681SAndroid Build Coastguard Worker i32 12, i32 13, i32 14, i32 15> 269*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 270*9880d681SAndroid Build Coastguard Worker} 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Worker; One way of writing a <2 x i64> -> <16 x i8> pack. 273*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f7(<2 x i64> %val0, <2 x i64> %val1, 274*9880d681SAndroid Build Coastguard Worker <2 x i64> %val2, <2 x i64> %val3, 275*9880d681SAndroid Build Coastguard Worker <2 x i64> %val4, <2 x i64> %val5, 276*9880d681SAndroid Build Coastguard Worker <2 x i64> %val6, <2 x i64> %val7) { 277*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 278*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hfg]}} [[REG1:%v[0-9]+]], %v24, %v26 279*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hfg]}} [[REG2:%v[0-9]+]], %v28, %v30 280*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hfg]}} [[REG3:%v[0-9]+]], %v25, %v27 281*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hfg]}} [[REG4:%v[0-9]+]], %v29, %v31 282*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hf]}} [[REG5:%v[0-9]+]], [[REG1]], [[REG2]] 283*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vpk{{[hf]}} [[REG6:%v[0-9]+]], [[REG3]], [[REG4]] 284*9880d681SAndroid Build Coastguard Worker; CHECK: vpkh %v24, [[REG5]], [[REG6]] 285*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 286*9880d681SAndroid Build Coastguard Worker %elem0 = extractelement <2 x i64> %val0, i32 0 287*9880d681SAndroid Build Coastguard Worker %elem1 = extractelement <2 x i64> %val0, i32 1 288*9880d681SAndroid Build Coastguard Worker %elem2 = extractelement <2 x i64> %val1, i32 0 289*9880d681SAndroid Build Coastguard Worker %elem3 = extractelement <2 x i64> %val1, i32 1 290*9880d681SAndroid Build Coastguard Worker %elem4 = extractelement <2 x i64> %val2, i32 0 291*9880d681SAndroid Build Coastguard Worker %elem5 = extractelement <2 x i64> %val2, i32 1 292*9880d681SAndroid Build Coastguard Worker %elem6 = extractelement <2 x i64> %val3, i32 0 293*9880d681SAndroid Build Coastguard Worker %elem7 = extractelement <2 x i64> %val3, i32 1 294*9880d681SAndroid Build Coastguard Worker %elem8 = extractelement <2 x i64> %val4, i32 0 295*9880d681SAndroid Build Coastguard Worker %elem9 = extractelement <2 x i64> %val4, i32 1 296*9880d681SAndroid Build Coastguard Worker %elem10 = extractelement <2 x i64> %val5, i32 0 297*9880d681SAndroid Build Coastguard Worker %elem11 = extractelement <2 x i64> %val5, i32 1 298*9880d681SAndroid Build Coastguard Worker %elem12 = extractelement <2 x i64> %val6, i32 0 299*9880d681SAndroid Build Coastguard Worker %elem13 = extractelement <2 x i64> %val6, i32 1 300*9880d681SAndroid Build Coastguard Worker %elem14 = extractelement <2 x i64> %val7, i32 0 301*9880d681SAndroid Build Coastguard Worker %elem15 = extractelement <2 x i64> %val7, i32 1 302*9880d681SAndroid Build Coastguard Worker %bitcast0 = bitcast i64 %elem0 to <2 x i32> 303*9880d681SAndroid Build Coastguard Worker %bitcast1 = bitcast i64 %elem1 to <2 x i32> 304*9880d681SAndroid Build Coastguard Worker %bitcast2 = bitcast i64 %elem2 to <2 x i32> 305*9880d681SAndroid Build Coastguard Worker %bitcast3 = bitcast i64 %elem3 to <2 x i32> 306*9880d681SAndroid Build Coastguard Worker %bitcast4 = bitcast i64 %elem4 to <2 x i32> 307*9880d681SAndroid Build Coastguard Worker %bitcast5 = bitcast i64 %elem5 to <2 x i32> 308*9880d681SAndroid Build Coastguard Worker %bitcast6 = bitcast i64 %elem6 to <2 x i32> 309*9880d681SAndroid Build Coastguard Worker %bitcast7 = bitcast i64 %elem7 to <2 x i32> 310*9880d681SAndroid Build Coastguard Worker %bitcast8 = bitcast i64 %elem8 to <2 x i32> 311*9880d681SAndroid Build Coastguard Worker %bitcast9 = bitcast i64 %elem9 to <2 x i32> 312*9880d681SAndroid Build Coastguard Worker %bitcast10 = bitcast i64 %elem10 to <2 x i32> 313*9880d681SAndroid Build Coastguard Worker %bitcast11 = bitcast i64 %elem11 to <2 x i32> 314*9880d681SAndroid Build Coastguard Worker %bitcast12 = bitcast i64 %elem12 to <2 x i32> 315*9880d681SAndroid Build Coastguard Worker %bitcast13 = bitcast i64 %elem13 to <2 x i32> 316*9880d681SAndroid Build Coastguard Worker %bitcast14 = bitcast i64 %elem14 to <2 x i32> 317*9880d681SAndroid Build Coastguard Worker %bitcast15 = bitcast i64 %elem15 to <2 x i32> 318*9880d681SAndroid Build Coastguard Worker %low0 = shufflevector <2 x i32> %bitcast0, <2 x i32> %bitcast1, 319*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 320*9880d681SAndroid Build Coastguard Worker %low1 = shufflevector <2 x i32> %bitcast2, <2 x i32> %bitcast3, 321*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 322*9880d681SAndroid Build Coastguard Worker %low2 = shufflevector <2 x i32> %bitcast4, <2 x i32> %bitcast5, 323*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 324*9880d681SAndroid Build Coastguard Worker %low3 = shufflevector <2 x i32> %bitcast6, <2 x i32> %bitcast7, 325*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 326*9880d681SAndroid Build Coastguard Worker %low4 = shufflevector <2 x i32> %bitcast8, <2 x i32> %bitcast9, 327*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 328*9880d681SAndroid Build Coastguard Worker %low5 = shufflevector <2 x i32> %bitcast10, <2 x i32> %bitcast11, 329*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 330*9880d681SAndroid Build Coastguard Worker %low6 = shufflevector <2 x i32> %bitcast12, <2 x i32> %bitcast13, 331*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 332*9880d681SAndroid Build Coastguard Worker %low7 = shufflevector <2 x i32> %bitcast14, <2 x i32> %bitcast15, 333*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 1, i32 3> 334*9880d681SAndroid Build Coastguard Worker %half0 = bitcast <2 x i32> %low0 to <4 x i16> 335*9880d681SAndroid Build Coastguard Worker %half1 = bitcast <2 x i32> %low1 to <4 x i16> 336*9880d681SAndroid Build Coastguard Worker %half2 = bitcast <2 x i32> %low2 to <4 x i16> 337*9880d681SAndroid Build Coastguard Worker %half3 = bitcast <2 x i32> %low3 to <4 x i16> 338*9880d681SAndroid Build Coastguard Worker %half4 = bitcast <2 x i32> %low4 to <4 x i16> 339*9880d681SAndroid Build Coastguard Worker %half5 = bitcast <2 x i32> %low5 to <4 x i16> 340*9880d681SAndroid Build Coastguard Worker %half6 = bitcast <2 x i32> %low6 to <4 x i16> 341*9880d681SAndroid Build Coastguard Worker %half7 = bitcast <2 x i32> %low7 to <4 x i16> 342*9880d681SAndroid Build Coastguard Worker %hlow0 = shufflevector <4 x i16> %half0, <4 x i16> %half1, 343*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 344*9880d681SAndroid Build Coastguard Worker %hlow1 = shufflevector <4 x i16> %half2, <4 x i16> %half3, 345*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 346*9880d681SAndroid Build Coastguard Worker %hlow2 = shufflevector <4 x i16> %half4, <4 x i16> %half5, 347*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 348*9880d681SAndroid Build Coastguard Worker %hlow3 = shufflevector <4 x i16> %half6, <4 x i16> %half7, 349*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 350*9880d681SAndroid Build Coastguard Worker %bytes0 = bitcast <4 x i16> %hlow0 to <8 x i8> 351*9880d681SAndroid Build Coastguard Worker %bytes1 = bitcast <4 x i16> %hlow1 to <8 x i8> 352*9880d681SAndroid Build Coastguard Worker %bytes2 = bitcast <4 x i16> %hlow2 to <8 x i8> 353*9880d681SAndroid Build Coastguard Worker %bytes3 = bitcast <4 x i16> %hlow3 to <8 x i8> 354*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <8 x i8> %bytes0, <8 x i8> %bytes1, 355*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 3, i32 5, i32 7, 356*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15> 357*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <8 x i8> %bytes2, <8 x i8> %bytes3, 358*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 3, i32 5, i32 7, 359*9880d681SAndroid Build Coastguard Worker i32 9, i32 11, i32 13, i32 15> 360*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <8 x i8> %join0, <8 x i8> %join1, 361*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 0, i32 1, i32 2, i32 3, 362*9880d681SAndroid Build Coastguard Worker i32 4, i32 5, i32 6, i32 7, 363*9880d681SAndroid Build Coastguard Worker i32 8, i32 9, i32 10, i32 11, 364*9880d681SAndroid Build Coastguard Worker i32 12, i32 13, i32 14, i32 15> 365*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker; Test a <2 x i64> -> <4 x f32> pack in which only individual elements are 369*9880d681SAndroid Build Coastguard Worker; needed. 370*9880d681SAndroid Build Coastguard Workerdefine float @f8(i64 %scalar0, i64 %scalar1, i64 %scalar2, i64 %scalar3) { 371*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 372*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vperm 373*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpk 374*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmrh 375*9880d681SAndroid Build Coastguard Worker; CHECK: aebr {{%f[0-7]}}, 376*9880d681SAndroid Build Coastguard Worker; CHECK: aebr {{%f[0-7]}}, 377*9880d681SAndroid Build Coastguard Worker; CHECK: meebr %f0, 378*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 379*9880d681SAndroid Build Coastguard Worker %vec0 = insertelement <2 x i64> undef, i64 %scalar0, i32 0 380*9880d681SAndroid Build Coastguard Worker %vec1 = insertelement <2 x i64> undef, i64 %scalar1, i32 0 381*9880d681SAndroid Build Coastguard Worker %vec2 = insertelement <2 x i64> undef, i64 %scalar2, i32 0 382*9880d681SAndroid Build Coastguard Worker %vec3 = insertelement <2 x i64> undef, i64 %scalar3, i32 0 383*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <2 x i64> %vec0, <2 x i64> %vec1, 384*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 0, i32 2> 385*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <2 x i64> %vec2, <2 x i64> %vec3, 386*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 0, i32 2> 387*9880d681SAndroid Build Coastguard Worker %bitcast0 = bitcast <2 x i64> %join0 to <4 x float> 388*9880d681SAndroid Build Coastguard Worker %bitcast1 = bitcast <2 x i64> %join1 to <4 x float> 389*9880d681SAndroid Build Coastguard Worker %pack = shufflevector <4 x float> %bitcast0, <4 x float> %bitcast1, 390*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 391*9880d681SAndroid Build Coastguard Worker %elt0 = extractelement <4 x float> %pack, i32 0 392*9880d681SAndroid Build Coastguard Worker %elt1 = extractelement <4 x float> %pack, i32 1 393*9880d681SAndroid Build Coastguard Worker %elt2 = extractelement <4 x float> %pack, i32 2 394*9880d681SAndroid Build Coastguard Worker %elt3 = extractelement <4 x float> %pack, i32 3 395*9880d681SAndroid Build Coastguard Worker %add0 = fadd float %elt0, %elt2 396*9880d681SAndroid Build Coastguard Worker %add1 = fadd float %elt1, %elt3 397*9880d681SAndroid Build Coastguard Worker %ret = fmul float %add0, %add1 398*9880d681SAndroid Build Coastguard Worker ret float %ret 399*9880d681SAndroid Build Coastguard Worker} 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker; Test a <2 x f64> -> <4 x i32> pack in which only individual elements are 402*9880d681SAndroid Build Coastguard Worker; needed. 403*9880d681SAndroid Build Coastguard Workerdefine i32 @f9(double %scalar0, double %scalar1, double %scalar2, 404*9880d681SAndroid Build Coastguard Worker double %scalar3) { 405*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 406*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vperm 407*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpk 408*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmrh 409*9880d681SAndroid Build Coastguard Worker; CHECK: ar {{%r[0-5]}}, 410*9880d681SAndroid Build Coastguard Worker; CHECK: ar {{%r[0-5]}}, 411*9880d681SAndroid Build Coastguard Worker; CHECK: or %r2, 412*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 413*9880d681SAndroid Build Coastguard Worker %vec0 = insertelement <2 x double> undef, double %scalar0, i32 0 414*9880d681SAndroid Build Coastguard Worker %vec1 = insertelement <2 x double> undef, double %scalar1, i32 0 415*9880d681SAndroid Build Coastguard Worker %vec2 = insertelement <2 x double> undef, double %scalar2, i32 0 416*9880d681SAndroid Build Coastguard Worker %vec3 = insertelement <2 x double> undef, double %scalar3, i32 0 417*9880d681SAndroid Build Coastguard Worker %join0 = shufflevector <2 x double> %vec0, <2 x double> %vec1, 418*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 0, i32 2> 419*9880d681SAndroid Build Coastguard Worker %join1 = shufflevector <2 x double> %vec2, <2 x double> %vec3, 420*9880d681SAndroid Build Coastguard Worker <2 x i32> <i32 0, i32 2> 421*9880d681SAndroid Build Coastguard Worker %bitcast0 = bitcast <2 x double> %join0 to <4 x i32> 422*9880d681SAndroid Build Coastguard Worker %bitcast1 = bitcast <2 x double> %join1 to <4 x i32> 423*9880d681SAndroid Build Coastguard Worker %pack = shufflevector <4 x i32> %bitcast0, <4 x i32> %bitcast1, 424*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 3, i32 5, i32 7> 425*9880d681SAndroid Build Coastguard Worker %elt0 = extractelement <4 x i32> %pack, i32 0 426*9880d681SAndroid Build Coastguard Worker %elt1 = extractelement <4 x i32> %pack, i32 1 427*9880d681SAndroid Build Coastguard Worker %elt2 = extractelement <4 x i32> %pack, i32 2 428*9880d681SAndroid Build Coastguard Worker %elt3 = extractelement <4 x i32> %pack, i32 3 429*9880d681SAndroid Build Coastguard Worker %add0 = add i32 %elt0, %elt2 430*9880d681SAndroid Build Coastguard Worker %add1 = add i32 %elt1, %elt3 431*9880d681SAndroid Build Coastguard Worker %ret = or i32 %add0, %add1 432*9880d681SAndroid Build Coastguard Worker ret i32 %ret 433*9880d681SAndroid Build Coastguard Worker} 434