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 i8> @vshrns8(<8 x i16>* %A) nounwind { 4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshrns8: 5*9880d681SAndroid Build Coastguard Worker;CHECK: vshrn.i16 6*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %A 7*9880d681SAndroid Build Coastguard Worker %tmp2 = lshr <8 x i16> %tmp1, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> 8*9880d681SAndroid Build Coastguard Worker %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8> 9*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp3 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vshrns16(<4 x i32>* %A) nounwind { 13*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshrns16: 14*9880d681SAndroid Build Coastguard Worker;CHECK: vshrn.i32 15*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %A 16*9880d681SAndroid Build Coastguard Worker %tmp2 = ashr <4 x i32> %tmp1, <i32 16, i32 16, i32 16, i32 16> 17*9880d681SAndroid Build Coastguard Worker %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16> 18*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp3 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vshrns32(<2 x i64>* %A) nounwind { 22*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vshrns32: 23*9880d681SAndroid Build Coastguard Worker;CHECK: vshrn.i64 24*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i64>, <2 x i64>* %A 25*9880d681SAndroid Build Coastguard Worker %tmp2 = ashr <2 x i64> %tmp1, <i64 32, i64 32> 26*9880d681SAndroid Build Coastguard Worker %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32> 27*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp3 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vshrns8_bad(<8 x i16>* %A) nounwind { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vshrns8_bad: 32*9880d681SAndroid Build Coastguard Worker; CHECK: vshr.s16 33*9880d681SAndroid Build Coastguard Worker; CHECK: vmovn.i16 34*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %A 35*9880d681SAndroid Build Coastguard Worker %tmp2 = ashr <8 x i16> %tmp1, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9> 36*9880d681SAndroid Build Coastguard Worker %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8> 37*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp3 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vshrns16_bad(<4 x i32>* %A) nounwind { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vshrns16_bad: 42*9880d681SAndroid Build Coastguard Worker; CHECK: vshr.u32 43*9880d681SAndroid Build Coastguard Worker; CHECK: vmovn.i32 44*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %A 45*9880d681SAndroid Build Coastguard Worker %tmp2 = lshr <4 x i32> %tmp1, <i32 17, i32 17, i32 17, i32 17> 46*9880d681SAndroid Build Coastguard Worker %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16> 47*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp3 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vshrns32_bad(<2 x i64>* %A) nounwind { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vshrns32_bad: 52*9880d681SAndroid Build Coastguard Worker; CHECK: vshr.u64 53*9880d681SAndroid Build Coastguard Worker; CHECK: vmovn.i64 54*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i64>, <2 x i64>* %A 55*9880d681SAndroid Build Coastguard Worker %tmp2 = lshr <2 x i64> %tmp1, <i64 33, i64 33> 56*9880d681SAndroid Build Coastguard Worker %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32> 57*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp3 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vrshrns8(<8 x i16>* %A) nounwind { 61*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vrshrns8: 62*9880d681SAndroid Build Coastguard Worker;CHECK: vrshrn.i16 63*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %A 64*9880d681SAndroid Build Coastguard Worker %tmp2 = call <8 x i8> @llvm.arm.neon.vrshiftn.v8i8(<8 x i16> %tmp1, <8 x i16> < i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8 >) 65*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vrshrns16(<4 x i32>* %A) nounwind { 69*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vrshrns16: 70*9880d681SAndroid Build Coastguard Worker;CHECK: vrshrn.i32 71*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %A 72*9880d681SAndroid Build Coastguard Worker %tmp2 = call <4 x i16> @llvm.arm.neon.vrshiftn.v4i16(<4 x i32> %tmp1, <4 x i32> < i32 -16, i32 -16, i32 -16, i32 -16 >) 73*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vrshrns32(<2 x i64>* %A) nounwind { 77*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vrshrns32: 78*9880d681SAndroid Build Coastguard Worker;CHECK: vrshrn.i64 79*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i64>, <2 x i64>* %A 80*9880d681SAndroid Build Coastguard Worker %tmp2 = call <2 x i32> @llvm.arm.neon.vrshiftn.v2i32(<2 x i64> %tmp1, <2 x i64> < i64 -32, i64 -32 >) 81*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.arm.neon.vrshiftn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone 85*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.arm.neon.vrshiftn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone 86*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.arm.neon.vrshiftn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone 87