xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-subvector-extend.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -asm-verbose=false | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test efficient codegen of vector extends up from legal type to 128 bit
4*9880d681SAndroid Build Coastguard Worker; and 256 bit vector types.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker;-----
7*9880d681SAndroid Build Coastguard Worker; Vectors of i16.
8*9880d681SAndroid Build Coastguard Worker;-----
9*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @func1(<8 x i8> %v0) nounwind {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func1:
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.8h  v0, v0, #0
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
13*9880d681SAndroid Build Coastguard Worker  %r = zext <8 x i8> %v0 to <8 x i16>
14*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %r
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @func2(<8 x i8> %v0) nounwind {
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func2:
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h  v0, v0, #0
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
21*9880d681SAndroid Build Coastguard Worker  %r = sext <8 x i8> %v0 to <8 x i16>
22*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %r
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @func3(<16 x i8> %v0) nounwind {
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func3:
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.8h  v1, v0, #0
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.8h  v0, v0, #0
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
30*9880d681SAndroid Build Coastguard Worker  %r = zext <16 x i8> %v0 to <16 x i16>
31*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %r
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @func4(<16 x i8> %v0) nounwind {
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func4:
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.8h  v1, v0, #0
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h  v0, v0, #0
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
39*9880d681SAndroid Build Coastguard Worker  %r = sext <16 x i8> %v0 to <16 x i16>
40*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %r
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker;-----
44*9880d681SAndroid Build Coastguard Worker; Vectors of i32.
45*9880d681SAndroid Build Coastguard Worker;-----
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @afunc1(<4 x i16> %v0) nounwind {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc1:
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, v0, #0
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
51*9880d681SAndroid Build Coastguard Worker  %r = zext <4 x i16> %v0 to <4 x i32>
52*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %r
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @afunc2(<4 x i16> %v0) nounwind {
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc2:
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v0, v0, #0
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
59*9880d681SAndroid Build Coastguard Worker  %r = sext <4 x i16> %v0 to <4 x i32>
60*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %r
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @afunc3(<8 x i16> %v0) nounwind {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc3:
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.4s v1, v0, #0
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, v0, #0
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
68*9880d681SAndroid Build Coastguard Worker  %r = zext <8 x i16> %v0 to <8 x i32>
69*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %r
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @afunc4(<8 x i16> %v0) nounwind {
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: afunc4:
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.4s v1, v0, #0
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v0, v0, #0
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
77*9880d681SAndroid Build Coastguard Worker  %r = sext <8 x i16> %v0 to <8 x i32>
78*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %r
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @bfunc1(<8 x i8> %v0) nounwind {
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bfunc1:
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.8h  v0, v0, #0
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.4s v1, v0, #0
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s  v0, v0, #0
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
87*9880d681SAndroid Build Coastguard Worker  %r = zext <8 x i8> %v0 to <8 x i32>
88*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %r
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @bfunc2(<8 x i8> %v0) nounwind {
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bfunc2:
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h  v0, v0, #0
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.4s v1, v0, #0
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s  v0, v0, #0
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
97*9880d681SAndroid Build Coastguard Worker  %r = sext <8 x i8> %v0 to <8 x i32>
98*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %r
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker;-----
102*9880d681SAndroid Build Coastguard Worker; Vectors of i64.
103*9880d681SAndroid Build Coastguard Worker;-----
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @zfunc1(<4 x i32> %v0) nounwind {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zfunc1:
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.2d v1, v0, #0
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.2d v0, v0, #0
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
110*9880d681SAndroid Build Coastguard Worker  %r = zext <4 x i32> %v0 to <4 x i64>
111*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %r
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @zfunc2(<4 x i32> %v0) nounwind {
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zfunc2:
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.2d v1, v0, #0
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v0, v0, #0
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
119*9880d681SAndroid Build Coastguard Worker  %r = sext <4 x i32> %v0 to <4 x i64>
120*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %r
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @bfunc3(<4 x i16> %v0) nounwind {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func3:
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s  v0, v0, #0
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll2.2d v1, v0, #0
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.2d  v0, v0, #0
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
129*9880d681SAndroid Build Coastguard Worker  %r = zext <4 x i16> %v0 to <4 x i64>
130*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %r
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @cfunc4(<4 x i16> %v0) nounwind {
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: func4:
135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s  v0, v0, #0
136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll2.2d v1, v0, #0
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d  v0, v0, #0
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
139*9880d681SAndroid Build Coastguard Worker  %r = sext <4 x i16> %v0 to <4 x i64>
140*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %r
141*9880d681SAndroid Build Coastguard Worker}
142