1*9880d681SAndroid Build Coastguard Worker; Test vector shift left double immediate. 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; Test a v16i8 shift with the lowest useful shift amount. 6*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f1(<16 x i8> %val1, <16 x i8> %val2) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 1 9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 10*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 11*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 1, i32 2, i32 3, i32 4, 12*9880d681SAndroid Build Coastguard Worker i32 5, i32 6, i32 7, i32 8, 13*9880d681SAndroid Build Coastguard Worker i32 9, i32 10, i32 11, i32 12, 14*9880d681SAndroid Build Coastguard Worker i32 13, i32 14, i32 15, i32 16> 15*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Test a v16i8 shift with the highest shift amount. 19*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f2(<16 x i8> %val1, <16 x i8> %val2) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 15 22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 23*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 24*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 15, i32 16, i32 17, i32 18, 25*9880d681SAndroid Build Coastguard Worker i32 19, i32 20, i32 21, i32 22, 26*9880d681SAndroid Build Coastguard Worker i32 23, i32 24, i32 25, i32 26, 27*9880d681SAndroid Build Coastguard Worker i32 27, i32 28, i32 29, i32 30> 28*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; Test a v16i8 shift in which the operands need to be reversed. 32*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f3(<16 x i8> %val1, <16 x i8> %val2) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v26, %v24, 4 35*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 36*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 37*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 20, i32 21, i32 22, i32 23, 38*9880d681SAndroid Build Coastguard Worker i32 24, i32 25, i32 26, i32 27, 39*9880d681SAndroid Build Coastguard Worker i32 28, i32 29, i32 30, i32 31, 40*9880d681SAndroid Build Coastguard Worker i32 0, i32 1, i32 2, i32 3> 41*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Test a v16i8 shift in which the operands need to be duplicated. 45*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f4(<16 x i8> %val) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v24, 7 48*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 49*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <16 x i8> %val, <16 x i8> undef, 50*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 7, i32 8, i32 9, i32 10, 51*9880d681SAndroid Build Coastguard Worker i32 11, i32 12, i32 13, i32 14, 52*9880d681SAndroid Build Coastguard Worker i32 15, i32 0, i32 1, i32 2, 53*9880d681SAndroid Build Coastguard Worker i32 3, i32 4, i32 5, i32 6> 54*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; Test a v16i8 shift in which some of the indices are undefs. 58*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f5(<16 x i8> %val1, <16 x i8> %val2) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 60*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 11 61*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 62*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 63*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, 64*9880d681SAndroid Build Coastguard Worker i32 15, i32 16, i32 undef, i32 18, 65*9880d681SAndroid Build Coastguard Worker i32 19, i32 20, i32 21, i32 22, 66*9880d681SAndroid Build Coastguard Worker i32 23, i32 24, i32 25, i32 26> 67*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; ...and again with reversed operands. 71*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f6(<16 x i8> %val1, <16 x i8> %val2) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 73*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v26, %v24, 13 74*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 75*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 76*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 undef, i32 undef, i32 31, i32 0, 77*9880d681SAndroid Build Coastguard Worker i32 1, i32 2, i32 3, i32 4, 78*9880d681SAndroid Build Coastguard Worker i32 5, i32 6, i32 7, i32 8, 79*9880d681SAndroid Build Coastguard Worker i32 9, i32 10, i32 11, i32 12> 80*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; Test a v8i16 shift with the lowest useful shift amount. 84*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f7(<8 x i16> %val1, <8 x i16> %val2) { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 86*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 2 87*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 88*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <8 x i16> %val1, <8 x i16> %val2, 89*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 1, i32 2, i32 3, i32 4, 90*9880d681SAndroid Build Coastguard Worker i32 5, i32 6, i32 7, i32 8> 91*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; Test a v8i16 shift with the highest useful shift amount. 95*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f8(<8 x i16> %val1, <8 x i16> %val2) { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 97*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 14 98*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 99*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <8 x i16> %val1, <8 x i16> %val2, 100*9880d681SAndroid Build Coastguard Worker <8 x i32> <i32 7, i32 8, i32 9, i32 10, 101*9880d681SAndroid Build Coastguard Worker i32 11, i32 12, i32 13, i32 14> 102*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Test a v4i32 shift with the lowest useful shift amount. 106*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f9(<4 x i32> %val1, <4 x i32> %val2) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 108*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 4 109*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 110*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <4 x i32> %val1, <4 x i32> %val2, 111*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 2, i32 3, i32 4> 112*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %ret 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; Test a v4i32 shift with the highest useful shift amount. 116*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f10(<4 x i32> %val1, <4 x i32> %val2) { 117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 118*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 12 119*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 120*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <4 x i32> %val1, <4 x i32> %val2, 121*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 3, i32 4, i32 5, i32 6> 122*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %ret 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; Test a v4f32 shift with the lowest useful shift amount. 126*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f12(<4 x float> %val1, <4 x float> %val2) { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 128*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 4 129*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 130*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <4 x float> %val1, <4 x float> %val2, 131*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 1, i32 2, i32 3, i32 4> 132*9880d681SAndroid Build Coastguard Worker ret <4 x float> %ret 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; Test a v4f32 shift with the highest useful shift amount. 136*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f13(<4 x float> %val1, <4 x float> %val2) { 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 138*9880d681SAndroid Build Coastguard Worker; CHECK: vsldb %v24, %v24, %v26, 12 139*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 140*9880d681SAndroid Build Coastguard Worker %ret = shufflevector <4 x float> %val1, <4 x float> %val2, 141*9880d681SAndroid Build Coastguard Worker <4 x i32> <i32 3, i32 4, i32 5, i32 6> 142*9880d681SAndroid Build Coastguard Worker ret <4 x float> %ret 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; We use VPDI for v2i64 shuffles. 146