1*9880d681SAndroid Build Coastguard Worker; Test vector shift left with scalar shift amount. 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 by a variable. 6*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f1(<16 x i8> %dummy, <16 x i8> %val1, i32 %shift) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: veslb %v24, %v26, 0(%r2) 9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 10*9880d681SAndroid Build Coastguard Worker %truncshift = trunc i32 %shift to i8 11*9880d681SAndroid Build Coastguard Worker %shiftvec = insertelement <16 x i8> undef, i8 %truncshift, i32 0 12*9880d681SAndroid Build Coastguard Worker %val2 = shufflevector <16 x i8> %shiftvec, <16 x i8> undef, 13*9880d681SAndroid Build Coastguard Worker <16 x i32> zeroinitializer 14*9880d681SAndroid Build Coastguard Worker %ret = shl <16 x i8> %val1, %val2 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 by the lowest useful constant. 19*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f2(<16 x i8> %dummy, <16 x i8> %val) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: veslb %v24, %v26, 1 22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 23*9880d681SAndroid Build Coastguard Worker %ret = shl <16 x i8> %val, <i8 1, i8 1, i8 1, i8 1, 24*9880d681SAndroid Build Coastguard Worker i8 1, i8 1, i8 1, i8 1, 25*9880d681SAndroid Build Coastguard Worker i8 1, i8 1, i8 1, i8 1, 26*9880d681SAndroid Build Coastguard Worker i8 1, i8 1, i8 1, i8 1> 27*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; Test a v16i8 shift by the highest useful constant. 31*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f3(<16 x i8> %dummy, <16 x i8> %val) { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 33*9880d681SAndroid Build Coastguard Worker; CHECK: veslb %v24, %v26, 7 34*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 35*9880d681SAndroid Build Coastguard Worker %ret = shl <16 x i8> %val, <i8 7, i8 7, i8 7, i8 7, 36*9880d681SAndroid Build Coastguard Worker i8 7, i8 7, i8 7, i8 7, 37*9880d681SAndroid Build Coastguard Worker i8 7, i8 7, i8 7, i8 7, 38*9880d681SAndroid Build Coastguard Worker i8 7, i8 7, i8 7, i8 7> 39*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %ret 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; Test a v8i16 shift by a variable. 43*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f4(<8 x i16> %dummy, <8 x i16> %val1, i32 %shift) { 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 45*9880d681SAndroid Build Coastguard Worker; CHECK: veslh %v24, %v26, 0(%r2) 46*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 47*9880d681SAndroid Build Coastguard Worker %truncshift = trunc i32 %shift to i16 48*9880d681SAndroid Build Coastguard Worker %shiftvec = insertelement <8 x i16> undef, i16 %truncshift, i32 0 49*9880d681SAndroid Build Coastguard Worker %val2 = shufflevector <8 x i16> %shiftvec, <8 x i16> undef, 50*9880d681SAndroid Build Coastguard Worker <8 x i32> zeroinitializer 51*9880d681SAndroid Build Coastguard Worker %ret = shl <8 x i16> %val1, %val2 52*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Test a v8i16 shift by the lowest useful constant. 56*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f5(<8 x i16> %dummy, <8 x i16> %val) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 58*9880d681SAndroid Build Coastguard Worker; CHECK: veslh %v24, %v26, 1 59*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 60*9880d681SAndroid Build Coastguard Worker %ret = shl <8 x i16> %val, <i16 1, i16 1, i16 1, i16 1, 61*9880d681SAndroid Build Coastguard Worker i16 1, i16 1, i16 1, i16 1> 62*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; Test a v8i16 shift by the highest useful constant. 66*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f6(<8 x i16> %dummy, <8 x i16> %val) { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 68*9880d681SAndroid Build Coastguard Worker; CHECK: veslh %v24, %v26, 15 69*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 70*9880d681SAndroid Build Coastguard Worker %ret = shl <8 x i16> %val, <i16 15, i16 15, i16 15, i16 15, 71*9880d681SAndroid Build Coastguard Worker i16 15, i16 15, i16 15, i16 15> 72*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %ret 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; Test a v4i32 shift by a variable. 76*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f7(<4 x i32> %dummy, <4 x i32> %val1, i32 %shift) { 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 78*9880d681SAndroid Build Coastguard Worker; CHECK: veslf %v24, %v26, 0(%r2) 79*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 80*9880d681SAndroid Build Coastguard Worker %shiftvec = insertelement <4 x i32> undef, i32 %shift, i32 0 81*9880d681SAndroid Build Coastguard Worker %val2 = shufflevector <4 x i32> %shiftvec, <4 x i32> undef, 82*9880d681SAndroid Build Coastguard Worker <4 x i32> zeroinitializer 83*9880d681SAndroid Build Coastguard Worker %ret = shl <4 x i32> %val1, %val2 84*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %ret 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; Test a v4i32 shift by the lowest useful constant. 88*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f8(<4 x i32> %dummy, <4 x i32> %val) { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 90*9880d681SAndroid Build Coastguard Worker; CHECK: veslf %v24, %v26, 1 91*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 92*9880d681SAndroid Build Coastguard Worker %ret = shl <4 x i32> %val, <i32 1, i32 1, i32 1, i32 1> 93*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %ret 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; Test a v4i32 shift by the highest useful constant. 97*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f9(<4 x i32> %dummy, <4 x i32> %val) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 99*9880d681SAndroid Build Coastguard Worker; CHECK: veslf %v24, %v26, 31 100*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 101*9880d681SAndroid Build Coastguard Worker %ret = shl <4 x i32> %val, <i32 31, i32 31, i32 31, i32 31> 102*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %ret 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Test a v2i64 shift by a variable. 106*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f10(<2 x i64> %dummy, <2 x i64> %val1, i32 %shift) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 108*9880d681SAndroid Build Coastguard Worker; CHECK: veslg %v24, %v26, 0(%r2) 109*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 110*9880d681SAndroid Build Coastguard Worker %extshift = sext i32 %shift to i64 111*9880d681SAndroid Build Coastguard Worker %shiftvec = insertelement <2 x i64> undef, i64 %extshift, i32 0 112*9880d681SAndroid Build Coastguard Worker %val2 = shufflevector <2 x i64> %shiftvec, <2 x i64> undef, 113*9880d681SAndroid Build Coastguard Worker <2 x i32> zeroinitializer 114*9880d681SAndroid Build Coastguard Worker %ret = shl <2 x i64> %val1, %val2 115*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %ret 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; Test a v2i64 shift by the lowest useful constant. 119*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f11(<2 x i64> %dummy, <2 x i64> %val) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 121*9880d681SAndroid Build Coastguard Worker; CHECK: veslg %v24, %v26, 1 122*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 123*9880d681SAndroid Build Coastguard Worker %ret = shl <2 x i64> %val, <i64 1, i64 1> 124*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %ret 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; Test a v2i64 shift by the highest useful constant. 128*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f12(<2 x i64> %dummy, <2 x i64> %val) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 130*9880d681SAndroid Build Coastguard Worker; CHECK: veslg %v24, %v26, 63 131*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 132*9880d681SAndroid Build Coastguard Worker %ret = shl <2 x i64> %val, <i64 63, i64 63> 133*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %ret 134*9880d681SAndroid Build Coastguard Worker} 135