3
3
; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4
4
5
5
define <8 x i16 > @test_sshll_v8i8 (<8 x i8 > %a ) {
6
- ; CHECK-SD-LABEL: test_sshll_v8i8:
7
- ; CHECK-SD: // %bb.0:
8
- ; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #3
9
- ; CHECK-SD-NEXT: ret
10
- ;
11
- ; CHECK-GI-LABEL: test_sshll_v8i8:
12
- ; CHECK-GI: // %bb.0:
13
- ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
14
- ; CHECK-GI-NEXT: shl v0.8h, v0.8h, #3
15
- ; CHECK-GI-NEXT: ret
6
+ ; CHECK-LABEL: test_sshll_v8i8:
7
+ ; CHECK: // %bb.0:
8
+ ; CHECK-NEXT: sshll v0.8h, v0.8b, #3
9
+ ; CHECK-NEXT: ret
16
10
%1 = sext <8 x i8 > %a to <8 x i16 >
17
11
%tmp = shl <8 x i16 > %1 , <i16 3 , i16 3 , i16 3 , i16 3 , i16 3 , i16 3 , i16 3 , i16 3 >
18
12
ret <8 x i16 > %tmp
@@ -36,16 +30,10 @@ define <8 x i16> @test_sshll_v8i8_big(<8 x i8> %a) {
36
30
}
37
31
38
32
define <4 x i32 > @test_sshll_v4i16 (<4 x i16 > %a ) {
39
- ; CHECK-SD-LABEL: test_sshll_v4i16:
40
- ; CHECK-SD: // %bb.0:
41
- ; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #9
42
- ; CHECK-SD-NEXT: ret
43
- ;
44
- ; CHECK-GI-LABEL: test_sshll_v4i16:
45
- ; CHECK-GI: // %bb.0:
46
- ; CHECK-GI-NEXT: sshll v0.4s, v0.4h, #0
47
- ; CHECK-GI-NEXT: shl v0.4s, v0.4s, #9
48
- ; CHECK-GI-NEXT: ret
33
+ ; CHECK-LABEL: test_sshll_v4i16:
34
+ ; CHECK: // %bb.0:
35
+ ; CHECK-NEXT: sshll v0.4s, v0.4h, #9
36
+ ; CHECK-NEXT: ret
49
37
%1 = sext <4 x i16 > %a to <4 x i32 >
50
38
%tmp = shl <4 x i32 > %1 , <i32 9 , i32 9 , i32 9 , i32 9 >
51
39
ret <4 x i32 > %tmp
@@ -69,16 +57,10 @@ define <4 x i32> @test_sshll_v4i16_big(<4 x i16> %a) {
69
57
}
70
58
71
59
define <2 x i64 > @test_sshll_v2i32 (<2 x i32 > %a ) {
72
- ; CHECK-SD-LABEL: test_sshll_v2i32:
73
- ; CHECK-SD: // %bb.0:
74
- ; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #19
75
- ; CHECK-SD-NEXT: ret
76
- ;
77
- ; CHECK-GI-LABEL: test_sshll_v2i32:
78
- ; CHECK-GI: // %bb.0:
79
- ; CHECK-GI-NEXT: sshll v0.2d, v0.2s, #0
80
- ; CHECK-GI-NEXT: shl v0.2d, v0.2d, #19
81
- ; CHECK-GI-NEXT: ret
60
+ ; CHECK-LABEL: test_sshll_v2i32:
61
+ ; CHECK: // %bb.0:
62
+ ; CHECK-NEXT: sshll v0.2d, v0.2s, #19
63
+ ; CHECK-NEXT: ret
82
64
%1 = sext <2 x i32 > %a to <2 x i64 >
83
65
%tmp = shl <2 x i64 > %1 , <i64 19 , i64 19 >
84
66
ret <2 x i64 > %tmp
@@ -102,16 +84,10 @@ define <2 x i64> @test_sshll_v2i32_big(<2 x i32> %a) {
102
84
}
103
85
104
86
define <8 x i16 > @test_ushll_v8i8 (<8 x i8 > %a ) {
105
- ; CHECK-SD-LABEL: test_ushll_v8i8:
106
- ; CHECK-SD: // %bb.0:
107
- ; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #3
108
- ; CHECK-SD-NEXT: ret
109
- ;
110
- ; CHECK-GI-LABEL: test_ushll_v8i8:
111
- ; CHECK-GI: // %bb.0:
112
- ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
113
- ; CHECK-GI-NEXT: shl v0.8h, v0.8h, #3
114
- ; CHECK-GI-NEXT: ret
87
+ ; CHECK-LABEL: test_ushll_v8i8:
88
+ ; CHECK: // %bb.0:
89
+ ; CHECK-NEXT: ushll v0.8h, v0.8b, #3
90
+ ; CHECK-NEXT: ret
115
91
%1 = zext <8 x i8 > %a to <8 x i16 >
116
92
%tmp = shl <8 x i16 > %1 , <i16 3 , i16 3 , i16 3 , i16 3 , i16 3 , i16 3 , i16 3 , i16 3 >
117
93
ret <8 x i16 > %tmp
@@ -129,16 +105,10 @@ define <8 x i16> @test_ushll_v8i8_big(<8 x i8> %a) {
129
105
}
130
106
131
107
define <4 x i32 > @test_ushll_v4i16 (<4 x i16 > %a ) {
132
- ; CHECK-SD-LABEL: test_ushll_v4i16:
133
- ; CHECK-SD: // %bb.0:
134
- ; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #9
135
- ; CHECK-SD-NEXT: ret
136
- ;
137
- ; CHECK-GI-LABEL: test_ushll_v4i16:
138
- ; CHECK-GI: // %bb.0:
139
- ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
140
- ; CHECK-GI-NEXT: shl v0.4s, v0.4s, #9
141
- ; CHECK-GI-NEXT: ret
108
+ ; CHECK-LABEL: test_ushll_v4i16:
109
+ ; CHECK: // %bb.0:
110
+ ; CHECK-NEXT: ushll v0.4s, v0.4h, #9
111
+ ; CHECK-NEXT: ret
142
112
%1 = zext <4 x i16 > %a to <4 x i32 >
143
113
%tmp = shl <4 x i32 > %1 , <i32 9 , i32 9 , i32 9 , i32 9 >
144
114
ret <4 x i32 > %tmp
@@ -156,16 +126,10 @@ define <4 x i32> @test_ushll_v4i16_big(<4 x i16> %a) {
156
126
}
157
127
158
128
define <2 x i64 > @test_ushll_v2i32 (<2 x i32 > %a ) {
159
- ; CHECK-SD-LABEL: test_ushll_v2i32:
160
- ; CHECK-SD: // %bb.0:
161
- ; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #19
162
- ; CHECK-SD-NEXT: ret
163
- ;
164
- ; CHECK-GI-LABEL: test_ushll_v2i32:
165
- ; CHECK-GI: // %bb.0:
166
- ; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #0
167
- ; CHECK-GI-NEXT: shl v0.2d, v0.2d, #19
168
- ; CHECK-GI-NEXT: ret
129
+ ; CHECK-LABEL: test_ushll_v2i32:
130
+ ; CHECK: // %bb.0:
131
+ ; CHECK-NEXT: ushll v0.2d, v0.2s, #19
132
+ ; CHECK-NEXT: ret
169
133
%1 = zext <2 x i32 > %a to <2 x i64 >
170
134
%tmp = shl <2 x i64 > %1 , <i64 19 , i64 19 >
171
135
ret <2 x i64 > %tmp
@@ -190,8 +154,8 @@ define <8 x i16> @test_sshll2_v16i8(<16 x i8> %a) {
190
154
;
191
155
; CHECK-GI-LABEL: test_sshll2_v16i8:
192
156
; CHECK-GI: // %bb.0:
193
- ; CHECK-GI-NEXT: sshll2 v0.8h , v0.16b, #0
194
- ; CHECK-GI-NEXT: shl v0.8h, v0.8h , #3
157
+ ; CHECK-GI-NEXT: mov d0 , v0.d[1]
158
+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b , #3
195
159
; CHECK-GI-NEXT: ret
196
160
%1 = shufflevector <16 x i8 > %a , <16 x i8 > undef , <8 x i32 > <i32 8 , i32 9 , i32 10 , i32 11 , i32 12 , i32 13 , i32 14 , i32 15 >
197
161
%2 = sext <8 x i8 > %1 to <8 x i16 >
@@ -225,8 +189,8 @@ define <4 x i32> @test_sshll2_v8i16(<8 x i16> %a) {
225
189
;
226
190
; CHECK-GI-LABEL: test_sshll2_v8i16:
227
191
; CHECK-GI: // %bb.0:
228
- ; CHECK-GI-NEXT: sshll2 v0.4s , v0.8h, #0
229
- ; CHECK-GI-NEXT: shl v0.4s, v0.4s , #9
192
+ ; CHECK-GI-NEXT: mov d0 , v0.d[1]
193
+ ; CHECK-GI-NEXT: sshll v0.4s, v0.4h , #9
230
194
; CHECK-GI-NEXT: ret
231
195
%1 = shufflevector <8 x i16 > %a , <8 x i16 > undef , <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
232
196
%2 = sext <4 x i16 > %1 to <4 x i32 >
@@ -260,8 +224,8 @@ define <2 x i64> @test_sshll2_v4i32(<4 x i32> %a) {
260
224
;
261
225
; CHECK-GI-LABEL: test_sshll2_v4i32:
262
226
; CHECK-GI: // %bb.0:
263
- ; CHECK-GI-NEXT: sshll2 v0.2d , v0.4s, #0
264
- ; CHECK-GI-NEXT: shl v0.2d, v0.2d , #19
227
+ ; CHECK-GI-NEXT: mov d0 , v0.d[1]
228
+ ; CHECK-GI-NEXT: sshll v0.2d, v0.2s , #19
265
229
; CHECK-GI-NEXT: ret
266
230
%1 = shufflevector <4 x i32 > %a , <4 x i32 > undef , <2 x i32 > <i32 2 , i32 3 >
267
231
%2 = sext <2 x i32 > %1 to <2 x i64 >
@@ -295,8 +259,8 @@ define <8 x i16> @test_ushll2_v16i8(<16 x i8> %a) {
295
259
;
296
260
; CHECK-GI-LABEL: test_ushll2_v16i8:
297
261
; CHECK-GI: // %bb.0:
298
- ; CHECK-GI-NEXT: ushll2 v0.8h , v0.16b, #0
299
- ; CHECK-GI-NEXT: shl v0.8h, v0.8h , #3
262
+ ; CHECK-GI-NEXT: mov d0 , v0.d[1]
263
+ ; CHECK-GI-NEXT: ushll v0.8h, v0.8b , #3
300
264
; CHECK-GI-NEXT: ret
301
265
%1 = shufflevector <16 x i8 > %a , <16 x i8 > undef , <8 x i32 > <i32 8 , i32 9 , i32 10 , i32 11 , i32 12 , i32 13 , i32 14 , i32 15 >
302
266
%2 = zext <8 x i8 > %1 to <8 x i16 >
@@ -324,8 +288,8 @@ define <4 x i32> @test_ushll2_v8i16(<8 x i16> %a) {
324
288
;
325
289
; CHECK-GI-LABEL: test_ushll2_v8i16:
326
290
; CHECK-GI: // %bb.0:
327
- ; CHECK-GI-NEXT: ushll2 v0.4s , v0.8h, #0
328
- ; CHECK-GI-NEXT: shl v0.4s, v0.4s , #9
291
+ ; CHECK-GI-NEXT: mov d0 , v0.d[1]
292
+ ; CHECK-GI-NEXT: ushll v0.4s, v0.4h , #9
329
293
; CHECK-GI-NEXT: ret
330
294
%1 = shufflevector <8 x i16 > %a , <8 x i16 > undef , <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
331
295
%2 = zext <4 x i16 > %1 to <4 x i32 >
@@ -353,8 +317,8 @@ define <2 x i64> @test_ushll2_v4i32(<4 x i32> %a) {
353
317
;
354
318
; CHECK-GI-LABEL: test_ushll2_v4i32:
355
319
; CHECK-GI: // %bb.0:
356
- ; CHECK-GI-NEXT: ushll2 v0.2d , v0.4s, #0
357
- ; CHECK-GI-NEXT: shl v0.2d, v0.2d , #19
320
+ ; CHECK-GI-NEXT: mov d0 , v0.d[1]
321
+ ; CHECK-GI-NEXT: ushll v0.2d, v0.2s , #19
358
322
; CHECK-GI-NEXT: ret
359
323
%1 = shufflevector <4 x i32 > %a , <4 x i32 > undef , <2 x i32 > <i32 2 , i32 3 >
360
324
%2 = zext <2 x i32 > %1 to <2 x i64 >
0 commit comments