1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
- ; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK
2
+ ; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3
+ ; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
3
4
4
5
define <2 x i32 > @and_extract_zext_idx0 (<4 x i16 > %vec ) nounwind {
5
- ; CHECK-LABEL: and_extract_zext_idx0:
6
- ; CHECK: // %bb.0:
7
- ; CHECK-NEXT: ushll v0.4s, v0.4h, #0
8
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
9
- ; CHECK-NEXT: ret
6
+ ; CHECK-SD-LABEL: and_extract_zext_idx0:
7
+ ; CHECK-SD: // %bb.0:
8
+ ; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0
9
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
10
+ ; CHECK-SD-NEXT: ret
11
+ ;
12
+ ; CHECK-GI-LABEL: and_extract_zext_idx0:
13
+ ; CHECK-GI: // %bb.0:
14
+ ; CHECK-GI-NEXT: movi d1, #0x00ffff0000ffff
15
+ ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
16
+ ; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
17
+ ; CHECK-GI-NEXT: ret
10
18
%zext = zext <4 x i16 > %vec to <4 x i32 >
11
19
%extract = call <2 x i32 > @llvm.vector.extract.v2i32.v4i32 (<4 x i32 > %zext , i64 0 )
12
20
%and = and <2 x i32 > %extract , <i32 65535 , i32 65535 >
13
21
ret <2 x i32 > %and
14
22
}
15
23
16
24
define <4 x i16 > @and_extract_sext_idx0 (<8 x i8 > %vec ) nounwind {
17
- ; CHECK-LABEL: and_extract_sext_idx0:
18
- ; CHECK: // %bb.0:
19
- ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
20
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
21
- ; CHECK-NEXT: ret
25
+ ; CHECK-SD-LABEL: and_extract_sext_idx0:
26
+ ; CHECK-SD: // %bb.0:
27
+ ; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #0
28
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
29
+ ; CHECK-SD-NEXT: ret
30
+ ;
31
+ ; CHECK-GI-LABEL: and_extract_sext_idx0:
32
+ ; CHECK-GI: // %bb.0:
33
+ ; CHECK-GI-NEXT: movi d1, #0xff00ff00ff00ff
34
+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
35
+ ; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
36
+ ; CHECK-GI-NEXT: ret
22
37
%sext = sext <8 x i8 > %vec to <8 x i16 >
23
38
%extract = call <4 x i16 > @llvm.vector.extract.v4i16.v8i16 (<8 x i16 > %sext , i64 0 )
24
39
%and = and <4 x i16 > %extract , <i16 255 , i16 255 , i16 255 , i16 255 >
25
40
ret <4 x i16 > %and
26
41
}
27
42
28
43
define <2 x i32 > @and_extract_zext_idx2 (<4 x i16 > %vec ) nounwind {
29
- ; CHECK-LABEL: and_extract_zext_idx2:
30
- ; CHECK: // %bb.0:
31
- ; CHECK-NEXT: ushll v0.4s, v0.4h, #0
32
- ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
33
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
34
- ; CHECK-NEXT: ret
44
+ ; CHECK-SD-LABEL: and_extract_zext_idx2:
45
+ ; CHECK-SD: // %bb.0:
46
+ ; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0
47
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
48
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
49
+ ; CHECK-SD-NEXT: ret
50
+ ;
51
+ ; CHECK-GI-LABEL: and_extract_zext_idx2:
52
+ ; CHECK-GI: // %bb.0:
53
+ ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
54
+ ; CHECK-GI-NEXT: movi d1, #0x00ffff0000ffff
55
+ ; CHECK-GI-NEXT: ext v0.16b, v0.16b, v0.16b, #8
56
+ ; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
57
+ ; CHECK-GI-NEXT: ret
35
58
%zext = zext <4 x i16 > %vec to <4 x i32 >
36
59
%extract = call <2 x i32 > @llvm.vector.extract.v2i32.v4i32 (<4 x i32 > %zext , i64 2 )
37
60
%and = and <2 x i32 > %extract , <i32 65535 , i32 65535 >
38
61
ret <2 x i32 > %and
39
62
}
40
63
41
64
define <4 x i16 > @and_extract_sext_idx4 (<8 x i8 > %vec ) nounwind {
42
- ; CHECK-LABEL: and_extract_sext_idx4:
43
- ; CHECK: // %bb.0:
44
- ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
45
- ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
46
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
47
- ; CHECK-NEXT: ret
65
+ ; CHECK-SD-LABEL: and_extract_sext_idx4:
66
+ ; CHECK-SD: // %bb.0:
67
+ ; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #0
68
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
69
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
70
+ ; CHECK-SD-NEXT: ret
71
+ ;
72
+ ; CHECK-GI-LABEL: and_extract_sext_idx4:
73
+ ; CHECK-GI: // %bb.0:
74
+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
75
+ ; CHECK-GI-NEXT: movi d1, #0xff00ff00ff00ff
76
+ ; CHECK-GI-NEXT: ext v0.16b, v0.16b, v0.16b, #8
77
+ ; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
78
+ ; CHECK-GI-NEXT: ret
48
79
%sext = sext <8 x i8 > %vec to <8 x i16 >
49
80
%extract = call <4 x i16 > @llvm.vector.extract.v4i16.v8i16 (<8 x i16 > %sext , i64 4 )
50
81
%and = and <4 x i16 > %extract , <i16 255 , i16 255 , i16 255 , i16 255 >
51
82
ret <4 x i16 > %and
52
83
}
53
84
54
85
define <2 x i32 > @sext_extract_zext_idx0 (<4 x i16 > %vec ) nounwind {
55
- ; CHECK-LABEL: sext_extract_zext_idx0:
56
- ; CHECK: // %bb.0:
57
- ; CHECK-NEXT: sshll v0.4s, v0.4h, #0
58
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
59
- ; CHECK-NEXT: ret
86
+ ; CHECK-SD-LABEL: sext_extract_zext_idx0:
87
+ ; CHECK-SD: // %bb.0:
88
+ ; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0
89
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
90
+ ; CHECK-SD-NEXT: ret
91
+ ;
92
+ ; CHECK-GI-LABEL: sext_extract_zext_idx0:
93
+ ; CHECK-GI: // %bb.0:
94
+ ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
95
+ ; CHECK-GI-NEXT: shl v0.2s, v0.2s, #16
96
+ ; CHECK-GI-NEXT: sshr v0.2s, v0.2s, #16
97
+ ; CHECK-GI-NEXT: ret
60
98
%zext = zext <4 x i16 > %vec to <4 x i32 >
61
99
%extract = call <2 x i32 > @llvm.vector.extract.v2i32.v4i32 (<4 x i32 > %zext , i64 0 )
62
100
%sext_inreg_step0 = shl <2 x i32 > %extract , <i32 16 , i32 16 >
@@ -80,11 +118,18 @@ define <2 x i32> @sext_extract_zext_idx0_negtest(<4 x i16> %vec) nounwind {
80
118
}
81
119
82
120
define <4 x i16 > @sext_extract_sext_idx0 (<8 x i8 > %vec ) nounwind {
83
- ; CHECK-LABEL: sext_extract_sext_idx0:
84
- ; CHECK: // %bb.0:
85
- ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
86
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
87
- ; CHECK-NEXT: ret
121
+ ; CHECK-SD-LABEL: sext_extract_sext_idx0:
122
+ ; CHECK-SD: // %bb.0:
123
+ ; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
124
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
125
+ ; CHECK-SD-NEXT: ret
126
+ ;
127
+ ; CHECK-GI-LABEL: sext_extract_sext_idx0:
128
+ ; CHECK-GI: // %bb.0:
129
+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
130
+ ; CHECK-GI-NEXT: shl v0.4h, v0.4h, #8
131
+ ; CHECK-GI-NEXT: sshr v0.4h, v0.4h, #8
132
+ ; CHECK-GI-NEXT: ret
88
133
%sext = sext <8 x i8 > %vec to <8 x i16 >
89
134
%extract = call <4 x i16 > @llvm.vector.extract.v4i16.v8i16 (<8 x i16 > %sext , i64 0 )
90
135
%sext_inreg_step0 = shl <4 x i16 > %extract , <i16 8 , i16 8 , i16 8 , i16 8 >
@@ -93,12 +138,20 @@ define <4 x i16> @sext_extract_sext_idx0(<8 x i8> %vec) nounwind {
93
138
}
94
139
95
140
define <2 x i32 > @sext_extract_zext_idx2 (<4 x i16 > %vec ) nounwind {
96
- ; CHECK-LABEL: sext_extract_zext_idx2:
97
- ; CHECK: // %bb.0:
98
- ; CHECK-NEXT: sshll v0.4s, v0.4h, #0
99
- ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
100
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
101
- ; CHECK-NEXT: ret
141
+ ; CHECK-SD-LABEL: sext_extract_zext_idx2:
142
+ ; CHECK-SD: // %bb.0:
143
+ ; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0
144
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
145
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
146
+ ; CHECK-SD-NEXT: ret
147
+ ;
148
+ ; CHECK-GI-LABEL: sext_extract_zext_idx2:
149
+ ; CHECK-GI: // %bb.0:
150
+ ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
151
+ ; CHECK-GI-NEXT: ext v0.16b, v0.16b, v0.16b, #8
152
+ ; CHECK-GI-NEXT: shl v0.2s, v0.2s, #16
153
+ ; CHECK-GI-NEXT: sshr v0.2s, v0.2s, #16
154
+ ; CHECK-GI-NEXT: ret
102
155
%zext = zext <4 x i16 > %vec to <4 x i32 >
103
156
%extract = call <2 x i32 > @llvm.vector.extract.v2i32.v4i32 (<4 x i32 > %zext , i64 2 )
104
157
%sext_inreg_step0 = shl <2 x i32 > %extract , <i32 16 , i32 16 >
@@ -107,18 +160,36 @@ define <2 x i32> @sext_extract_zext_idx2(<4 x i16> %vec) nounwind {
107
160
}
108
161
109
162
define <4 x i16 > @sext_extract_sext_idx4 (<8 x i8 > %vec ) nounwind {
110
- ; CHECK-LABEL: sext_extract_sext_idx4:
111
- ; CHECK: // %bb.0:
112
- ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
113
- ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
114
- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
115
- ; CHECK-NEXT: ret
163
+ ; CHECK-SD-LABEL: sext_extract_sext_idx4:
164
+ ; CHECK-SD: // %bb.0:
165
+ ; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
166
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
167
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
168
+ ; CHECK-SD-NEXT: ret
169
+ ;
170
+ ; CHECK-GI-LABEL: sext_extract_sext_idx4:
171
+ ; CHECK-GI: // %bb.0:
172
+ ; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
173
+ ; CHECK-GI-NEXT: ext v0.16b, v0.16b, v0.16b, #8
174
+ ; CHECK-GI-NEXT: shl v0.4h, v0.4h, #8
175
+ ; CHECK-GI-NEXT: sshr v0.4h, v0.4h, #8
176
+ ; CHECK-GI-NEXT: ret
116
177
%sext = sext <8 x i8 > %vec to <8 x i16 >
117
178
%extract = call <4 x i16 > @llvm.vector.extract.v4i16.v8i16 (<8 x i16 > %sext , i64 4 )
118
179
%sext_inreg_step0 = shl <4 x i16 > %extract , <i16 8 , i16 8 , i16 8 , i16 8 >
119
180
%sext_inreg = ashr <4 x i16 > %sext_inreg_step0 , <i16 8 , i16 8 , i16 8 , i16 8 >
120
181
ret <4 x i16 > %sext_inreg
121
182
}
122
183
184
+ define <8 x i8 > @sext_extract_idx (<16 x i8 > %vec ) nounwind {
185
+ ; CHECK-LABEL: sext_extract_idx:
186
+ ; CHECK: // %bb.0:
187
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
188
+ ; CHECK-NEXT: ret
189
+ %extract = call <8 x i8 > @llvm.vector.extract.v8i8.v16i8 (<16 x i8 > %vec , i64 0 )
190
+ ret <8 x i8 > %extract
191
+ }
192
+
123
193
declare <2 x i32 > @llvm.vector.extract.v2i32.v4i32 (<4 x i32 >, i64 )
124
194
declare <4 x i16 > @llvm.vector.extract.v4i16.v8i16 (<8 x i16 >, i64 )
195
+ declare <8 x i8 > @llvm.vector.extract.v8i8.v16i8 (<16 x i8 >, i64 )
0 commit comments