1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vshlls8(<8 x i8>* %A) nounwind { 4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshlls8: 5*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.s8 6*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 7*9880d681SAndroid Build Coastguard Worker %sext = sext <8 x i8> %tmp1 to <8 x i16> 8*9880d681SAndroid Build Coastguard Worker %shift = shl <8 x i16> %sext, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 9*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %shift 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vshlls16(<4 x i16>* %A) nounwind { 13*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshlls16: 14*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.s16 15*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 16*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i16> %tmp1 to <4 x i32> 17*9880d681SAndroid Build Coastguard Worker %shift = shl <4 x i32> %sext, <i32 15, i32 15, i32 15, i32 15> 18*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %shift 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vshlls32(<2 x i32>* %A) nounwind { 22*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshlls32: 23*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.s32 24*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 25*9880d681SAndroid Build Coastguard Worker %sext = sext <2 x i32> %tmp1 to <2 x i64> 26*9880d681SAndroid Build Coastguard Worker %shift = shl <2 x i64> %sext, <i64 31, i64 31> 27*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %shift 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vshllu8(<8 x i8>* %A) nounwind { 31*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshllu8: 32*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.u8 33*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 34*9880d681SAndroid Build Coastguard Worker %zext = zext <8 x i8> %tmp1 to <8 x i16> 35*9880d681SAndroid Build Coastguard Worker %shift = shl <8 x i16> %zext, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 36*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %shift 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vshllu16(<4 x i16>* %A) nounwind { 40*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshllu16: 41*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.u16 42*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 43*9880d681SAndroid Build Coastguard Worker %zext = zext <4 x i16> %tmp1 to <4 x i32> 44*9880d681SAndroid Build Coastguard Worker %shift = shl <4 x i32> %zext, <i32 15, i32 15, i32 15, i32 15> 45*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %shift 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vshllu32(<2 x i32>* %A) nounwind { 49*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshllu32: 50*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.u32 51*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 52*9880d681SAndroid Build Coastguard Worker %zext = zext <2 x i32> %tmp1 to <2 x i64> 53*9880d681SAndroid Build Coastguard Worker %shift = shl <2 x i64> %zext, <i64 31, i64 31> 54*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %shift 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; The following tests use the maximum shift count, so the signedness is 58*9880d681SAndroid Build Coastguard Worker; irrelevant. Test both signed and unsigned versions. 59*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vshlli8(<8 x i8>* %A) nounwind { 60*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshlli8: 61*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.i8 62*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 63*9880d681SAndroid Build Coastguard Worker %sext = sext <8 x i8> %tmp1 to <8 x i16> 64*9880d681SAndroid Build Coastguard Worker %shift = shl <8 x i16> %sext, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> 65*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %shift 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vshlli16(<4 x i16>* %A) nounwind { 69*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshlli16: 70*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.i16 71*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 72*9880d681SAndroid Build Coastguard Worker %zext = zext <4 x i16> %tmp1 to <4 x i32> 73*9880d681SAndroid Build Coastguard Worker %shift = shl <4 x i32> %zext, <i32 16, i32 16, i32 16, i32 16> 74*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %shift 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vshlli32(<2 x i32>* %A) nounwind { 78*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshlli32: 79*9880d681SAndroid Build Coastguard Worker;CHECK: vshll.i32 80*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 81*9880d681SAndroid Build Coastguard Worker %zext = zext <2 x i32> %tmp1 to <2 x i64> 82*9880d681SAndroid Build Coastguard Worker %shift = shl <2 x i64> %zext, <i64 32, i64 32> 83*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %shift 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; And these have a shift just out of range so separate vmovl and vshl 87*9880d681SAndroid Build Coastguard Worker; instructions are needed. 88*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vshllu8_bad(<8 x i8>* %A) nounwind { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vshllu8_bad: 90*9880d681SAndroid Build Coastguard Worker; CHECK: vmovl.u8 91*9880d681SAndroid Build Coastguard Worker; CHECK: vshl.i16 92*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 93*9880d681SAndroid Build Coastguard Worker %zext = zext <8 x i8> %tmp1 to <8 x i16> 94*9880d681SAndroid Build Coastguard Worker %shift = shl <8 x i16> %zext, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9> 95*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %shift 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vshlls16_bad(<4 x i16>* %A) nounwind { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vshlls16_bad: 100*9880d681SAndroid Build Coastguard Worker; CHECK: vmovl.s16 101*9880d681SAndroid Build Coastguard Worker; CHECK: vshl.i32 102*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 103*9880d681SAndroid Build Coastguard Worker %sext = sext <4 x i16> %tmp1 to <4 x i32> 104*9880d681SAndroid Build Coastguard Worker %shift = shl <4 x i32> %sext, <i32 17, i32 17, i32 17, i32 17> 105*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %shift 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vshllu32_bad(<2 x i32>* %A) nounwind { 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vshllu32_bad: 110*9880d681SAndroid Build Coastguard Worker; CHECK: vmovl.u32 111*9880d681SAndroid Build Coastguard Worker; CHECK: vshl.i64 112*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 113*9880d681SAndroid Build Coastguard Worker %zext = zext <2 x i32> %tmp1 to <2 x i64> 114*9880d681SAndroid Build Coastguard Worker %shift = shl <2 x i64> %zext, <i64 33, i64 33> 115*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %shift 116*9880d681SAndroid Build Coastguard Worker} 117