1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=gfx900 < %s | FileCheck --check-prefix=GFX9 %s
3; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=fiji < %s | FileCheck --check-prefix=GFX8 %s
4; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=tahiti < %s | FileCheck --check-prefix=GFX6 %s
5; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=gfx1010 < %s | FileCheck --check-prefix=GFX10 %s
6
7define i64 @zextload_global_i1_to_i64(i1 addrspace(1)* %ptr) {
8; GFX9-LABEL: zextload_global_i1_to_i64:
9; GFX9:       ; %bb.0:
10; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
11; GFX9-NEXT:    global_load_ubyte v0, v[0:1], off
12; GFX9-NEXT:    v_mov_b32_e32 v1, 0
13; GFX9-NEXT:    s_waitcnt vmcnt(0)
14; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
15; GFX9-NEXT:    s_setpc_b64 s[30:31]
16;
17; GFX8-LABEL: zextload_global_i1_to_i64:
18; GFX8:       ; %bb.0:
19; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
20; GFX8-NEXT:    flat_load_ubyte v0, v[0:1]
21; GFX8-NEXT:    v_mov_b32_e32 v1, 0
22; GFX8-NEXT:    s_waitcnt vmcnt(0)
23; GFX8-NEXT:    v_and_b32_e32 v0, 1, v0
24; GFX8-NEXT:    s_setpc_b64 s[30:31]
25;
26; GFX6-LABEL: zextload_global_i1_to_i64:
27; GFX6:       ; %bb.0:
28; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
29; GFX6-NEXT:    s_mov_b32 s6, 0
30; GFX6-NEXT:    s_mov_b32 s7, 0xf000
31; GFX6-NEXT:    s_mov_b64 s[4:5], 0
32; GFX6-NEXT:    buffer_load_ubyte v0, v[0:1], s[4:7], 0 addr64
33; GFX6-NEXT:    v_mov_b32_e32 v1, 0
34; GFX6-NEXT:    s_waitcnt vmcnt(0)
35; GFX6-NEXT:    v_and_b32_e32 v0, 1, v0
36; GFX6-NEXT:    s_setpc_b64 s[30:31]
37;
38; GFX10-LABEL: zextload_global_i1_to_i64:
39; GFX10:       ; %bb.0:
40; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
41; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
42; GFX10-NEXT:    global_load_ubyte v0, v[0:1], off
43; GFX10-NEXT:    v_mov_b32_e32 v1, 0
44; GFX10-NEXT:    s_waitcnt vmcnt(0)
45; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
46; GFX10-NEXT:    s_setpc_b64 s[30:31]
47  %load = load i1, i1 addrspace(1)* %ptr
48  %ext = zext i1 %load to i64
49  ret i64 %ext
50}
51
52define i64 @zextload_global_i8_to_i64(i8 addrspace(1)* %ptr) {
53; GFX9-LABEL: zextload_global_i8_to_i64:
54; GFX9:       ; %bb.0:
55; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
56; GFX9-NEXT:    global_load_ubyte v0, v[0:1], off
57; GFX9-NEXT:    v_mov_b32_e32 v1, 0
58; GFX9-NEXT:    s_waitcnt vmcnt(0)
59; GFX9-NEXT:    s_setpc_b64 s[30:31]
60;
61; GFX8-LABEL: zextload_global_i8_to_i64:
62; GFX8:       ; %bb.0:
63; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
64; GFX8-NEXT:    flat_load_ubyte v0, v[0:1]
65; GFX8-NEXT:    v_mov_b32_e32 v1, 0
66; GFX8-NEXT:    s_waitcnt vmcnt(0)
67; GFX8-NEXT:    s_setpc_b64 s[30:31]
68;
69; GFX6-LABEL: zextload_global_i8_to_i64:
70; GFX6:       ; %bb.0:
71; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
72; GFX6-NEXT:    s_mov_b32 s6, 0
73; GFX6-NEXT:    s_mov_b32 s7, 0xf000
74; GFX6-NEXT:    s_mov_b64 s[4:5], 0
75; GFX6-NEXT:    buffer_load_ubyte v0, v[0:1], s[4:7], 0 addr64
76; GFX6-NEXT:    v_mov_b32_e32 v1, 0
77; GFX6-NEXT:    s_waitcnt vmcnt(0)
78; GFX6-NEXT:    s_setpc_b64 s[30:31]
79;
80; GFX10-LABEL: zextload_global_i8_to_i64:
81; GFX10:       ; %bb.0:
82; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
83; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
84; GFX10-NEXT:    global_load_ubyte v0, v[0:1], off
85; GFX10-NEXT:    v_mov_b32_e32 v1, 0
86; GFX10-NEXT:    s_waitcnt vmcnt(0)
87; GFX10-NEXT:    s_setpc_b64 s[30:31]
88  %load = load i8, i8 addrspace(1)* %ptr
89  %ext = zext i8 %load to i64
90  ret i64 %ext
91}
92
93define i64 @zextload_global_i16_to_i64(i16 addrspace(1)* %ptr) {
94; GFX9-LABEL: zextload_global_i16_to_i64:
95; GFX9:       ; %bb.0:
96; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
97; GFX9-NEXT:    global_load_ushort v0, v[0:1], off
98; GFX9-NEXT:    v_mov_b32_e32 v1, 0
99; GFX9-NEXT:    s_waitcnt vmcnt(0)
100; GFX9-NEXT:    s_setpc_b64 s[30:31]
101;
102; GFX8-LABEL: zextload_global_i16_to_i64:
103; GFX8:       ; %bb.0:
104; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
105; GFX8-NEXT:    flat_load_ushort v0, v[0:1]
106; GFX8-NEXT:    v_mov_b32_e32 v1, 0
107; GFX8-NEXT:    s_waitcnt vmcnt(0)
108; GFX8-NEXT:    s_setpc_b64 s[30:31]
109;
110; GFX6-LABEL: zextload_global_i16_to_i64:
111; GFX6:       ; %bb.0:
112; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
113; GFX6-NEXT:    s_mov_b32 s6, 0
114; GFX6-NEXT:    s_mov_b32 s7, 0xf000
115; GFX6-NEXT:    s_mov_b64 s[4:5], 0
116; GFX6-NEXT:    buffer_load_ushort v0, v[0:1], s[4:7], 0 addr64
117; GFX6-NEXT:    v_mov_b32_e32 v1, 0
118; GFX6-NEXT:    s_waitcnt vmcnt(0)
119; GFX6-NEXT:    s_setpc_b64 s[30:31]
120;
121; GFX10-LABEL: zextload_global_i16_to_i64:
122; GFX10:       ; %bb.0:
123; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
124; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
125; GFX10-NEXT:    global_load_ushort v0, v[0:1], off
126; GFX10-NEXT:    v_mov_b32_e32 v1, 0
127; GFX10-NEXT:    s_waitcnt vmcnt(0)
128; GFX10-NEXT:    s_setpc_b64 s[30:31]
129  %load = load i16, i16 addrspace(1)* %ptr
130  %ext = zext i16 %load to i64
131  ret i64 %ext
132}
133
134define i64 @zextload_global_i32_to_i64(i32 addrspace(1)* %ptr) {
135; GFX9-LABEL: zextload_global_i32_to_i64:
136; GFX9:       ; %bb.0:
137; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
138; GFX9-NEXT:    global_load_dword v0, v[0:1], off
139; GFX9-NEXT:    v_mov_b32_e32 v1, 0
140; GFX9-NEXT:    s_waitcnt vmcnt(0)
141; GFX9-NEXT:    s_setpc_b64 s[30:31]
142;
143; GFX8-LABEL: zextload_global_i32_to_i64:
144; GFX8:       ; %bb.0:
145; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
146; GFX8-NEXT:    flat_load_dword v0, v[0:1]
147; GFX8-NEXT:    v_mov_b32_e32 v1, 0
148; GFX8-NEXT:    s_waitcnt vmcnt(0)
149; GFX8-NEXT:    s_setpc_b64 s[30:31]
150;
151; GFX6-LABEL: zextload_global_i32_to_i64:
152; GFX6:       ; %bb.0:
153; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
154; GFX6-NEXT:    s_mov_b32 s6, 0
155; GFX6-NEXT:    s_mov_b32 s7, 0xf000
156; GFX6-NEXT:    s_mov_b64 s[4:5], 0
157; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
158; GFX6-NEXT:    v_mov_b32_e32 v1, 0
159; GFX6-NEXT:    s_waitcnt vmcnt(0)
160; GFX6-NEXT:    s_setpc_b64 s[30:31]
161;
162; GFX10-LABEL: zextload_global_i32_to_i64:
163; GFX10:       ; %bb.0:
164; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
165; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
166; GFX10-NEXT:    global_load_dword v0, v[0:1], off
167; GFX10-NEXT:    v_mov_b32_e32 v1, 0
168; GFX10-NEXT:    s_waitcnt vmcnt(0)
169; GFX10-NEXT:    s_setpc_b64 s[30:31]
170  %load = load i32, i32 addrspace(1)* %ptr
171  %ext = zext i32 %load to i64
172  ret i64 %ext
173}
174
175define i96 @zextload_global_i32_to_i96(i32 addrspace(1)* %ptr) {
176; GFX9-LABEL: zextload_global_i32_to_i96:
177; GFX9:       ; %bb.0:
178; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
179; GFX9-NEXT:    global_load_dword v0, v[0:1], off
180; GFX9-NEXT:    v_mov_b32_e32 v1, 0
181; GFX9-NEXT:    v_mov_b32_e32 v2, 0
182; GFX9-NEXT:    s_waitcnt vmcnt(0)
183; GFX9-NEXT:    s_setpc_b64 s[30:31]
184;
185; GFX8-LABEL: zextload_global_i32_to_i96:
186; GFX8:       ; %bb.0:
187; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
188; GFX8-NEXT:    flat_load_dword v0, v[0:1]
189; GFX8-NEXT:    v_mov_b32_e32 v1, 0
190; GFX8-NEXT:    v_mov_b32_e32 v2, 0
191; GFX8-NEXT:    s_waitcnt vmcnt(0)
192; GFX8-NEXT:    s_setpc_b64 s[30:31]
193;
194; GFX6-LABEL: zextload_global_i32_to_i96:
195; GFX6:       ; %bb.0:
196; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
197; GFX6-NEXT:    s_mov_b32 s6, 0
198; GFX6-NEXT:    s_mov_b32 s7, 0xf000
199; GFX6-NEXT:    s_mov_b64 s[4:5], 0
200; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
201; GFX6-NEXT:    v_mov_b32_e32 v1, 0
202; GFX6-NEXT:    v_mov_b32_e32 v2, 0
203; GFX6-NEXT:    s_waitcnt vmcnt(0)
204; GFX6-NEXT:    s_setpc_b64 s[30:31]
205;
206; GFX10-LABEL: zextload_global_i32_to_i96:
207; GFX10:       ; %bb.0:
208; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
209; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
210; GFX10-NEXT:    global_load_dword v0, v[0:1], off
211; GFX10-NEXT:    v_mov_b32_e32 v1, 0
212; GFX10-NEXT:    v_mov_b32_e32 v2, 0
213; GFX10-NEXT:    s_waitcnt vmcnt(0)
214; GFX10-NEXT:    s_setpc_b64 s[30:31]
215  %load = load i32, i32 addrspace(1)* %ptr
216  %ext = zext i32 %load to i96
217  ret i96 %ext
218}
219
220define i128 @zextload_global_i32_to_i128(i32 addrspace(1)* %ptr) {
221; GFX9-LABEL: zextload_global_i32_to_i128:
222; GFX9:       ; %bb.0:
223; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
224; GFX9-NEXT:    global_load_dword v0, v[0:1], off
225; GFX9-NEXT:    v_mov_b32_e32 v1, 0
226; GFX9-NEXT:    v_mov_b32_e32 v2, 0
227; GFX9-NEXT:    v_mov_b32_e32 v3, 0
228; GFX9-NEXT:    s_waitcnt vmcnt(0)
229; GFX9-NEXT:    s_setpc_b64 s[30:31]
230;
231; GFX8-LABEL: zextload_global_i32_to_i128:
232; GFX8:       ; %bb.0:
233; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
234; GFX8-NEXT:    flat_load_dword v0, v[0:1]
235; GFX8-NEXT:    v_mov_b32_e32 v1, 0
236; GFX8-NEXT:    v_mov_b32_e32 v2, 0
237; GFX8-NEXT:    v_mov_b32_e32 v3, 0
238; GFX8-NEXT:    s_waitcnt vmcnt(0)
239; GFX8-NEXT:    s_setpc_b64 s[30:31]
240;
241; GFX6-LABEL: zextload_global_i32_to_i128:
242; GFX6:       ; %bb.0:
243; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
244; GFX6-NEXT:    s_mov_b32 s6, 0
245; GFX6-NEXT:    s_mov_b32 s7, 0xf000
246; GFX6-NEXT:    s_mov_b64 s[4:5], 0
247; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
248; GFX6-NEXT:    v_mov_b32_e32 v1, 0
249; GFX6-NEXT:    v_mov_b32_e32 v2, 0
250; GFX6-NEXT:    v_mov_b32_e32 v3, 0
251; GFX6-NEXT:    s_waitcnt vmcnt(0)
252; GFX6-NEXT:    s_setpc_b64 s[30:31]
253;
254; GFX10-LABEL: zextload_global_i32_to_i128:
255; GFX10:       ; %bb.0:
256; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
257; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
258; GFX10-NEXT:    global_load_dword v0, v[0:1], off
259; GFX10-NEXT:    v_mov_b32_e32 v1, 0
260; GFX10-NEXT:    v_mov_b32_e32 v2, 0
261; GFX10-NEXT:    v_mov_b32_e32 v3, 0
262; GFX10-NEXT:    s_waitcnt vmcnt(0)
263; GFX10-NEXT:    s_setpc_b64 s[30:31]
264  %load = load i32, i32 addrspace(1)* %ptr
265  %ext = zext i32 %load to i128
266  ret i128 %ext
267}
268