1; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs< %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs< %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3; RUN: llc -march=r600 -mcpu=cypress < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4
5; FUNC-LABEL: {{^}}zextload_global_i8_to_i32:
6; SI: buffer_load_ubyte
7; SI: buffer_store_dword
8; SI: s_endpgm
9define void @zextload_global_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind {
10  %a = load i8, i8 addrspace(1)* %in
11  %ext = zext i8 %a to i32
12  store i32 %ext, i32 addrspace(1)* %out
13  ret void
14}
15
16; FUNC-LABEL: {{^}}sextload_global_i8_to_i32:
17; SI: buffer_load_sbyte
18; SI: buffer_store_dword
19; SI: s_endpgm
20define void @sextload_global_i8_to_i32(i32 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind {
21  %a = load i8, i8 addrspace(1)* %in
22  %ext = sext i8 %a to i32
23  store i32 %ext, i32 addrspace(1)* %out
24  ret void
25}
26
27; FUNC-LABEL: {{^}}zextload_global_v1i8_to_v1i32:
28; SI: s_endpgm
29define void @zextload_global_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind {
30  %load = load <1 x i8>, <1 x i8> addrspace(1)* %in
31  %ext = zext <1 x i8> %load to <1 x i32>
32  store <1 x i32> %ext, <1 x i32> addrspace(1)* %out
33  ret void
34}
35
36; FUNC-LABEL: {{^}}sextload_global_v1i8_to_v1i32:
37; SI: s_endpgm
38define void @sextload_global_v1i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind {
39  %load = load <1 x i8>, <1 x i8> addrspace(1)* %in
40  %ext = sext <1 x i8> %load to <1 x i32>
41  store <1 x i32> %ext, <1 x i32> addrspace(1)* %out
42  ret void
43}
44
45; FUNC-LABEL: {{^}}zextload_global_v2i8_to_v2i32:
46; SI: s_endpgm
47define void @zextload_global_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind {
48  %load = load <2 x i8>, <2 x i8> addrspace(1)* %in
49  %ext = zext <2 x i8> %load to <2 x i32>
50  store <2 x i32> %ext, <2 x i32> addrspace(1)* %out
51  ret void
52}
53
54; FUNC-LABEL: {{^}}sextload_global_v2i8_to_v2i32:
55; SI: s_endpgm
56define void @sextload_global_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind {
57  %load = load <2 x i8>, <2 x i8> addrspace(1)* %in
58  %ext = sext <2 x i8> %load to <2 x i32>
59  store <2 x i32> %ext, <2 x i32> addrspace(1)* %out
60  ret void
61}
62
63; FUNC-LABEL: {{^}}zextload_global_v4i8_to_v4i32:
64; SI: s_endpgm
65define void @zextload_global_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind {
66  %load = load <4 x i8>, <4 x i8> addrspace(1)* %in
67  %ext = zext <4 x i8> %load to <4 x i32>
68  store <4 x i32> %ext, <4 x i32> addrspace(1)* %out
69  ret void
70}
71
72; FUNC-LABEL: {{^}}sextload_global_v4i8_to_v4i32:
73; SI: s_endpgm
74define void @sextload_global_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind {
75  %load = load <4 x i8>, <4 x i8> addrspace(1)* %in
76  %ext = sext <4 x i8> %load to <4 x i32>
77  store <4 x i32> %ext, <4 x i32> addrspace(1)* %out
78  ret void
79}
80
81; FUNC-LABEL: {{^}}zextload_global_v8i8_to_v8i32:
82; SI: s_endpgm
83define void @zextload_global_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind {
84  %load = load <8 x i8>, <8 x i8> addrspace(1)* %in
85  %ext = zext <8 x i8> %load to <8 x i32>
86  store <8 x i32> %ext, <8 x i32> addrspace(1)* %out
87  ret void
88}
89
90; FUNC-LABEL: {{^}}sextload_global_v8i8_to_v8i32:
91; SI: s_endpgm
92define void @sextload_global_v8i8_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind {
93  %load = load <8 x i8>, <8 x i8> addrspace(1)* %in
94  %ext = sext <8 x i8> %load to <8 x i32>
95  store <8 x i32> %ext, <8 x i32> addrspace(1)* %out
96  ret void
97}
98
99; FUNC-LABEL: {{^}}zextload_global_v16i8_to_v16i32:
100; SI: s_endpgm
101define void @zextload_global_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind {
102  %load = load <16 x i8>, <16 x i8> addrspace(1)* %in
103  %ext = zext <16 x i8> %load to <16 x i32>
104  store <16 x i32> %ext, <16 x i32> addrspace(1)* %out
105  ret void
106}
107
108; FUNC-LABEL: {{^}}sextload_global_v16i8_to_v16i32:
109; SI: s_endpgm
110define void @sextload_global_v16i8_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind {
111  %load = load <16 x i8>, <16 x i8> addrspace(1)* %in
112  %ext = sext <16 x i8> %load to <16 x i32>
113  store <16 x i32> %ext, <16 x i32> addrspace(1)* %out
114  ret void
115}
116
117; XFUNC-LABEL: {{^}}zextload_global_v32i8_to_v32i32:
118; XSI: s_endpgm
119; define void @zextload_global_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind {
120;   %load = load <32 x i8>, <32 x i8> addrspace(1)* %in
121;   %ext = zext <32 x i8> %load to <32 x i32>
122;   store <32 x i32> %ext, <32 x i32> addrspace(1)* %out
123;   ret void
124; }
125
126; XFUNC-LABEL: {{^}}sextload_global_v32i8_to_v32i32:
127; XSI: s_endpgm
128; define void @sextload_global_v32i8_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind {
129;   %load = load <32 x i8>, <32 x i8> addrspace(1)* %in
130;   %ext = sext <32 x i8> %load to <32 x i32>
131;   store <32 x i32> %ext, <32 x i32> addrspace(1)* %out
132;   ret void
133; }
134
135; XFUNC-LABEL: {{^}}zextload_global_v64i8_to_v64i32:
136; XSI: s_endpgm
137; define void @zextload_global_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind {
138;   %load = load <64 x i8>, <64 x i8> addrspace(1)* %in
139;   %ext = zext <64 x i8> %load to <64 x i32>
140;   store <64 x i32> %ext, <64 x i32> addrspace(1)* %out
141;   ret void
142; }
143
144; XFUNC-LABEL: {{^}}sextload_global_v64i8_to_v64i32:
145; XSI: s_endpgm
146; define void @sextload_global_v64i8_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind {
147;   %load = load <64 x i8>, <64 x i8> addrspace(1)* %in
148;   %ext = sext <64 x i8> %load to <64 x i32>
149;   store <64 x i32> %ext, <64 x i32> addrspace(1)* %out
150;   ret void
151; }
152
153; FUNC-LABEL: {{^}}zextload_global_i8_to_i64:
154; SI: buffer_load_ubyte v[[LO:[0-9]+]],
155; SI: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}}
156; SI: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]]
157define void @zextload_global_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind {
158  %a = load i8, i8 addrspace(1)* %in
159  %ext = zext i8 %a to i64
160  store i64 %ext, i64 addrspace(1)* %out
161  ret void
162}
163
164; FUNC-LABEL: {{^}}sextload_global_i8_to_i64:
165; SI: buffer_load_sbyte [[LOAD:v[0-9]+]],
166; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, [[LOAD]]
167; SI: buffer_store_dwordx2
168define void @sextload_global_i8_to_i64(i64 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind {
169  %a = load i8, i8 addrspace(1)* %in
170  %ext = sext i8 %a to i64
171  store i64 %ext, i64 addrspace(1)* %out
172  ret void
173}
174
175; FUNC-LABEL: {{^}}zextload_global_v1i8_to_v1i64:
176; SI: s_endpgm
177define void @zextload_global_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind {
178  %load = load <1 x i8>, <1 x i8> addrspace(1)* %in
179  %ext = zext <1 x i8> %load to <1 x i64>
180  store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
181  ret void
182}
183
184; FUNC-LABEL: {{^}}sextload_global_v1i8_to_v1i64:
185; SI: s_endpgm
186define void @sextload_global_v1i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i8> addrspace(1)* nocapture %in) nounwind {
187  %load = load <1 x i8>, <1 x i8> addrspace(1)* %in
188  %ext = sext <1 x i8> %load to <1 x i64>
189  store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
190  ret void
191}
192
193; FUNC-LABEL: {{^}}zextload_global_v2i8_to_v2i64:
194; SI: s_endpgm
195define void @zextload_global_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind {
196  %load = load <2 x i8>, <2 x i8> addrspace(1)* %in
197  %ext = zext <2 x i8> %load to <2 x i64>
198  store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
199  ret void
200}
201
202; FUNC-LABEL: {{^}}sextload_global_v2i8_to_v2i64:
203; SI: s_endpgm
204define void @sextload_global_v2i8_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i8> addrspace(1)* nocapture %in) nounwind {
205  %load = load <2 x i8>, <2 x i8> addrspace(1)* %in
206  %ext = sext <2 x i8> %load to <2 x i64>
207  store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
208  ret void
209}
210
211; FUNC-LABEL: {{^}}zextload_global_v4i8_to_v4i64:
212; SI: s_endpgm
213define void @zextload_global_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind {
214  %load = load <4 x i8>, <4 x i8> addrspace(1)* %in
215  %ext = zext <4 x i8> %load to <4 x i64>
216  store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
217  ret void
218}
219
220; FUNC-LABEL: {{^}}sextload_global_v4i8_to_v4i64:
221; SI: s_endpgm
222define void @sextload_global_v4i8_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i8> addrspace(1)* nocapture %in) nounwind {
223  %load = load <4 x i8>, <4 x i8> addrspace(1)* %in
224  %ext = sext <4 x i8> %load to <4 x i64>
225  store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
226  ret void
227}
228
229; FUNC-LABEL: {{^}}zextload_global_v8i8_to_v8i64:
230; SI: s_endpgm
231define void @zextload_global_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind {
232  %load = load <8 x i8>, <8 x i8> addrspace(1)* %in
233  %ext = zext <8 x i8> %load to <8 x i64>
234  store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
235  ret void
236}
237
238; FUNC-LABEL: {{^}}sextload_global_v8i8_to_v8i64:
239; SI: s_endpgm
240define void @sextload_global_v8i8_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i8> addrspace(1)* nocapture %in) nounwind {
241  %load = load <8 x i8>, <8 x i8> addrspace(1)* %in
242  %ext = sext <8 x i8> %load to <8 x i64>
243  store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
244  ret void
245}
246
247; FUNC-LABEL: {{^}}zextload_global_v16i8_to_v16i64:
248; SI: s_endpgm
249define void @zextload_global_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind {
250  %load = load <16 x i8>, <16 x i8> addrspace(1)* %in
251  %ext = zext <16 x i8> %load to <16 x i64>
252  store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
253  ret void
254}
255
256; FUNC-LABEL: {{^}}sextload_global_v16i8_to_v16i64:
257; SI: s_endpgm
258define void @sextload_global_v16i8_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i8> addrspace(1)* nocapture %in) nounwind {
259  %load = load <16 x i8>, <16 x i8> addrspace(1)* %in
260  %ext = sext <16 x i8> %load to <16 x i64>
261  store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
262  ret void
263}
264
265; XFUNC-LABEL: {{^}}zextload_global_v32i8_to_v32i64:
266; XSI: s_endpgm
267; define void @zextload_global_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind {
268;   %load = load <32 x i8>, <32 x i8> addrspace(1)* %in
269;   %ext = zext <32 x i8> %load to <32 x i64>
270;   store <32 x i64> %ext, <32 x i64> addrspace(1)* %out
271;   ret void
272; }
273
274; XFUNC-LABEL: {{^}}sextload_global_v32i8_to_v32i64:
275; XSI: s_endpgm
276; define void @sextload_global_v32i8_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i8> addrspace(1)* nocapture %in) nounwind {
277;   %load = load <32 x i8>, <32 x i8> addrspace(1)* %in
278;   %ext = sext <32 x i8> %load to <32 x i64>
279;   store <32 x i64> %ext, <32 x i64> addrspace(1)* %out
280;   ret void
281; }
282
283; XFUNC-LABEL: {{^}}zextload_global_v64i8_to_v64i64:
284; XSI: s_endpgm
285; define void @zextload_global_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind {
286;   %load = load <64 x i8>, <64 x i8> addrspace(1)* %in
287;   %ext = zext <64 x i8> %load to <64 x i64>
288;   store <64 x i64> %ext, <64 x i64> addrspace(1)* %out
289;   ret void
290; }
291
292; XFUNC-LABEL: {{^}}sextload_global_v64i8_to_v64i64:
293; XSI: s_endpgm
294; define void @sextload_global_v64i8_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i8> addrspace(1)* nocapture %in) nounwind {
295;   %load = load <64 x i8>, <64 x i8> addrspace(1)* %in
296;   %ext = sext <64 x i8> %load to <64 x i64>
297;   store <64 x i64> %ext, <64 x i64> addrspace(1)* %out
298;   ret void
299; }
300