xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/vshll.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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