1; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-NOHSA -check-prefix=FUNC %s
2; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=kaveri -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-HSA -check-prefix=FUNC %s
3; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-NOHSA -check-prefix=FUNC %s
4; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
5
6
7; FUNC-LABEL: {{^}}constant_load_i8:
8; GCN-NOHSA: buffer_load_ubyte v{{[0-9]+}}
9; GCN-HSA: flat_load_ubyte
10
11; EG: VTX_READ_8 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0
12define void @constant_load_i8(i8 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
13entry:
14  %ld = load i8, i8 addrspace(2)* %in
15  store i8 %ld, i8 addrspace(1)* %out
16  ret void
17}
18
19; FUNC-LABEL: {{^}}constant_load_v2i8:
20; GCN-NOHSA: buffer_load_ushort v
21; GCN-HSA: flat_load_ushort v
22
23; EG: VTX_READ_16
24define void @constant_load_v2i8(<2 x i8> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
25entry:
26  %ld = load <2 x i8>, <2 x i8> addrspace(2)* %in
27  store <2 x i8> %ld, <2 x i8> addrspace(1)* %out
28  ret void
29}
30
31; FUNC-LABEL: {{^}}constant_load_v3i8:
32; GCN: s_load_dword s
33
34; EG-DAG: VTX_READ_32
35define void @constant_load_v3i8(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 {
36entry:
37  %ld = load <3 x i8>, <3 x i8> addrspace(2)* %in
38  store <3 x i8> %ld, <3 x i8> addrspace(1)* %out
39  ret void
40}
41
42; FUNC-LABEL: {{^}}constant_load_v4i8:
43; GCN: s_load_dword s
44
45; EG: VTX_READ_32
46define void @constant_load_v4i8(<4 x i8> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
47entry:
48  %ld = load <4 x i8>, <4 x i8> addrspace(2)* %in
49  store <4 x i8> %ld, <4 x i8> addrspace(1)* %out
50  ret void
51}
52
53; FUNC-LABEL: {{^}}constant_load_v8i8:
54; GCN: s_load_dwordx2
55
56; EG: VTX_READ_64
57define void @constant_load_v8i8(<8 x i8> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
58entry:
59  %ld = load <8 x i8>, <8 x i8> addrspace(2)* %in
60  store <8 x i8> %ld, <8 x i8> addrspace(1)* %out
61  ret void
62}
63
64; FUNC-LABEL: {{^}}constant_load_v16i8:
65; GCN: s_load_dwordx4
66
67; EG: VTX_READ_128
68define void @constant_load_v16i8(<16 x i8> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
69entry:
70  %ld = load <16 x i8>, <16 x i8> addrspace(2)* %in
71  store <16 x i8> %ld, <16 x i8> addrspace(1)* %out
72  ret void
73}
74
75; FUNC-LABEL: {{^}}constant_zextload_i8_to_i32:
76; GCN-NOHSA: buffer_load_ubyte v{{[0-9]+}},
77; GCN-HSA: flat_load_ubyte
78
79; EG: VTX_READ_8 T{{[0-9]+\.X, T[0-9]+\.X}}
80define void @constant_zextload_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
81  %a = load i8, i8 addrspace(2)* %in
82  %ext = zext i8 %a to i32
83  store i32 %ext, i32 addrspace(1)* %out
84  ret void
85}
86
87; FUNC-LABEL: {{^}}constant_sextload_i8_to_i32:
88; GCN-NOHSA: buffer_load_sbyte
89; GCN-HSA: flat_load_sbyte
90
91; EG: VTX_READ_8 [[DST:T[0-9]\.[XYZW]]], [[DST]]
92; EG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST]], 0.0, literal
93; EG: 8
94define void @constant_sextload_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
95  %ld = load i8, i8 addrspace(2)* %in
96  %ext = sext i8 %ld to i32
97  store i32 %ext, i32 addrspace(1)* %out
98  ret void
99}
100
101; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i32:
102define void @constant_zextload_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
103  %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
104  %ext = zext <1 x i8> %load to <1 x i32>
105  store <1 x i32> %ext, <1 x i32> addrspace(1)* %out
106  ret void
107}
108
109; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i32:
110define void @constant_sextload_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
111  %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
112  %ext = sext <1 x i8> %load to <1 x i32>
113  store <1 x i32> %ext, <1 x i32> addrspace(1)* %out
114  ret void
115}
116
117; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i32:
118; GCN-NOHSA: buffer_load_ubyte
119; GCN-NOHSA: buffer_load_ubyte
120; GCN-HSA: flat_load_ubyte
121; GCN-HSA: flat_load_ubyte
122; EG: VTX_READ_8
123; EG: VTX_READ_8
124define void @constant_zextload_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
125  %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
126  %ext = zext <2 x i8> %load to <2 x i32>
127  store <2 x i32> %ext, <2 x i32> addrspace(1)* %out
128  ret void
129}
130
131; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i32:
132; GCN-NOHSA: buffer_load_sbyte
133; GCN-NOHSA: buffer_load_sbyte
134; GCN-HSA: flat_load_sbyte
135; GCN-HSA: flat_load_sbyte
136
137; EG-DAG: VTX_READ_8 [[DST_X:T[0-9]\.[XYZW]]], [[DST_X]]
138; EG-DAG: VTX_READ_8 [[DST_Y:T[0-9]\.[XYZW]]], [[DST_Y]]
139; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_X]], 0.0, literal
140; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Y]], 0.0, literal
141; EG-DAG: 8
142; EG-DAG: 8
143define void @constant_sextload_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
144  %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
145  %ext = sext <2 x i8> %load to <2 x i32>
146  store <2 x i32> %ext, <2 x i32> addrspace(1)* %out
147  ret void
148}
149
150; FUNC-LABEL: {{^}}constant_zextload_v3i8_to_v3i32:
151; GCN: s_load_dword s
152
153; GCN-DAG: s_bfe_u32
154; GCN-DAG: s_bfe_u32
155; GCN-DAG: s_and_b32
156define void @constant_zextload_v3i8_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 {
157entry:
158  %ld = load <3 x i8>, <3 x i8> addrspace(2)* %in
159  %ext = zext <3 x i8> %ld to <3 x i32>
160  store <3 x i32> %ext, <3 x i32> addrspace(1)* %out
161  ret void
162}
163
164; FUNC-LABEL: {{^}}constant_sextload_v3i8_to_v3i32:
165; GCN: s_load_dword s
166
167; GCN-DAG: s_bfe_i32
168; GCN-DAG: s_bfe_i32
169; GCN-DAG: s_bfe_i32
170define void @constant_sextload_v3i8_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i8> addrspace(2)* %in) #0 {
171entry:
172  %ld = load <3 x i8>, <3 x i8> addrspace(2)* %in
173  %ext = sext <3 x i8> %ld to <3 x i32>
174  store <3 x i32> %ext, <3 x i32> addrspace(1)* %out
175  ret void
176}
177
178; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i32:
179; GCN-NOHSA: buffer_load_ubyte
180; GCN-NOHSA: buffer_load_ubyte
181; GCN-NOHSA: buffer_load_ubyte
182; GCN-NOHSA: buffer_load_ubyte
183; GCN-HSA: flat_load_ubyte
184; GCN-HSA: flat_load_ubyte
185; GCN-HSA: flat_load_ubyte
186; GCN-HSA: flat_load_ubyte
187
188; EG: VTX_READ_8
189; EG: VTX_READ_8
190; EG: VTX_READ_8
191; EG: VTX_READ_8
192define void @constant_zextload_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
193  %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
194  %ext = zext <4 x i8> %load to <4 x i32>
195  store <4 x i32> %ext, <4 x i32> addrspace(1)* %out
196  ret void
197}
198
199; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i32:
200; GCN-NOHSA: buffer_load_sbyte
201; GCN-NOHSA: buffer_load_sbyte
202; GCN-NOHSA: buffer_load_sbyte
203; GCN-NOHSA: buffer_load_sbyte
204; GCN-HSA: flat_load_sbyte
205; GCN-HSA: flat_load_sbyte
206; GCN-HSA: flat_load_sbyte
207; GCN-HSA: flat_load_sbyte
208
209; EG-DAG: VTX_READ_8 [[DST_X:T[0-9]\.[XYZW]]], [[DST_X]]
210; EG-DAG: VTX_READ_8 [[DST_Y:T[0-9]\.[XYZW]]], [[DST_Y]]
211; EG-DAG: VTX_READ_8 [[DST_Z:T[0-9]\.[XYZW]]], [[DST_Z]]
212; EG-DAG: VTX_READ_8 [[DST_W:T[0-9]\.[XYZW]]], [[DST_W]]
213; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_X]], 0.0, literal
214; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Y]], 0.0, literal
215; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_Z]], 0.0, literal
216; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST_W]], 0.0, literal
217; EG-DAG: 8
218; EG-DAG: 8
219; EG-DAG: 8
220; EG-DAG: 8
221define void @constant_sextload_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
222  %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
223  %ext = sext <4 x i8> %load to <4 x i32>
224  store <4 x i32> %ext, <4 x i32> addrspace(1)* %out
225  ret void
226}
227
228; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i32:
229; GCN-NOHSA: buffer_load_ubyte
230; GCN-NOHSA: buffer_load_ubyte
231; GCN-NOHSA: buffer_load_ubyte
232; GCN-NOHSA: buffer_load_ubyte
233; GCN-NOHSA: buffer_load_ubyte
234; GCN-NOHSA: buffer_load_ubyte
235; GCN-NOHSA: buffer_load_ubyte
236; GCN-NOHSA: buffer_load_ubyte
237
238; GCN-HSA: flat_load_ubyte
239; GCN-HSA: flat_load_ubyte
240; GCN-HSA: flat_load_ubyte
241; GCN-HSA: flat_load_ubyte
242; GCN-HSA: flat_load_ubyte
243; GCN-HSA: flat_load_ubyte
244; GCN-HSA: flat_load_ubyte
245; GCN-HSA: flat_load_ubyte
246define void @constant_zextload_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
247  %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
248  %ext = zext <8 x i8> %load to <8 x i32>
249  store <8 x i32> %ext, <8 x i32> addrspace(1)* %out
250  ret void
251}
252
253; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i32:
254; GCN-NOHSA: buffer_load_sbyte
255; GCN-NOHSA: buffer_load_sbyte
256; GCN-NOHSA: buffer_load_sbyte
257; GCN-NOHSA: buffer_load_sbyte
258; GCN-NOHSA: buffer_load_sbyte
259; GCN-NOHSA: buffer_load_sbyte
260; GCN-NOHSA: buffer_load_sbyte
261; GCN-NOHSA: buffer_load_sbyte
262
263; GCN-HSA: flat_load_sbyte
264; GCN-HSA: flat_load_sbyte
265; GCN-HSA: flat_load_sbyte
266; GCN-HSA: flat_load_sbyte
267; GCN-HSA: flat_load_sbyte
268; GCN-HSA: flat_load_sbyte
269; GCN-HSA: flat_load_sbyte
270; GCN-HSA: flat_load_sbyte
271define void @constant_sextload_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
272  %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
273  %ext = sext <8 x i8> %load to <8 x i32>
274  store <8 x i32> %ext, <8 x i32> addrspace(1)* %out
275  ret void
276}
277
278; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i32:
279define void @constant_zextload_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
280  %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
281  %ext = zext <16 x i8> %load to <16 x i32>
282  store <16 x i32> %ext, <16 x i32> addrspace(1)* %out
283  ret void
284}
285
286; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i32:
287define void @constant_sextload_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
288  %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
289  %ext = sext <16 x i8> %load to <16 x i32>
290  store <16 x i32> %ext, <16 x i32> addrspace(1)* %out
291  ret void
292}
293
294; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i32:
295define void @constant_zextload_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
296  %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
297  %ext = zext <32 x i8> %load to <32 x i32>
298  store <32 x i32> %ext, <32 x i32> addrspace(1)* %out
299  ret void
300}
301
302; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i32:
303define void @constant_sextload_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
304  %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
305  %ext = sext <32 x i8> %load to <32 x i32>
306  store <32 x i32> %ext, <32 x i32> addrspace(1)* %out
307  ret void
308}
309
310; FUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i32:
311define void @constant_zextload_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
312  %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
313  %ext = zext <64 x i8> %load to <64 x i32>
314  store <64 x i32> %ext, <64 x i32> addrspace(1)* %out
315  ret void
316}
317
318; FUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i32:
319define void @constant_sextload_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
320  %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
321  %ext = sext <64 x i8> %load to <64 x i32>
322  store <64 x i32> %ext, <64 x i32> addrspace(1)* %out
323  ret void
324}
325
326; FUNC-LABEL: {{^}}constant_zextload_i8_to_i64:
327; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}}
328
329; GCN-NOHSA-DAG: buffer_load_ubyte v[[LO:[0-9]+]],
330; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]]
331
332; GCN-HSA-DAG: flat_load_ubyte v[[LO:[0-9]+]],
333; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]]
334define void @constant_zextload_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
335  %a = load i8, i8 addrspace(2)* %in
336  %ext = zext i8 %a to i64
337  store i64 %ext, i64 addrspace(1)* %out
338  ret void
339}
340
341; FUNC-LABEL: {{^}}constant_sextload_i8_to_i64:
342; GCN-NOHSA: buffer_load_sbyte v[[LO:[0-9]+]],
343; GCN-HSA: flat_load_sbyte v[[LO:[0-9]+]],
344; GCN: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]]
345
346; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
347; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]{{\]}}
348define void @constant_sextload_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
349  %a = load i8, i8 addrspace(2)* %in
350  %ext = sext i8 %a to i64
351  store i64 %ext, i64 addrspace(1)* %out
352  ret void
353}
354
355; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i64:
356define void @constant_zextload_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
357  %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
358  %ext = zext <1 x i8> %load to <1 x i64>
359  store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
360  ret void
361}
362
363; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i64:
364define void @constant_sextload_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
365  %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
366  %ext = sext <1 x i8> %load to <1 x i64>
367  store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
368  ret void
369}
370
371; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i64:
372define void @constant_zextload_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
373  %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
374  %ext = zext <2 x i8> %load to <2 x i64>
375  store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
376  ret void
377}
378
379; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i64:
380define void @constant_sextload_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
381  %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
382  %ext = sext <2 x i8> %load to <2 x i64>
383  store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
384  ret void
385}
386
387; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i64:
388define void @constant_zextload_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
389  %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
390  %ext = zext <4 x i8> %load to <4 x i64>
391  store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
392  ret void
393}
394
395; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i64:
396define void @constant_sextload_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
397  %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
398  %ext = sext <4 x i8> %load to <4 x i64>
399  store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
400  ret void
401}
402
403; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i64:
404define void @constant_zextload_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
405  %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
406  %ext = zext <8 x i8> %load to <8 x i64>
407  store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
408  ret void
409}
410
411; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i64:
412define void @constant_sextload_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
413  %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
414  %ext = sext <8 x i8> %load to <8 x i64>
415  store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
416  ret void
417}
418
419; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i64:
420define void @constant_zextload_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
421  %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
422  %ext = zext <16 x i8> %load to <16 x i64>
423  store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
424  ret void
425}
426
427; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i64:
428define void @constant_sextload_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
429  %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
430  %ext = sext <16 x i8> %load to <16 x i64>
431  store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
432  ret void
433}
434
435; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i64:
436define void @constant_zextload_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
437  %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
438  %ext = zext <32 x i8> %load to <32 x i64>
439  store <32 x i64> %ext, <32 x i64> addrspace(1)* %out
440  ret void
441}
442
443; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i64:
444define void @constant_sextload_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
445  %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
446  %ext = sext <32 x i8> %load to <32 x i64>
447  store <32 x i64> %ext, <32 x i64> addrspace(1)* %out
448  ret void
449}
450
451; XFUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i64:
452; define void @constant_zextload_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
453;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
454;   %ext = zext <64 x i8> %load to <64 x i64>
455;   store <64 x i64> %ext, <64 x i64> addrspace(1)* %out
456;   ret void
457; }
458
459; XFUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i64:
460; define void @constant_sextload_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
461;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
462;   %ext = sext <64 x i8> %load to <64 x i64>
463;   store <64 x i64> %ext, <64 x i64> addrspace(1)* %out
464;   ret void
465; }
466
467; FUNC-LABEL: {{^}}constant_zextload_i8_to_i16:
468; GCN-NOHSA: buffer_load_ubyte v[[VAL:[0-9]+]],
469; GCN-NOHSA: buffer_store_short v[[VAL]]
470
471; GCN-HSA: flat_load_ubyte v[[VAL:[0-9]+]],
472; GCN-HSA: flat_store_short v{{\[[0-9]+:[0-9]+\]}}, v[[VAL]]
473define void @constant_zextload_i8_to_i16(i16 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
474  %a = load i8, i8 addrspace(2)* %in
475  %ext = zext i8 %a to i16
476  store i16 %ext, i16 addrspace(1)* %out
477  ret void
478}
479
480; FUNC-LABEL: {{^}}constant_sextload_i8_to_i16:
481; GCN-NOHSA: buffer_load_sbyte v[[VAL:[0-9]+]],
482; GCN-HSA: flat_load_sbyte v[[VAL:[0-9]+]],
483
484; GCN-NOHSA: buffer_store_short v[[VAL]]
485; GCN-HSA: flat_store_short v{{\[[0-9]+:[0-9]+\]}}, v[[VAL]]
486define void @constant_sextload_i8_to_i16(i16 addrspace(1)* %out, i8 addrspace(2)* %in) #0 {
487  %a = load i8, i8 addrspace(2)* %in
488  %ext = sext i8 %a to i16
489  store i16 %ext, i16 addrspace(1)* %out
490  ret void
491}
492
493; FUNC-LABEL: {{^}}constant_zextload_v1i8_to_v1i16:
494define void @constant_zextload_v1i8_to_v1i16(<1 x i16> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
495  %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
496  %ext = zext <1 x i8> %load to <1 x i16>
497  store <1 x i16> %ext, <1 x i16> addrspace(1)* %out
498  ret void
499}
500
501; FUNC-LABEL: {{^}}constant_sextload_v1i8_to_v1i16:
502define void @constant_sextload_v1i8_to_v1i16(<1 x i16> addrspace(1)* %out, <1 x i8> addrspace(2)* %in) #0 {
503  %load = load <1 x i8>, <1 x i8> addrspace(2)* %in
504  %ext = sext <1 x i8> %load to <1 x i16>
505  store <1 x i16> %ext, <1 x i16> addrspace(1)* %out
506  ret void
507}
508
509; FUNC-LABEL: {{^}}constant_zextload_v2i8_to_v2i16:
510define void @constant_zextload_v2i8_to_v2i16(<2 x i16> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
511  %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
512  %ext = zext <2 x i8> %load to <2 x i16>
513  store <2 x i16> %ext, <2 x i16> addrspace(1)* %out
514  ret void
515}
516
517; FUNC-LABEL: {{^}}constant_sextload_v2i8_to_v2i16:
518define void @constant_sextload_v2i8_to_v2i16(<2 x i16> addrspace(1)* %out, <2 x i8> addrspace(2)* %in) #0 {
519  %load = load <2 x i8>, <2 x i8> addrspace(2)* %in
520  %ext = sext <2 x i8> %load to <2 x i16>
521  store <2 x i16> %ext, <2 x i16> addrspace(1)* %out
522  ret void
523}
524
525; FUNC-LABEL: {{^}}constant_zextload_v4i8_to_v4i16:
526define void @constant_zextload_v4i8_to_v4i16(<4 x i16> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
527  %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
528  %ext = zext <4 x i8> %load to <4 x i16>
529  store <4 x i16> %ext, <4 x i16> addrspace(1)* %out
530  ret void
531}
532
533; FUNC-LABEL: {{^}}constant_sextload_v4i8_to_v4i16:
534define void @constant_sextload_v4i8_to_v4i16(<4 x i16> addrspace(1)* %out, <4 x i8> addrspace(2)* %in) #0 {
535  %load = load <4 x i8>, <4 x i8> addrspace(2)* %in
536  %ext = sext <4 x i8> %load to <4 x i16>
537  store <4 x i16> %ext, <4 x i16> addrspace(1)* %out
538  ret void
539}
540
541; FUNC-LABEL: {{^}}constant_zextload_v8i8_to_v8i16:
542define void @constant_zextload_v8i8_to_v8i16(<8 x i16> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
543  %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
544  %ext = zext <8 x i8> %load to <8 x i16>
545  store <8 x i16> %ext, <8 x i16> addrspace(1)* %out
546  ret void
547}
548
549; FUNC-LABEL: {{^}}constant_sextload_v8i8_to_v8i16:
550define void @constant_sextload_v8i8_to_v8i16(<8 x i16> addrspace(1)* %out, <8 x i8> addrspace(2)* %in) #0 {
551  %load = load <8 x i8>, <8 x i8> addrspace(2)* %in
552  %ext = sext <8 x i8> %load to <8 x i16>
553  store <8 x i16> %ext, <8 x i16> addrspace(1)* %out
554  ret void
555}
556
557; FUNC-LABEL: {{^}}constant_zextload_v16i8_to_v16i16:
558define void @constant_zextload_v16i8_to_v16i16(<16 x i16> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
559  %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
560  %ext = zext <16 x i8> %load to <16 x i16>
561  store <16 x i16> %ext, <16 x i16> addrspace(1)* %out
562  ret void
563}
564
565; FUNC-LABEL: {{^}}constant_sextload_v16i8_to_v16i16:
566define void @constant_sextload_v16i8_to_v16i16(<16 x i16> addrspace(1)* %out, <16 x i8> addrspace(2)* %in) #0 {
567  %load = load <16 x i8>, <16 x i8> addrspace(2)* %in
568  %ext = sext <16 x i8> %load to <16 x i16>
569  store <16 x i16> %ext, <16 x i16> addrspace(1)* %out
570  ret void
571}
572
573; FUNC-LABEL: {{^}}constant_zextload_v32i8_to_v32i16:
574define void @constant_zextload_v32i8_to_v32i16(<32 x i16> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
575  %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
576  %ext = zext <32 x i8> %load to <32 x i16>
577  store <32 x i16> %ext, <32 x i16> addrspace(1)* %out
578  ret void
579}
580
581; FUNC-LABEL: {{^}}constant_sextload_v32i8_to_v32i16:
582define void @constant_sextload_v32i8_to_v32i16(<32 x i16> addrspace(1)* %out, <32 x i8> addrspace(2)* %in) #0 {
583  %load = load <32 x i8>, <32 x i8> addrspace(2)* %in
584  %ext = sext <32 x i8> %load to <32 x i16>
585  store <32 x i16> %ext, <32 x i16> addrspace(1)* %out
586  ret void
587}
588
589; XFUNC-LABEL: {{^}}constant_zextload_v64i8_to_v64i16:
590; define void @constant_zextload_v64i8_to_v64i16(<64 x i16> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
591;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
592;   %ext = zext <64 x i8> %load to <64 x i16>
593;   store <64 x i16> %ext, <64 x i16> addrspace(1)* %out
594;   ret void
595; }
596
597; XFUNC-LABEL: {{^}}constant_sextload_v64i8_to_v64i16:
598; define void @constant_sextload_v64i8_to_v64i16(<64 x i16> addrspace(1)* %out, <64 x i8> addrspace(2)* %in) #0 {
599;   %load = load <64 x i8>, <64 x i8> addrspace(2)* %in
600;   %ext = sext <64 x i8> %load to <64 x i16>
601;   store <64 x i16> %ext, <64 x i16> addrspace(1)* %out
602;   ret void
603; }
604
605attributes #0 = { nounwind }
606