1*9880d681SAndroid Build Coastguard Worker; RUN: llc -aarch64-shift-insert-generation=true -march=arm64 -aarch64-neon-syntax=apple < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @testLeftGood(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testLeftGood: 5*9880d681SAndroid Build Coastguard Worker; CHECK: sli.16b v0, v1, #3 6*9880d681SAndroid Build Coastguard Worker %and.i = and <16 x i8> %src1, <i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252> 7*9880d681SAndroid Build Coastguard Worker %vshl_n = shl <16 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 8*9880d681SAndroid Build Coastguard Worker %result = or <16 x i8> %and.i, %vshl_n 9*9880d681SAndroid Build Coastguard Worker store <16 x i8> %result, <16 x i8>* %dest, align 16 10*9880d681SAndroid Build Coastguard Worker ret void 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine void @testLeftBad(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testLeftBad: 15*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sli 16*9880d681SAndroid Build Coastguard Worker %and.i = and <16 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165> 17*9880d681SAndroid Build Coastguard Worker %vshl_n = shl <16 x i8> %src2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 18*9880d681SAndroid Build Coastguard Worker %result = or <16 x i8> %and.i, %vshl_n 19*9880d681SAndroid Build Coastguard Worker store <16 x i8> %result, <16 x i8>* %dest, align 16 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine void @testRightGood(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind { 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testRightGood: 25*9880d681SAndroid Build Coastguard Worker; CHECK: sri.16b v0, v1, #3 26*9880d681SAndroid Build Coastguard Worker %and.i = and <16 x i8> %src1, <i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252, i8 252> 27*9880d681SAndroid Build Coastguard Worker %vshl_n = lshr <16 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 28*9880d681SAndroid Build Coastguard Worker %result = or <16 x i8> %and.i, %vshl_n 29*9880d681SAndroid Build Coastguard Worker store <16 x i8> %result, <16 x i8>* %dest, align 16 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine void @testRightBad(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testRightBad: 35*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sri 36*9880d681SAndroid Build Coastguard Worker %and.i = and <16 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165> 37*9880d681SAndroid Build Coastguard Worker %vshl_n = lshr <16 x i8> %src2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 38*9880d681SAndroid Build Coastguard Worker %result = or <16 x i8> %and.i, %vshl_n 39*9880d681SAndroid Build Coastguard Worker store <16 x i8> %result, <16 x i8>* %dest, align 16 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42