blob: ce311bfc1e68cd0132bb12d358273a4eb4a83e8c [file] [log] [blame]
Matt Arsenaultd1097a32016-06-02 19:54:26 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s
3; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4
5; FUNC-LABEL: {{^}}local_load_i16:
6; GCN: ds_read_u16 v{{[0-9]+}}
7
Jan Vesely38814fa2016-08-27 19:09:43 +00008; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
9; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
10; EG-DAG: MOV {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], OQAP
11; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
12; EG: LDS_SHORT_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +000013define void @local_load_i16(i16 addrspace(3)* %out, i16 addrspace(3)* %in) {
14entry:
15 %ld = load i16, i16 addrspace(3)* %in
16 store i16 %ld, i16 addrspace(3)* %out
17 ret void
18}
19
20; FUNC-LABEL: {{^}}local_load_v2i16:
21; GCN: ds_read_b32
22
Jan Vesely38814fa2016-08-27 19:09:43 +000023; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
24; EG: LDS_READ_RET {{.*}} [[FROM]]
25; EG-DAG: MOV {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], OQAP
26; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
27; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +000028define void @local_load_v2i16(<2 x i16> addrspace(3)* %out, <2 x i16> addrspace(3)* %in) {
29entry:
30 %ld = load <2 x i16>, <2 x i16> addrspace(3)* %in
31 store <2 x i16> %ld, <2 x i16> addrspace(3)* %out
32 ret void
33}
34
35; FUNC-LABEL: {{^}}local_load_v3i16:
36; GCN: ds_read_b64
37; GCN-DAG: ds_write_b32
38; GCN-DAG: ds_write_b16
39
40; EG-DAG: LDS_USHORT_READ_RET
41; EG-DAG: LDS_READ_RET
42define void @local_load_v3i16(<3 x i16> addrspace(3)* %out, <3 x i16> addrspace(3)* %in) {
43entry:
44 %ld = load <3 x i16>, <3 x i16> addrspace(3)* %in
45 store <3 x i16> %ld, <3 x i16> addrspace(3)* %out
46 ret void
47}
48
49; FUNC-LABEL: {{^}}local_load_v4i16:
50; GCN: ds_read_b64
51
52; EG: LDS_READ_RET
53; EG: LDS_READ_RET
54define void @local_load_v4i16(<4 x i16> addrspace(3)* %out, <4 x i16> addrspace(3)* %in) {
55entry:
56 %ld = load <4 x i16>, <4 x i16> addrspace(3)* %in
57 store <4 x i16> %ld, <4 x i16> addrspace(3)* %out
58 ret void
59}
60
61; FUNC-LABEL: {{^}}local_load_v8i16:
Tom Stellarde175d8a2016-08-26 21:36:47 +000062; GCN: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
Matt Arsenaultd1097a32016-06-02 19:54:26 +000063
64; EG: LDS_READ_RET
65; EG: LDS_READ_RET
66; EG: LDS_READ_RET
67; EG: LDS_READ_RET
68define void @local_load_v8i16(<8 x i16> addrspace(3)* %out, <8 x i16> addrspace(3)* %in) {
69entry:
70 %ld = load <8 x i16>, <8 x i16> addrspace(3)* %in
71 store <8 x i16> %ld, <8 x i16> addrspace(3)* %out
72 ret void
73}
74
75; FUNC-LABEL: {{^}}local_load_v16i16:
Tom Stellarde175d8a2016-08-26 21:36:47 +000076; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:2 offset1:3{{$}}
77; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
Matt Arsenaultd1097a32016-06-02 19:54:26 +000078
79
80; EG: LDS_READ_RET
81; EG: LDS_READ_RET
82; EG: LDS_READ_RET
83; EG: LDS_READ_RET
84
85; EG: LDS_READ_RET
86; EG: LDS_READ_RET
87; EG: LDS_READ_RET
88; EG: LDS_READ_RET
89define void @local_load_v16i16(<16 x i16> addrspace(3)* %out, <16 x i16> addrspace(3)* %in) {
90entry:
91 %ld = load <16 x i16>, <16 x i16> addrspace(3)* %in
92 store <16 x i16> %ld, <16 x i16> addrspace(3)* %out
93 ret void
94}
95
96; FUNC-LABEL: {{^}}local_zextload_i16_to_i32:
97; GCN: ds_read_u16
98; GCN: ds_write_b32
99
Jan Vesely38814fa2016-08-27 19:09:43 +0000100; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
101; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
102; EG-DAG: MOV {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], OQAP
103; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
104; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000105define void @local_zextload_i16_to_i32(i32 addrspace(3)* %out, i16 addrspace(3)* %in) #0 {
106 %a = load i16, i16 addrspace(3)* %in
107 %ext = zext i16 %a to i32
108 store i32 %ext, i32 addrspace(3)* %out
109 ret void
110}
111
112; FUNC-LABEL: {{^}}local_sextload_i16_to_i32:
113; GCN-NOT: s_wqm_b64
114; GCN: s_mov_b32 m0
115; GCN: ds_read_i16
116
Jan Vesely38814fa2016-08-27 19:09:43 +0000117; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
118; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
119; EG-DAG: MOV {{[* ]*}}[[TMP:T[0-9]+\.[XYZW]]], OQAP
120; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
121; EG-DAG: BFE_INT {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], {{.*}}, 0.0, literal
122; EG: 16
123; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000124define void @local_sextload_i16_to_i32(i32 addrspace(3)* %out, i16 addrspace(3)* %in) #0 {
125 %a = load i16, i16 addrspace(3)* %in
126 %ext = sext i16 %a to i32
127 store i32 %ext, i32 addrspace(3)* %out
128 ret void
129}
130
131; FUNC-LABEL: {{^}}local_zextload_v1i16_to_v1i32:
132; GCN: ds_read_u16
Jan Vesely38814fa2016-08-27 19:09:43 +0000133
134; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
135; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
136; EG-DAG: MOV {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], OQAP
137; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
138; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000139define void @local_zextload_v1i16_to_v1i32(<1 x i32> addrspace(3)* %out, <1 x i16> addrspace(3)* %in) #0 {
140 %load = load <1 x i16>, <1 x i16> addrspace(3)* %in
141 %ext = zext <1 x i16> %load to <1 x i32>
142 store <1 x i32> %ext, <1 x i32> addrspace(3)* %out
143 ret void
144}
145
146; FUNC-LABEL: {{^}}local_sextload_v1i16_to_v1i32:
147; GCN: ds_read_i16
Jan Vesely38814fa2016-08-27 19:09:43 +0000148
149; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
150; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
151; EG-DAG: MOV {{[* ]*}}[[TMP:T[0-9]+\.[XYZW]]], OQAP
152; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
153; EG-DAG: BFE_INT {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], {{.*}}, 0.0, literal
154; EG: 16
155; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000156define void @local_sextload_v1i16_to_v1i32(<1 x i32> addrspace(3)* %out, <1 x i16> addrspace(3)* %in) #0 {
157 %load = load <1 x i16>, <1 x i16> addrspace(3)* %in
158 %ext = sext <1 x i16> %load to <1 x i32>
159 store <1 x i32> %ext, <1 x i32> addrspace(3)* %out
160 ret void
161}
162
163; FUNC-LABEL: {{^}}local_zextload_v2i16_to_v2i32:
164; GCN-NOT: s_wqm_b64
165; GCN: s_mov_b32 m0
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000166; GCN: ds_read_b32
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000167
Jan Vesely38814fa2016-08-27 19:09:43 +0000168; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000169define void @local_zextload_v2i16_to_v2i32(<2 x i32> addrspace(3)* %out, <2 x i16> addrspace(3)* %in) #0 {
170 %load = load <2 x i16>, <2 x i16> addrspace(3)* %in
171 %ext = zext <2 x i16> %load to <2 x i32>
172 store <2 x i32> %ext, <2 x i32> addrspace(3)* %out
173 ret void
174}
175
176; FUNC-LABEL: {{^}}local_sextload_v2i16_to_v2i32:
177; GCN-NOT: s_wqm_b64
178; GCN: s_mov_b32 m0
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000179; GCN: ds_read_b32
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000180
Jan Vesely38814fa2016-08-27 19:09:43 +0000181; EG: LDS_READ_RET
182; EG: BFE_INT
183; EG: BFE_INT
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000184define void @local_sextload_v2i16_to_v2i32(<2 x i32> addrspace(3)* %out, <2 x i16> addrspace(3)* %in) #0 {
185 %load = load <2 x i16>, <2 x i16> addrspace(3)* %in
186 %ext = sext <2 x i16> %load to <2 x i32>
187 store <2 x i32> %ext, <2 x i32> addrspace(3)* %out
188 ret void
189}
190
191; FUNC-LABEL: {{^}}local_local_zextload_v3i16_to_v3i32:
192; GCN: ds_read_b64
193; GCN-DAG: ds_write_b32
194; GCN-DAG: ds_write_b64
Jan Vesely38814fa2016-08-27 19:09:43 +0000195
196; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000197define void @local_local_zextload_v3i16_to_v3i32(<3 x i32> addrspace(3)* %out, <3 x i16> addrspace(3)* %in) {
198entry:
199 %ld = load <3 x i16>, <3 x i16> addrspace(3)* %in
200 %ext = zext <3 x i16> %ld to <3 x i32>
201 store <3 x i32> %ext, <3 x i32> addrspace(3)* %out
202 ret void
203}
204
205; FUNC-LABEL: {{^}}local_local_sextload_v3i16_to_v3i32:
206; GCN: ds_read_b64
207; GCN-DAG: ds_write_b32
208; GCN-DAG: ds_write_b64
Jan Vesely38814fa2016-08-27 19:09:43 +0000209
210; EG: LDS_READ_RET
211; EG-DAG: BFE_INT
212; EG-DAG: BFE_INT
213; EG-DAG: BFE_INT
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000214define void @local_local_sextload_v3i16_to_v3i32(<3 x i32> addrspace(3)* %out, <3 x i16> addrspace(3)* %in) {
215entry:
216 %ld = load <3 x i16>, <3 x i16> addrspace(3)* %in
217 %ext = sext <3 x i16> %ld to <3 x i32>
218 store <3 x i32> %ext, <3 x i32> addrspace(3)* %out
219 ret void
220}
221
222; FUNC-LABEL: {{^}}local_local_zextload_v4i16_to_v4i32:
223; GCN-NOT: s_wqm_b64
224; GCN: s_mov_b32 m0
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000225; GCN: ds_read_b64
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000226
Jan Vesely38814fa2016-08-27 19:09:43 +0000227; EG: LDS_READ_RET
228; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000229define void @local_local_zextload_v4i16_to_v4i32(<4 x i32> addrspace(3)* %out, <4 x i16> addrspace(3)* %in) #0 {
230 %load = load <4 x i16>, <4 x i16> addrspace(3)* %in
231 %ext = zext <4 x i16> %load to <4 x i32>
232 store <4 x i32> %ext, <4 x i32> addrspace(3)* %out
233 ret void
234}
235
236; FUNC-LABEL: {{^}}local_sextload_v4i16_to_v4i32:
237; GCN-NOT: s_wqm_b64
238; GCN: s_mov_b32 m0
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000239; GCN: ds_read_b64
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000240
Jan Vesely38814fa2016-08-27 19:09:43 +0000241; EG: LDS_READ_RET
242; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000243; EG-DAG: BFE_INT
244; EG-DAG: BFE_INT
245; EG-DAG: BFE_INT
246; EG-DAG: BFE_INT
247define void @local_sextload_v4i16_to_v4i32(<4 x i32> addrspace(3)* %out, <4 x i16> addrspace(3)* %in) #0 {
248 %load = load <4 x i16>, <4 x i16> addrspace(3)* %in
249 %ext = sext <4 x i16> %load to <4 x i32>
250 store <4 x i32> %ext, <4 x i32> addrspace(3)* %out
251 ret void
252}
253
254; FUNC-LABEL: {{^}}local_zextload_v8i16_to_v8i32:
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000255; GCN: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
Jan Vesely38814fa2016-08-27 19:09:43 +0000256
257; EG: LDS_READ_RET
258; EG: LDS_READ_RET
259; EG: LDS_READ_RET
260; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000261define void @local_zextload_v8i16_to_v8i32(<8 x i32> addrspace(3)* %out, <8 x i16> addrspace(3)* %in) #0 {
262 %load = load <8 x i16>, <8 x i16> addrspace(3)* %in
263 %ext = zext <8 x i16> %load to <8 x i32>
264 store <8 x i32> %ext, <8 x i32> addrspace(3)* %out
265 ret void
266}
267
268; FUNC-LABEL: {{^}}local_sextload_v8i16_to_v8i32:
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000269; GCN: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
Jan Vesely38814fa2016-08-27 19:09:43 +0000270
271; EG: LDS_READ_RET
272; EG: LDS_READ_RET
273; EG: LDS_READ_RET
274; EG: LDS_READ_RET
275; EG-DAG: BFE_INT
276; EG-DAG: BFE_INT
277; EG-DAG: BFE_INT
278; EG-DAG: BFE_INT
279; EG-DAG: BFE_INT
280; EG-DAG: BFE_INT
281; EG-DAG: BFE_INT
282; EG-DAG: BFE_INT
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000283define void @local_sextload_v8i16_to_v8i32(<8 x i32> addrspace(3)* %out, <8 x i16> addrspace(3)* %in) #0 {
284 %load = load <8 x i16>, <8 x i16> addrspace(3)* %in
285 %ext = sext <8 x i16> %load to <8 x i32>
286 store <8 x i32> %ext, <8 x i32> addrspace(3)* %out
287 ret void
288}
289
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000290; FIXME: Should have 2 ds_read_b64
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000291; FUNC-LABEL: {{^}}local_zextload_v16i16_to_v16i32:
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000292; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:1 offset1:2{{$}}
293; GCN-DAG: ds_read_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+$}}
294; GCN-DAG: ds_read_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset:24
295
296; GCN: ds_write2_b64
297; GCN: ds_write2_b64
298; GCN: ds_write2_b64
299; GCN: ds_write2_b64
Jan Vesely38814fa2016-08-27 19:09:43 +0000300
301; EG: LDS_READ_RET
302; EG: LDS_READ_RET
303; EG: LDS_READ_RET
304; EG: LDS_READ_RET
305; EG: LDS_READ_RET
306; EG: LDS_READ_RET
307; EG: LDS_READ_RET
308; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000309define void @local_zextload_v16i16_to_v16i32(<16 x i32> addrspace(3)* %out, <16 x i16> addrspace(3)* %in) #0 {
310 %load = load <16 x i16>, <16 x i16> addrspace(3)* %in
311 %ext = zext <16 x i16> %load to <16 x i32>
312 store <16 x i32> %ext, <16 x i32> addrspace(3)* %out
313 ret void
314}
315
316; FUNC-LABEL: {{^}}local_sextload_v16i16_to_v16i32:
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000317; GCN-DAG: ds_read_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+$}}
Tom Stellarde175d8a2016-08-26 21:36:47 +0000318; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:1 offset1:3{{$}}
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000319; GCN-DAG: ds_read_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset:16{{$}}
Jan Vesely38814fa2016-08-27 19:09:43 +0000320
321; EG: LDS_READ_RET
322; EG: LDS_READ_RET
323; EG: LDS_READ_RET
324; EG: LDS_READ_RET
325; EG: LDS_READ_RET
326; EG: LDS_READ_RET
327; EG: LDS_READ_RET
328; EG: LDS_READ_RET
329; EG-DAG: BFE_INT
330; EG-DAG: BFE_INT
331; EG-DAG: BFE_INT
332; EG-DAG: BFE_INT
333; EG-DAG: BFE_INT
334; EG-DAG: BFE_INT
335; EG-DAG: BFE_INT
336; EG-DAG: BFE_INT
337; EG-DAG: BFE_INT
338; EG-DAG: BFE_INT
339; EG-DAG: BFE_INT
340; EG-DAG: BFE_INT
341; EG-DAG: BFE_INT
342; EG-DAG: BFE_INT
343; EG-DAG: BFE_INT
344; EG-DAG: BFE_INT
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000345define void @local_sextload_v16i16_to_v16i32(<16 x i32> addrspace(3)* %out, <16 x i16> addrspace(3)* %in) #0 {
346 %load = load <16 x i16>, <16 x i16> addrspace(3)* %in
347 %ext = sext <16 x i16> %load to <16 x i32>
348 store <16 x i32> %ext, <16 x i32> addrspace(3)* %out
349 ret void
350}
351
352; FUNC-LABEL: {{^}}local_zextload_v32i16_to_v32i32:
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000353; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
354; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:2 offset1:3
355; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:4 offset1:5
356; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:6 offset1:7
Jan Vesely38814fa2016-08-27 19:09:43 +0000357
358; EG: LDS_READ_RET
359; EG: LDS_READ_RET
360; EG: LDS_READ_RET
361; EG: LDS_READ_RET
362; EG: LDS_READ_RET
363; EG: LDS_READ_RET
364; EG: LDS_READ_RET
365; EG: LDS_READ_RET
366; EG: LDS_READ_RET
367; EG: LDS_READ_RET
368; EG: LDS_READ_RET
369; EG: LDS_READ_RET
370; EG: LDS_READ_RET
371; EG: LDS_READ_RET
372; EG: LDS_READ_RET
373; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000374define void @local_zextload_v32i16_to_v32i32(<32 x i32> addrspace(3)* %out, <32 x i16> addrspace(3)* %in) #0 {
375 %load = load <32 x i16>, <32 x i16> addrspace(3)* %in
376 %ext = zext <32 x i16> %load to <32 x i32>
377 store <32 x i32> %ext, <32 x i32> addrspace(3)* %out
378 ret void
379}
380
381; FUNC-LABEL: {{^}}local_sextload_v32i16_to_v32i32:
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000382; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:1 offset1:2{{$}}
383; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:3 offset1:4
Tom Stellarde175d8a2016-08-26 21:36:47 +0000384; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:5{{$}}
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000385; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:6 offset1:7
Jan Vesely38814fa2016-08-27 19:09:43 +0000386
387; EG: LDS_READ_RET
388; EG: LDS_READ_RET
389; EG: LDS_READ_RET
390; EG: LDS_READ_RET
391; EG: LDS_READ_RET
392; EG: LDS_READ_RET
393; EG: LDS_READ_RET
394; EG: LDS_READ_RET
395; EG: LDS_READ_RET
396; EG: LDS_READ_RET
397; EG: LDS_READ_RET
398; EG: LDS_READ_RET
399; EG: LDS_READ_RET
400; EG: LDS_READ_RET
401; EG: LDS_READ_RET
402; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000403define void @local_sextload_v32i16_to_v32i32(<32 x i32> addrspace(3)* %out, <32 x i16> addrspace(3)* %in) #0 {
404 %load = load <32 x i16>, <32 x i16> addrspace(3)* %in
405 %ext = sext <32 x i16> %load to <32 x i32>
406 store <32 x i32> %ext, <32 x i32> addrspace(3)* %out
407 ret void
408}
409
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000410; FIXME: Missed read2
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000411; FUNC-LABEL: {{^}}local_zextload_v64i16_to_v64i32:
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000412; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:11 offset1:15
413; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
414; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:2 offset1:3
415; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:4 offset1:5
416; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:6 offset1:7
417; GCN-DAG: ds_read_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset:64
418; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:9 offset1:10
419; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:12 offset1:13
420; GCN-DAG: ds_read_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset:112
Jan Vesely38814fa2016-08-27 19:09:43 +0000421
422; EG: LDS_READ_RET
423; EG: LDS_READ_RET
424; EG: LDS_READ_RET
425; EG: LDS_READ_RET
426; EG: LDS_READ_RET
427; EG: LDS_READ_RET
428; EG: LDS_READ_RET
429; EG: LDS_READ_RET
430; EG: LDS_READ_RET
431; EG: LDS_READ_RET
432; EG: LDS_READ_RET
433; EG: LDS_READ_RET
434; EG: LDS_READ_RET
435; EG: LDS_READ_RET
436; EG: LDS_READ_RET
437; EG: LDS_READ_RET
438; EG: LDS_READ_RET
439; EG: LDS_READ_RET
440; EG: LDS_READ_RET
441; EG: LDS_READ_RET
442; EG: LDS_READ_RET
443; EG: LDS_READ_RET
444; EG: LDS_READ_RET
445; EG: LDS_READ_RET
446; EG: LDS_READ_RET
447; EG: LDS_READ_RET
448; EG: LDS_READ_RET
449; EG: LDS_READ_RET
450; EG: LDS_READ_RET
451; EG: LDS_READ_RET
452; EG: LDS_READ_RET
453; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000454define void @local_zextload_v64i16_to_v64i32(<64 x i32> addrspace(3)* %out, <64 x i16> addrspace(3)* %in) #0 {
455 %load = load <64 x i16>, <64 x i16> addrspace(3)* %in
456 %ext = zext <64 x i16> %load to <64 x i32>
457 store <64 x i32> %ext, <64 x i32> addrspace(3)* %out
458 ret void
459}
460
461; FUNC-LABEL: {{^}}local_sextload_v64i16_to_v64i32:
Jan Vesely38814fa2016-08-27 19:09:43 +0000462
463; EG: LDS_READ_RET
464; EG: LDS_READ_RET
465; EG: LDS_READ_RET
466; EG: LDS_READ_RET
467; EG: LDS_READ_RET
468; EG: LDS_READ_RET
469; EG: LDS_READ_RET
470; EG: LDS_READ_RET
471; EG: LDS_READ_RET
472; EG: LDS_READ_RET
473; EG: LDS_READ_RET
474; EG: LDS_READ_RET
475; EG: LDS_READ_RET
476; EG: LDS_READ_RET
477; EG: LDS_READ_RET
478; EG: LDS_READ_RET
479; EG: LDS_READ_RET
480; EG: LDS_READ_RET
481; EG: LDS_READ_RET
482; EG: LDS_READ_RET
483; EG: LDS_READ_RET
484; EG: LDS_READ_RET
485; EG: LDS_READ_RET
486; EG: LDS_READ_RET
487; EG: LDS_READ_RET
488; EG: LDS_READ_RET
489; EG: LDS_READ_RET
490; EG: LDS_READ_RET
491; EG: LDS_READ_RET
492; EG: LDS_READ_RET
493; EG: LDS_READ_RET
494; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000495define void @local_sextload_v64i16_to_v64i32(<64 x i32> addrspace(3)* %out, <64 x i16> addrspace(3)* %in) #0 {
496 %load = load <64 x i16>, <64 x i16> addrspace(3)* %in
497 %ext = sext <64 x i16> %load to <64 x i32>
498 store <64 x i32> %ext, <64 x i32> addrspace(3)* %out
499 ret void
500}
501
502; FUNC-LABEL: {{^}}local_zextload_i16_to_i64:
503; GCN-DAG: ds_read_u16 v[[LO:[0-9]+]],
504; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}}
505
506; GCN: ds_write_b64 v{{[0-9]+}}, v{{\[}}[[LO]]:[[HI]]]
Jan Vesely38814fa2016-08-27 19:09:43 +0000507
508; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
509; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
510; EG-DAG: MOV {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], OQAP
511; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
512; EG-DAG: LDS_WRITE
513; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000514define void @local_zextload_i16_to_i64(i64 addrspace(3)* %out, i16 addrspace(3)* %in) #0 {
515 %a = load i16, i16 addrspace(3)* %in
516 %ext = zext i16 %a to i64
517 store i64 %ext, i64 addrspace(3)* %out
518 ret void
519}
520
521; FUNC-LABEL: {{^}}local_sextload_i16_to_i64:
522; GCN: ds_read_i16 v[[LO:[0-9]+]],
523; GCN-DAG: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]]
524
525; GCN: ds_write_b64 v{{[0-9]+}}, v{{\[}}[[LO]]:[[HI]]]
Jan Vesely38814fa2016-08-27 19:09:43 +0000526
527; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
528; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
529; EG-DAG: MOV {{[* ]*}}[[TMP:T[0-9]+\.[XYZW]]], OQAP
530; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
531; EG-DAG: BFE_INT {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], {{.*}}, 0.0, literal
532; EG-DAG: LDS_WRITE
533; EG-DAG: 16
534; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000535define void @local_sextload_i16_to_i64(i64 addrspace(3)* %out, i16 addrspace(3)* %in) #0 {
536 %a = load i16, i16 addrspace(3)* %in
537 %ext = sext i16 %a to i64
538 store i64 %ext, i64 addrspace(3)* %out
539 ret void
540}
541
542; FUNC-LABEL: {{^}}local_zextload_v1i16_to_v1i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000543
544; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
545; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
546; EG-DAG: MOV {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], OQAP
547; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
548; EG-DAG: LDS_WRITE
549; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000550define void @local_zextload_v1i16_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i16> addrspace(3)* %in) #0 {
551 %load = load <1 x i16>, <1 x i16> addrspace(3)* %in
552 %ext = zext <1 x i16> %load to <1 x i64>
553 store <1 x i64> %ext, <1 x i64> addrspace(3)* %out
554 ret void
555}
556
557; FUNC-LABEL: {{^}}local_sextload_v1i16_to_v1i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000558
559; EG: MOV {{[* ]*}}[[FROM:T[0-9]+\.[XYZW]]], KC0[2].Z
560; EG: LDS_USHORT_READ_RET {{.*}} [[FROM]]
561; EG-DAG: MOV {{[* ]*}}[[TMP:T[0-9]+\.[XYZW]]], OQAP
562; EG-DAG: MOV {{[* ]*}}[[TO:T[0-9]+\.[XYZW]]], KC0[2].Y
563; EG-DAG: BFE_INT {{[* ]*}}[[DATA:T[0-9]+\.[XYZW]]], {{.*}}, 0.0, literal
564; EG-DAG: LDS_WRITE
565; EG-DAG: 16
566; EG: LDS_WRITE {{\*?}} [[TO]], [[DATA]]
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000567define void @local_sextload_v1i16_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i16> addrspace(3)* %in) #0 {
568 %load = load <1 x i16>, <1 x i16> addrspace(3)* %in
569 %ext = sext <1 x i16> %load to <1 x i64>
570 store <1 x i64> %ext, <1 x i64> addrspace(3)* %out
571 ret void
572}
573
574; FUNC-LABEL: {{^}}local_zextload_v2i16_to_v2i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000575
576; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000577define void @local_zextload_v2i16_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i16> addrspace(3)* %in) #0 {
578 %load = load <2 x i16>, <2 x i16> addrspace(3)* %in
579 %ext = zext <2 x i16> %load to <2 x i64>
580 store <2 x i64> %ext, <2 x i64> addrspace(3)* %out
581 ret void
582}
583
584; FUNC-LABEL: {{^}}local_sextload_v2i16_to_v2i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000585
586; EG: LDS_READ_RET
587; EG-DAG: BFE_INT
588; EG-DAG: ASHR
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000589define void @local_sextload_v2i16_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i16> addrspace(3)* %in) #0 {
590 %load = load <2 x i16>, <2 x i16> addrspace(3)* %in
591 %ext = sext <2 x i16> %load to <2 x i64>
592 store <2 x i64> %ext, <2 x i64> addrspace(3)* %out
593 ret void
594}
595
596; FUNC-LABEL: {{^}}local_zextload_v4i16_to_v4i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000597
598; EG: LDS_READ_RET
599; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000600define void @local_zextload_v4i16_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i16> addrspace(3)* %in) #0 {
601 %load = load <4 x i16>, <4 x i16> addrspace(3)* %in
602 %ext = zext <4 x i16> %load to <4 x i64>
603 store <4 x i64> %ext, <4 x i64> addrspace(3)* %out
604 ret void
605}
606
607; FUNC-LABEL: {{^}}local_sextload_v4i16_to_v4i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000608
609; EG: LDS_READ_RET
610; EG: LDS_READ_RET
611; EG-DAG: BFE_INT
612; EG-DAG: BFE_INT
613; EG-DAG: ASHR
614; EG-DAG: ASHR
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000615define void @local_sextload_v4i16_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i16> addrspace(3)* %in) #0 {
616 %load = load <4 x i16>, <4 x i16> addrspace(3)* %in
617 %ext = sext <4 x i16> %load to <4 x i64>
618 store <4 x i64> %ext, <4 x i64> addrspace(3)* %out
619 ret void
620}
621
622; FUNC-LABEL: {{^}}local_zextload_v8i16_to_v8i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000623
624; EG: LDS_READ_RET
625; EG: LDS_READ_RET
626; EG: LDS_READ_RET
627; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000628define void @local_zextload_v8i16_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i16> addrspace(3)* %in) #0 {
629 %load = load <8 x i16>, <8 x i16> addrspace(3)* %in
630 %ext = zext <8 x i16> %load to <8 x i64>
631 store <8 x i64> %ext, <8 x i64> addrspace(3)* %out
632 ret void
633}
634
635; FUNC-LABEL: {{^}}local_sextload_v8i16_to_v8i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000636
637; EG: LDS_READ_RET
638; EG: LDS_READ_RET
639; EG: LDS_READ_RET
640; EG: LDS_READ_RET
641; EG-DAG: BFE_INT
642; EG-DAG: BFE_INT
643; EG-DAG: ASHR
644; EG-DAG: ASHR
645; EG-DAG: BFE_INT
646; EG-DAG: BFE_INT
647; EG-DAG: ASHR
648; EG-DAG: ASHR
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000649define void @local_sextload_v8i16_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i16> addrspace(3)* %in) #0 {
650 %load = load <8 x i16>, <8 x i16> addrspace(3)* %in
651 %ext = sext <8 x i16> %load to <8 x i64>
652 store <8 x i64> %ext, <8 x i64> addrspace(3)* %out
653 ret void
654}
655
656; FUNC-LABEL: {{^}}local_zextload_v16i16_to_v16i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000657
658; EG: LDS_READ_RET
659; EG: LDS_READ_RET
660; EG: LDS_READ_RET
661; EG: LDS_READ_RET
662; EG: LDS_READ_RET
663; EG: LDS_READ_RET
664; EG: LDS_READ_RET
665; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000666define void @local_zextload_v16i16_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i16> addrspace(3)* %in) #0 {
667 %load = load <16 x i16>, <16 x i16> addrspace(3)* %in
668 %ext = zext <16 x i16> %load to <16 x i64>
669 store <16 x i64> %ext, <16 x i64> addrspace(3)* %out
670 ret void
671}
672
673; FUNC-LABEL: {{^}}local_sextload_v16i16_to_v16i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000674
675; EG: LDS_READ_RET
676; EG: LDS_READ_RET
677; EG: LDS_READ_RET
678; EG: LDS_READ_RET
679; EG: LDS_READ_RET
680; EG: LDS_READ_RET
681; EG: LDS_READ_RET
682; EG: LDS_READ_RET
683; EG-DAG: BFE_INT
684; EG-DAG: BFE_INT
685; EG-DAG: ASHR
686; EG-DAG: ASHR
687; EG-DAG: BFE_INT
688; EG-DAG: BFE_INT
689; EG-DAG: ASHR
690; EG-DAG: ASHR
691; EG-DAG: BFE_INT
692; EG-DAG: BFE_INT
693; EG-DAG: ASHR
694; EG-DAG: ASHR
695; EG-DAG: BFE_INT
696; EG-DAG: BFE_INT
697; EG-DAG: ASHR
698; EG-DAG: ASHR
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000699define void @local_sextload_v16i16_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i16> addrspace(3)* %in) #0 {
700 %load = load <16 x i16>, <16 x i16> addrspace(3)* %in
701 %ext = sext <16 x i16> %load to <16 x i64>
702 store <16 x i64> %ext, <16 x i64> addrspace(3)* %out
703 ret void
704}
705
706; FUNC-LABEL: {{^}}local_zextload_v32i16_to_v32i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000707
708; EG: LDS_READ_RET
709; EG: LDS_READ_RET
710; EG: LDS_READ_RET
711; EG: LDS_READ_RET
712; EG: LDS_READ_RET
713; EG: LDS_READ_RET
714; EG: LDS_READ_RET
715; EG: LDS_READ_RET
716; EG: LDS_READ_RET
717; EG: LDS_READ_RET
718; EG: LDS_READ_RET
719; EG: LDS_READ_RET
720; EG: LDS_READ_RET
721; EG: LDS_READ_RET
722; EG: LDS_READ_RET
723; EG: LDS_READ_RET
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000724define void @local_zextload_v32i16_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i16> addrspace(3)* %in) #0 {
725 %load = load <32 x i16>, <32 x i16> addrspace(3)* %in
726 %ext = zext <32 x i16> %load to <32 x i64>
727 store <32 x i64> %ext, <32 x i64> addrspace(3)* %out
728 ret void
729}
730
731; FUNC-LABEL: {{^}}local_sextload_v32i16_to_v32i64:
Jan Vesely38814fa2016-08-27 19:09:43 +0000732
733; EG: LDS_READ_RET
734; EG: LDS_READ_RET
735; EG: LDS_READ_RET
736; EG: LDS_READ_RET
737; EG: LDS_READ_RET
738; EG: LDS_READ_RET
739; EG: LDS_READ_RET
740; EG: LDS_READ_RET
741; EG: LDS_READ_RET
742; EG: LDS_READ_RET
743; EG: LDS_READ_RET
744; EG: LDS_READ_RET
745; EG: LDS_READ_RET
746; EG: LDS_READ_RET
747; EG: LDS_READ_RET
748; EG: LDS_READ_RET
749; EG-DAG: BFE_INT
750; EG-DAG: BFE_INT
751; EG-DAG: ASHR
752; EG-DAG: ASHR
753; EG-DAG: BFE_INT
754; EG-DAG: BFE_INT
755; EG-DAG: ASHR
756; EG-DAG: ASHR
757; EG-DAG: BFE_INT
758; EG-DAG: BFE_INT
759; EG-DAG: ASHR
760; EG-DAG: ASHR
761; EG-DAG: BFE_INT
762; EG-DAG: BFE_INT
763; EG-DAG: ASHR
764; EG-DAG: ASHR
765; EG-DAG: BFE_INT
766; EG-DAG: BFE_INT
767; EG-DAG: ASHR
768; EG-DAG: ASHR
769; EG-DAG: BFE_INT
770; EG-DAG: BFE_INT
771; EG-DAG: ASHR
772; EG-DAG: ASHR
773; EG-DAG: BFE_INT
774; EG-DAG: BFE_INT
775; EG-DAG: ASHR
776; EG-DAG: ASHR
777; EG-DAG: BFE_INT
778; EG-DAG: BFE_INT
779; EG-DAG: ASHR
780; EG-DAG: ASHR
Matt Arsenaultd1097a32016-06-02 19:54:26 +0000781define void @local_sextload_v32i16_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i16> addrspace(3)* %in) #0 {
782 %load = load <32 x i16>, <32 x i16> addrspace(3)* %in
783 %ext = sext <32 x i16> %load to <32 x i64>
784 store <32 x i64> %ext, <32 x i64> addrspace(3)* %out
785 ret void
786}
787
788; ; XFUNC-LABEL: {{^}}local_zextload_v64i16_to_v64i64:
789; define void @local_zextload_v64i16_to_v64i64(<64 x i64> addrspace(3)* %out, <64 x i16> addrspace(3)* %in) #0 {
790; %load = load <64 x i16>, <64 x i16> addrspace(3)* %in
791; %ext = zext <64 x i16> %load to <64 x i64>
792; store <64 x i64> %ext, <64 x i64> addrspace(3)* %out
793; ret void
794; }
795
796; ; XFUNC-LABEL: {{^}}local_sextload_v64i16_to_v64i64:
797; define void @local_sextload_v64i16_to_v64i64(<64 x i64> addrspace(3)* %out, <64 x i16> addrspace(3)* %in) #0 {
798; %load = load <64 x i16>, <64 x i16> addrspace(3)* %in
799; %ext = sext <64 x i16> %load to <64 x i64>
800; store <64 x i64> %ext, <64 x i64> addrspace(3)* %out
801; ret void
802; }
803
804attributes #0 = { nounwind }