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