1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX9 %s
3; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX10 %s
4; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX11 %s
5; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GFX8-UNPACKED %s
6
7define amdgpu_ps void @load_1d_f16_tfe_dmask0(<8 x i32> inreg %rsrc, i32 %s) {
8; GFX9-LABEL: load_1d_f16_tfe_dmask0:
9; GFX9:       ; %bb.0:
10; GFX9-NEXT:    v_mov_b32_e32 v1, 0
11; GFX9-NEXT:    s_mov_b32 s11, s9
12; GFX9-NEXT:    s_mov_b32 s10, s8
13; GFX9-NEXT:    s_mov_b32 s9, s7
14; GFX9-NEXT:    s_mov_b32 s8, s6
15; GFX9-NEXT:    s_mov_b32 s7, s5
16; GFX9-NEXT:    s_mov_b32 s6, s4
17; GFX9-NEXT:    s_mov_b32 s5, s3
18; GFX9-NEXT:    s_mov_b32 s4, s2
19; GFX9-NEXT:    v_mov_b32_e32 v2, v1
20; GFX9-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
21; GFX9-NEXT:    s_waitcnt vmcnt(0)
22; GFX9-NEXT:    global_store_short v[0:1], v1, off
23; GFX9-NEXT:    s_waitcnt vmcnt(0)
24; GFX9-NEXT:    global_store_dword v[0:1], v2, off
25; GFX9-NEXT:    s_waitcnt vmcnt(0)
26; GFX9-NEXT:    s_endpgm
27;
28; GFX10-LABEL: load_1d_f16_tfe_dmask0:
29; GFX10:       ; %bb.0:
30; GFX10-NEXT:    v_mov_b32_e32 v1, 0
31; GFX10-NEXT:    s_mov_b32 s11, s9
32; GFX10-NEXT:    s_mov_b32 s10, s8
33; GFX10-NEXT:    s_mov_b32 s9, s7
34; GFX10-NEXT:    s_mov_b32 s8, s6
35; GFX10-NEXT:    s_mov_b32 s7, s5
36; GFX10-NEXT:    s_mov_b32 s6, s4
37; GFX10-NEXT:    s_mov_b32 s5, s3
38; GFX10-NEXT:    s_mov_b32 s4, s2
39; GFX10-NEXT:    v_mov_b32_e32 v2, v1
40; GFX10-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
41; GFX10-NEXT:    s_waitcnt vmcnt(0)
42; GFX10-NEXT:    global_store_short v[0:1], v1, off
43; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
44; GFX10-NEXT:    global_store_dword v[0:1], v2, off
45; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
46; GFX10-NEXT:    s_endpgm
47;
48; GFX11-LABEL: load_1d_f16_tfe_dmask0:
49; GFX11:       ; %bb.0:
50; GFX11-NEXT:    v_mov_b32_e32 v1, 0
51; GFX11-NEXT:    s_mov_b32 s11, s9
52; GFX11-NEXT:    s_mov_b32 s10, s8
53; GFX11-NEXT:    s_mov_b32 s9, s7
54; GFX11-NEXT:    s_mov_b32 s8, s6
55; GFX11-NEXT:    s_mov_b32 s7, s5
56; GFX11-NEXT:    s_mov_b32 s6, s4
57; GFX11-NEXT:    s_mov_b32 s5, s3
58; GFX11-NEXT:    s_mov_b32 s4, s2
59; GFX11-NEXT:    v_mov_b32_e32 v2, v1
60; GFX11-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
61; GFX11-NEXT:    s_waitcnt vmcnt(0)
62; GFX11-NEXT:    global_store_b16 v[0:1], v1, off dlc
63; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
64; GFX11-NEXT:    global_store_b32 v[0:1], v2, off dlc
65; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
66; GFX11-NEXT:    s_endpgm
67;
68; GFX8-UNPACKED-LABEL: load_1d_f16_tfe_dmask0:
69; GFX8-UNPACKED:       ; %bb.0:
70; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v1, 0
71; GFX8-UNPACKED-NEXT:    s_mov_b32 s11, s9
72; GFX8-UNPACKED-NEXT:    s_mov_b32 s10, s8
73; GFX8-UNPACKED-NEXT:    s_mov_b32 s9, s7
74; GFX8-UNPACKED-NEXT:    s_mov_b32 s8, s6
75; GFX8-UNPACKED-NEXT:    s_mov_b32 s7, s5
76; GFX8-UNPACKED-NEXT:    s_mov_b32 s6, s4
77; GFX8-UNPACKED-NEXT:    s_mov_b32 s5, s3
78; GFX8-UNPACKED-NEXT:    s_mov_b32 s4, s2
79; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v2, v1
80; GFX8-UNPACKED-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
81; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
82; GFX8-UNPACKED-NEXT:    flat_store_short v[0:1], v1
83; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
84; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v2
85; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
86; GFX8-UNPACKED-NEXT:    s_endpgm
87  %v = call { half, i32 } @llvm.amdgcn.image.load.1d.sl_f16i32s.i32(i32 0, i32 %s, <8 x i32> %rsrc, i32 1, i32 0)
88  %v.data = extractvalue { half, i32 } %v, 0
89  %v.err = extractvalue { half, i32 } %v, 1
90  store volatile half %v.data, half addrspace(1)* undef
91  store volatile i32 %v.err, i32 addrspace(1)* undef
92  ret void
93}
94
95define amdgpu_ps void @load_1d_f16_tfe_dmask1(<8 x i32> inreg %rsrc, i32 %s) {
96; GFX9-LABEL: load_1d_f16_tfe_dmask1:
97; GFX9:       ; %bb.0:
98; GFX9-NEXT:    v_mov_b32_e32 v1, 0
99; GFX9-NEXT:    s_mov_b32 s11, s9
100; GFX9-NEXT:    s_mov_b32 s10, s8
101; GFX9-NEXT:    s_mov_b32 s9, s7
102; GFX9-NEXT:    s_mov_b32 s8, s6
103; GFX9-NEXT:    s_mov_b32 s7, s5
104; GFX9-NEXT:    s_mov_b32 s6, s4
105; GFX9-NEXT:    s_mov_b32 s5, s3
106; GFX9-NEXT:    s_mov_b32 s4, s2
107; GFX9-NEXT:    v_mov_b32_e32 v2, v1
108; GFX9-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
109; GFX9-NEXT:    s_waitcnt vmcnt(0)
110; GFX9-NEXT:    global_store_short v[0:1], v1, off
111; GFX9-NEXT:    s_waitcnt vmcnt(0)
112; GFX9-NEXT:    global_store_dword v[0:1], v2, off
113; GFX9-NEXT:    s_waitcnt vmcnt(0)
114; GFX9-NEXT:    s_endpgm
115;
116; GFX10-LABEL: load_1d_f16_tfe_dmask1:
117; GFX10:       ; %bb.0:
118; GFX10-NEXT:    v_mov_b32_e32 v1, 0
119; GFX10-NEXT:    s_mov_b32 s11, s9
120; GFX10-NEXT:    s_mov_b32 s10, s8
121; GFX10-NEXT:    s_mov_b32 s9, s7
122; GFX10-NEXT:    s_mov_b32 s8, s6
123; GFX10-NEXT:    s_mov_b32 s7, s5
124; GFX10-NEXT:    s_mov_b32 s6, s4
125; GFX10-NEXT:    s_mov_b32 s5, s3
126; GFX10-NEXT:    s_mov_b32 s4, s2
127; GFX10-NEXT:    v_mov_b32_e32 v2, v1
128; GFX10-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
129; GFX10-NEXT:    s_waitcnt vmcnt(0)
130; GFX10-NEXT:    global_store_short v[0:1], v1, off
131; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
132; GFX10-NEXT:    global_store_dword v[0:1], v2, off
133; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
134; GFX10-NEXT:    s_endpgm
135;
136; GFX11-LABEL: load_1d_f16_tfe_dmask1:
137; GFX11:       ; %bb.0:
138; GFX11-NEXT:    v_mov_b32_e32 v1, 0
139; GFX11-NEXT:    s_mov_b32 s11, s9
140; GFX11-NEXT:    s_mov_b32 s10, s8
141; GFX11-NEXT:    s_mov_b32 s9, s7
142; GFX11-NEXT:    s_mov_b32 s8, s6
143; GFX11-NEXT:    s_mov_b32 s7, s5
144; GFX11-NEXT:    s_mov_b32 s6, s4
145; GFX11-NEXT:    s_mov_b32 s5, s3
146; GFX11-NEXT:    s_mov_b32 s4, s2
147; GFX11-NEXT:    v_mov_b32_e32 v2, v1
148; GFX11-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
149; GFX11-NEXT:    s_waitcnt vmcnt(0)
150; GFX11-NEXT:    global_store_b16 v[0:1], v1, off dlc
151; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
152; GFX11-NEXT:    global_store_b32 v[0:1], v2, off dlc
153; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
154; GFX11-NEXT:    s_endpgm
155;
156; GFX8-UNPACKED-LABEL: load_1d_f16_tfe_dmask1:
157; GFX8-UNPACKED:       ; %bb.0:
158; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v1, 0
159; GFX8-UNPACKED-NEXT:    s_mov_b32 s11, s9
160; GFX8-UNPACKED-NEXT:    s_mov_b32 s10, s8
161; GFX8-UNPACKED-NEXT:    s_mov_b32 s9, s7
162; GFX8-UNPACKED-NEXT:    s_mov_b32 s8, s6
163; GFX8-UNPACKED-NEXT:    s_mov_b32 s7, s5
164; GFX8-UNPACKED-NEXT:    s_mov_b32 s6, s4
165; GFX8-UNPACKED-NEXT:    s_mov_b32 s5, s3
166; GFX8-UNPACKED-NEXT:    s_mov_b32 s4, s2
167; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v2, v1
168; GFX8-UNPACKED-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
169; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
170; GFX8-UNPACKED-NEXT:    flat_store_short v[0:1], v1
171; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
172; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v2
173; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
174; GFX8-UNPACKED-NEXT:    s_endpgm
175  %v = call { half, i32 } @llvm.amdgcn.image.load.1d.sl_f16i32s.i32(i32 1, i32 %s, <8 x i32> %rsrc, i32 1, i32 0)
176  %v.data = extractvalue { half, i32 } %v, 0
177  %v.err = extractvalue { half, i32 } %v, 1
178  store volatile half %v.data, half addrspace(1)* undef
179  store volatile i32 %v.err, i32 addrspace(1)* undef
180  ret void
181}
182
183define amdgpu_ps void @load_1d_v2f16_tfe_dmask0(<8 x i32> inreg %rsrc, i32 %s) {
184; GFX9-LABEL: load_1d_v2f16_tfe_dmask0:
185; GFX9:       ; %bb.0:
186; GFX9-NEXT:    v_mov_b32_e32 v1, 0
187; GFX9-NEXT:    s_mov_b32 s11, s9
188; GFX9-NEXT:    s_mov_b32 s10, s8
189; GFX9-NEXT:    s_mov_b32 s9, s7
190; GFX9-NEXT:    s_mov_b32 s8, s6
191; GFX9-NEXT:    s_mov_b32 s7, s5
192; GFX9-NEXT:    s_mov_b32 s6, s4
193; GFX9-NEXT:    s_mov_b32 s5, s3
194; GFX9-NEXT:    s_mov_b32 s4, s2
195; GFX9-NEXT:    v_mov_b32_e32 v2, v1
196; GFX9-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
197; GFX9-NEXT:    s_waitcnt vmcnt(0)
198; GFX9-NEXT:    global_store_dword v[0:1], v1, off
199; GFX9-NEXT:    s_waitcnt vmcnt(0)
200; GFX9-NEXT:    global_store_dword v[0:1], v2, off
201; GFX9-NEXT:    s_waitcnt vmcnt(0)
202; GFX9-NEXT:    s_endpgm
203;
204; GFX10-LABEL: load_1d_v2f16_tfe_dmask0:
205; GFX10:       ; %bb.0:
206; GFX10-NEXT:    v_mov_b32_e32 v1, 0
207; GFX10-NEXT:    s_mov_b32 s11, s9
208; GFX10-NEXT:    s_mov_b32 s10, s8
209; GFX10-NEXT:    s_mov_b32 s9, s7
210; GFX10-NEXT:    s_mov_b32 s8, s6
211; GFX10-NEXT:    s_mov_b32 s7, s5
212; GFX10-NEXT:    s_mov_b32 s6, s4
213; GFX10-NEXT:    s_mov_b32 s5, s3
214; GFX10-NEXT:    s_mov_b32 s4, s2
215; GFX10-NEXT:    v_mov_b32_e32 v2, v1
216; GFX10-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
217; GFX10-NEXT:    s_waitcnt vmcnt(0)
218; GFX10-NEXT:    global_store_dword v[0:1], v1, off
219; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
220; GFX10-NEXT:    global_store_dword v[0:1], v2, off
221; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
222; GFX10-NEXT:    s_endpgm
223;
224; GFX11-LABEL: load_1d_v2f16_tfe_dmask0:
225; GFX11:       ; %bb.0:
226; GFX11-NEXT:    v_mov_b32_e32 v1, 0
227; GFX11-NEXT:    s_mov_b32 s11, s9
228; GFX11-NEXT:    s_mov_b32 s10, s8
229; GFX11-NEXT:    s_mov_b32 s9, s7
230; GFX11-NEXT:    s_mov_b32 s8, s6
231; GFX11-NEXT:    s_mov_b32 s7, s5
232; GFX11-NEXT:    s_mov_b32 s6, s4
233; GFX11-NEXT:    s_mov_b32 s5, s3
234; GFX11-NEXT:    s_mov_b32 s4, s2
235; GFX11-NEXT:    v_mov_b32_e32 v2, v1
236; GFX11-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
237; GFX11-NEXT:    s_waitcnt vmcnt(0)
238; GFX11-NEXT:    global_store_b32 v[0:1], v1, off dlc
239; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
240; GFX11-NEXT:    global_store_b32 v[0:1], v2, off dlc
241; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
242; GFX11-NEXT:    s_endpgm
243;
244; GFX8-UNPACKED-LABEL: load_1d_v2f16_tfe_dmask0:
245; GFX8-UNPACKED:       ; %bb.0:
246; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v1, 0
247; GFX8-UNPACKED-NEXT:    s_mov_b32 s11, s9
248; GFX8-UNPACKED-NEXT:    s_mov_b32 s10, s8
249; GFX8-UNPACKED-NEXT:    s_mov_b32 s9, s7
250; GFX8-UNPACKED-NEXT:    s_mov_b32 s8, s6
251; GFX8-UNPACKED-NEXT:    s_mov_b32 s7, s5
252; GFX8-UNPACKED-NEXT:    s_mov_b32 s6, s4
253; GFX8-UNPACKED-NEXT:    s_mov_b32 s5, s3
254; GFX8-UNPACKED-NEXT:    s_mov_b32 s4, s2
255; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v2, v1
256; GFX8-UNPACKED-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
257; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
258; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v1
259; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
260; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v2
261; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
262; GFX8-UNPACKED-NEXT:    s_endpgm
263  %v = call { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 0, i32 %s, <8 x i32> %rsrc, i32 1, i32 0)
264  %v.data = extractvalue { <2 x half>, i32 } %v, 0
265  %v.err = extractvalue { <2 x half>, i32 } %v, 1
266  store volatile <2 x half> %v.data, <2 x half> addrspace(1)* undef
267  store volatile i32 %v.err, i32 addrspace(1)* undef
268  ret void
269}
270
271define amdgpu_ps void @load_1d_v2f16_tfe_dmask1(<8 x i32> inreg %rsrc, i32 %s) {
272; GFX9-LABEL: load_1d_v2f16_tfe_dmask1:
273; GFX9:       ; %bb.0:
274; GFX9-NEXT:    v_mov_b32_e32 v1, 0
275; GFX9-NEXT:    s_mov_b32 s11, s9
276; GFX9-NEXT:    s_mov_b32 s10, s8
277; GFX9-NEXT:    s_mov_b32 s9, s7
278; GFX9-NEXT:    s_mov_b32 s8, s6
279; GFX9-NEXT:    s_mov_b32 s7, s5
280; GFX9-NEXT:    s_mov_b32 s6, s4
281; GFX9-NEXT:    s_mov_b32 s5, s3
282; GFX9-NEXT:    s_mov_b32 s4, s2
283; GFX9-NEXT:    v_mov_b32_e32 v2, v1
284; GFX9-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
285; GFX9-NEXT:    s_waitcnt vmcnt(0)
286; GFX9-NEXT:    global_store_dword v[0:1], v1, off
287; GFX9-NEXT:    s_waitcnt vmcnt(0)
288; GFX9-NEXT:    global_store_dword v[0:1], v2, off
289; GFX9-NEXT:    s_waitcnt vmcnt(0)
290; GFX9-NEXT:    s_endpgm
291;
292; GFX10-LABEL: load_1d_v2f16_tfe_dmask1:
293; GFX10:       ; %bb.0:
294; GFX10-NEXT:    v_mov_b32_e32 v1, 0
295; GFX10-NEXT:    s_mov_b32 s11, s9
296; GFX10-NEXT:    s_mov_b32 s10, s8
297; GFX10-NEXT:    s_mov_b32 s9, s7
298; GFX10-NEXT:    s_mov_b32 s8, s6
299; GFX10-NEXT:    s_mov_b32 s7, s5
300; GFX10-NEXT:    s_mov_b32 s6, s4
301; GFX10-NEXT:    s_mov_b32 s5, s3
302; GFX10-NEXT:    s_mov_b32 s4, s2
303; GFX10-NEXT:    v_mov_b32_e32 v2, v1
304; GFX10-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
305; GFX10-NEXT:    s_waitcnt vmcnt(0)
306; GFX10-NEXT:    global_store_dword v[0:1], v1, off
307; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
308; GFX10-NEXT:    global_store_dword v[0:1], v2, off
309; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
310; GFX10-NEXT:    s_endpgm
311;
312; GFX11-LABEL: load_1d_v2f16_tfe_dmask1:
313; GFX11:       ; %bb.0:
314; GFX11-NEXT:    v_mov_b32_e32 v1, 0
315; GFX11-NEXT:    s_mov_b32 s11, s9
316; GFX11-NEXT:    s_mov_b32 s10, s8
317; GFX11-NEXT:    s_mov_b32 s9, s7
318; GFX11-NEXT:    s_mov_b32 s8, s6
319; GFX11-NEXT:    s_mov_b32 s7, s5
320; GFX11-NEXT:    s_mov_b32 s6, s4
321; GFX11-NEXT:    s_mov_b32 s5, s3
322; GFX11-NEXT:    s_mov_b32 s4, s2
323; GFX11-NEXT:    v_mov_b32_e32 v2, v1
324; GFX11-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16
325; GFX11-NEXT:    s_waitcnt vmcnt(0)
326; GFX11-NEXT:    global_store_b32 v[0:1], v1, off dlc
327; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
328; GFX11-NEXT:    global_store_b32 v[0:1], v2, off dlc
329; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
330; GFX11-NEXT:    s_endpgm
331;
332; GFX8-UNPACKED-LABEL: load_1d_v2f16_tfe_dmask1:
333; GFX8-UNPACKED:       ; %bb.0:
334; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v1, 0
335; GFX8-UNPACKED-NEXT:    s_mov_b32 s11, s9
336; GFX8-UNPACKED-NEXT:    s_mov_b32 s10, s8
337; GFX8-UNPACKED-NEXT:    s_mov_b32 s9, s7
338; GFX8-UNPACKED-NEXT:    s_mov_b32 s8, s6
339; GFX8-UNPACKED-NEXT:    s_mov_b32 s7, s5
340; GFX8-UNPACKED-NEXT:    s_mov_b32 s6, s4
341; GFX8-UNPACKED-NEXT:    s_mov_b32 s5, s3
342; GFX8-UNPACKED-NEXT:    s_mov_b32 s4, s2
343; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v2, v1
344; GFX8-UNPACKED-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16
345; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
346; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v1
347; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
348; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v2
349; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
350; GFX8-UNPACKED-NEXT:    s_endpgm
351  %v = call { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 1, i32 %s, <8 x i32> %rsrc, i32 1, i32 0)
352  %v.data = extractvalue { <2 x half>, i32 } %v, 0
353  %v.err = extractvalue { <2 x half>, i32 } %v, 1
354  store volatile <2 x half> %v.data, <2 x half> addrspace(1)* undef
355  store volatile i32 %v.err, i32 addrspace(1)* undef
356  ret void
357}
358
359define amdgpu_ps void @load_1d_v2f16_tfe_dmask3(<8 x i32> inreg %rsrc, i32 %s) {
360; GFX9-LABEL: load_1d_v2f16_tfe_dmask3:
361; GFX9:       ; %bb.0:
362; GFX9-NEXT:    v_mov_b32_e32 v1, 0
363; GFX9-NEXT:    s_mov_b32 s11, s9
364; GFX9-NEXT:    s_mov_b32 s10, s8
365; GFX9-NEXT:    s_mov_b32 s9, s7
366; GFX9-NEXT:    s_mov_b32 s8, s6
367; GFX9-NEXT:    s_mov_b32 s7, s5
368; GFX9-NEXT:    s_mov_b32 s6, s4
369; GFX9-NEXT:    s_mov_b32 s5, s3
370; GFX9-NEXT:    s_mov_b32 s4, s2
371; GFX9-NEXT:    v_mov_b32_e32 v2, v1
372; GFX9-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x3 unorm tfe d16
373; GFX9-NEXT:    s_waitcnt vmcnt(0)
374; GFX9-NEXT:    global_store_dword v[0:1], v1, off
375; GFX9-NEXT:    s_waitcnt vmcnt(0)
376; GFX9-NEXT:    global_store_dword v[0:1], v2, off
377; GFX9-NEXT:    s_waitcnt vmcnt(0)
378; GFX9-NEXT:    s_endpgm
379;
380; GFX10-LABEL: load_1d_v2f16_tfe_dmask3:
381; GFX10:       ; %bb.0:
382; GFX10-NEXT:    v_mov_b32_e32 v1, 0
383; GFX10-NEXT:    s_mov_b32 s11, s9
384; GFX10-NEXT:    s_mov_b32 s10, s8
385; GFX10-NEXT:    s_mov_b32 s9, s7
386; GFX10-NEXT:    s_mov_b32 s8, s6
387; GFX10-NEXT:    s_mov_b32 s7, s5
388; GFX10-NEXT:    s_mov_b32 s6, s4
389; GFX10-NEXT:    s_mov_b32 s5, s3
390; GFX10-NEXT:    s_mov_b32 s4, s2
391; GFX10-NEXT:    v_mov_b32_e32 v2, v1
392; GFX10-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm tfe d16
393; GFX10-NEXT:    s_waitcnt vmcnt(0)
394; GFX10-NEXT:    global_store_dword v[0:1], v1, off
395; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
396; GFX10-NEXT:    global_store_dword v[0:1], v2, off
397; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
398; GFX10-NEXT:    s_endpgm
399;
400; GFX11-LABEL: load_1d_v2f16_tfe_dmask3:
401; GFX11:       ; %bb.0:
402; GFX11-NEXT:    v_mov_b32_e32 v1, 0
403; GFX11-NEXT:    s_mov_b32 s11, s9
404; GFX11-NEXT:    s_mov_b32 s10, s8
405; GFX11-NEXT:    s_mov_b32 s9, s7
406; GFX11-NEXT:    s_mov_b32 s8, s6
407; GFX11-NEXT:    s_mov_b32 s7, s5
408; GFX11-NEXT:    s_mov_b32 s6, s4
409; GFX11-NEXT:    s_mov_b32 s5, s3
410; GFX11-NEXT:    s_mov_b32 s4, s2
411; GFX11-NEXT:    v_mov_b32_e32 v2, v1
412; GFX11-NEXT:    image_load v[1:2], v0, s[4:11] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm tfe d16
413; GFX11-NEXT:    s_waitcnt vmcnt(0)
414; GFX11-NEXT:    global_store_b32 v[0:1], v1, off dlc
415; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
416; GFX11-NEXT:    global_store_b32 v[0:1], v2, off dlc
417; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
418; GFX11-NEXT:    s_endpgm
419;
420; GFX8-UNPACKED-LABEL: load_1d_v2f16_tfe_dmask3:
421; GFX8-UNPACKED:       ; %bb.0:
422; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v1, 0
423; GFX8-UNPACKED-NEXT:    s_mov_b32 s11, s9
424; GFX8-UNPACKED-NEXT:    s_mov_b32 s10, s8
425; GFX8-UNPACKED-NEXT:    s_mov_b32 s9, s7
426; GFX8-UNPACKED-NEXT:    s_mov_b32 s8, s6
427; GFX8-UNPACKED-NEXT:    s_mov_b32 s7, s5
428; GFX8-UNPACKED-NEXT:    s_mov_b32 s6, s4
429; GFX8-UNPACKED-NEXT:    s_mov_b32 s5, s3
430; GFX8-UNPACKED-NEXT:    s_mov_b32 s4, s2
431; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v2, v1
432; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v3, v1
433; GFX8-UNPACKED-NEXT:    image_load v[1:3], v0, s[4:11] dmask:0x3 unorm tfe d16
434; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
435; GFX8-UNPACKED-NEXT:    v_lshlrev_b32_e32 v0, 16, v2
436; GFX8-UNPACKED-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
437; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v0
438; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
439; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v3
440; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
441; GFX8-UNPACKED-NEXT:    s_endpgm
442  %v = call { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 3, i32 %s, <8 x i32> %rsrc, i32 1, i32 0)
443  %v.data = extractvalue { <2 x half>, i32 } %v, 0
444  %v.err = extractvalue { <2 x half>, i32 } %v, 1
445  store volatile <2 x half> %v.data, <2 x half> addrspace(1)* undef
446  store volatile i32 %v.err, i32 addrspace(1)* undef
447  ret void
448}
449
450define amdgpu_ps void @load_1d_v3f16_tfe_dmask7(<8 x i32> inreg %rsrc, i32 %s) {
451; GFX9-LABEL: load_1d_v3f16_tfe_dmask7:
452; GFX9:       ; %bb.0:
453; GFX9-NEXT:    v_mov_b32_e32 v1, 0
454; GFX9-NEXT:    s_mov_b32 s11, s9
455; GFX9-NEXT:    s_mov_b32 s10, s8
456; GFX9-NEXT:    s_mov_b32 s9, s7
457; GFX9-NEXT:    s_mov_b32 s8, s6
458; GFX9-NEXT:    s_mov_b32 s7, s5
459; GFX9-NEXT:    s_mov_b32 s6, s4
460; GFX9-NEXT:    s_mov_b32 s5, s3
461; GFX9-NEXT:    s_mov_b32 s4, s2
462; GFX9-NEXT:    v_mov_b32_e32 v2, v1
463; GFX9-NEXT:    v_mov_b32_e32 v3, v1
464; GFX9-NEXT:    image_load v[1:3], v0, s[4:11] dmask:0x7 unorm tfe d16
465; GFX9-NEXT:    s_waitcnt vmcnt(0)
466; GFX9-NEXT:    global_store_short v[0:1], v2, off
467; GFX9-NEXT:    s_waitcnt vmcnt(0)
468; GFX9-NEXT:    global_store_dword v[0:1], v1, off
469; GFX9-NEXT:    s_waitcnt vmcnt(0)
470; GFX9-NEXT:    global_store_dword v[0:1], v3, off
471; GFX9-NEXT:    s_waitcnt vmcnt(0)
472; GFX9-NEXT:    s_endpgm
473;
474; GFX10-LABEL: load_1d_v3f16_tfe_dmask7:
475; GFX10:       ; %bb.0:
476; GFX10-NEXT:    v_mov_b32_e32 v1, 0
477; GFX10-NEXT:    s_mov_b32 s11, s9
478; GFX10-NEXT:    s_mov_b32 s10, s8
479; GFX10-NEXT:    s_mov_b32 s9, s7
480; GFX10-NEXT:    s_mov_b32 s8, s6
481; GFX10-NEXT:    s_mov_b32 s7, s5
482; GFX10-NEXT:    s_mov_b32 s6, s4
483; GFX10-NEXT:    s_mov_b32 s5, s3
484; GFX10-NEXT:    s_mov_b32 s4, s2
485; GFX10-NEXT:    v_mov_b32_e32 v2, v1
486; GFX10-NEXT:    v_mov_b32_e32 v3, v1
487; GFX10-NEXT:    image_load v[1:3], v0, s[4:11] dmask:0x7 dim:SQ_RSRC_IMG_1D unorm tfe d16
488; GFX10-NEXT:    s_waitcnt vmcnt(0)
489; GFX10-NEXT:    global_store_short v[0:1], v2, off
490; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
491; GFX10-NEXT:    global_store_dword v[0:1], v1, off
492; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
493; GFX10-NEXT:    global_store_dword v[0:1], v3, off
494; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
495; GFX10-NEXT:    s_endpgm
496;
497; GFX11-LABEL: load_1d_v3f16_tfe_dmask7:
498; GFX11:       ; %bb.0:
499; GFX11-NEXT:    v_mov_b32_e32 v1, 0
500; GFX11-NEXT:    s_mov_b32 s11, s9
501; GFX11-NEXT:    s_mov_b32 s10, s8
502; GFX11-NEXT:    s_mov_b32 s9, s7
503; GFX11-NEXT:    s_mov_b32 s8, s6
504; GFX11-NEXT:    s_mov_b32 s7, s5
505; GFX11-NEXT:    s_mov_b32 s6, s4
506; GFX11-NEXT:    s_mov_b32 s5, s3
507; GFX11-NEXT:    s_mov_b32 s4, s2
508; GFX11-NEXT:    v_mov_b32_e32 v2, v1
509; GFX11-NEXT:    v_mov_b32_e32 v3, v1
510; GFX11-NEXT:    image_load v[1:3], v0, s[4:11] dmask:0x7 dim:SQ_RSRC_IMG_1D unorm tfe d16
511; GFX11-NEXT:    s_waitcnt vmcnt(0)
512; GFX11-NEXT:    global_store_b16 v[0:1], v2, off dlc
513; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
514; GFX11-NEXT:    global_store_b32 v[0:1], v1, off dlc
515; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
516; GFX11-NEXT:    global_store_b32 v[0:1], v3, off dlc
517; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
518; GFX11-NEXT:    s_endpgm
519;
520; GFX8-UNPACKED-LABEL: load_1d_v3f16_tfe_dmask7:
521; GFX8-UNPACKED:       ; %bb.0:
522; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v1, 0
523; GFX8-UNPACKED-NEXT:    s_mov_b32 s11, s9
524; GFX8-UNPACKED-NEXT:    s_mov_b32 s10, s8
525; GFX8-UNPACKED-NEXT:    s_mov_b32 s9, s7
526; GFX8-UNPACKED-NEXT:    s_mov_b32 s8, s6
527; GFX8-UNPACKED-NEXT:    s_mov_b32 s7, s5
528; GFX8-UNPACKED-NEXT:    s_mov_b32 s6, s4
529; GFX8-UNPACKED-NEXT:    s_mov_b32 s5, s3
530; GFX8-UNPACKED-NEXT:    s_mov_b32 s4, s2
531; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v2, v1
532; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v3, v1
533; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v4, v1
534; GFX8-UNPACKED-NEXT:    image_load v[1:4], v0, s[4:11] dmask:0x7 unorm tfe d16
535; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
536; GFX8-UNPACKED-NEXT:    v_lshlrev_b32_e32 v0, 16, v2
537; GFX8-UNPACKED-NEXT:    flat_store_short v[0:1], v3
538; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
539; GFX8-UNPACKED-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
540; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v0
541; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
542; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v4
543; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
544; GFX8-UNPACKED-NEXT:    s_endpgm
545  %v = call { <3 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v3f16i32s.i32(i32 7, i32 %s, <8 x i32> %rsrc, i32 1, i32 0)
546  %v.data = extractvalue { <3 x half>, i32 } %v, 0
547  %v.err = extractvalue { <3 x half>, i32 } %v, 1
548  store volatile <3 x half> %v.data, <3 x half> addrspace(1)* undef
549  store volatile i32 %v.err, i32 addrspace(1)* undef
550  ret void
551}
552
553define amdgpu_ps void @load_1d_v4f16_tfe_dmask15(<8 x i32> inreg %rsrc, i32 %s) {
554; GFX9-LABEL: load_1d_v4f16_tfe_dmask15:
555; GFX9:       ; %bb.0:
556; GFX9-NEXT:    v_mov_b32_e32 v1, 0
557; GFX9-NEXT:    s_mov_b32 s11, s9
558; GFX9-NEXT:    s_mov_b32 s10, s8
559; GFX9-NEXT:    s_mov_b32 s9, s7
560; GFX9-NEXT:    s_mov_b32 s8, s6
561; GFX9-NEXT:    s_mov_b32 s7, s5
562; GFX9-NEXT:    s_mov_b32 s6, s4
563; GFX9-NEXT:    s_mov_b32 s5, s3
564; GFX9-NEXT:    s_mov_b32 s4, s2
565; GFX9-NEXT:    v_mov_b32_e32 v2, v1
566; GFX9-NEXT:    v_mov_b32_e32 v3, v1
567; GFX9-NEXT:    image_load v[1:3], v0, s[4:11] dmask:0xf unorm tfe d16
568; GFX9-NEXT:    s_waitcnt vmcnt(0)
569; GFX9-NEXT:    global_store_dwordx2 v[0:1], v[1:2], off
570; GFX9-NEXT:    s_waitcnt vmcnt(0)
571; GFX9-NEXT:    global_store_dword v[0:1], v3, off
572; GFX9-NEXT:    s_waitcnt vmcnt(0)
573; GFX9-NEXT:    s_endpgm
574;
575; GFX10-LABEL: load_1d_v4f16_tfe_dmask15:
576; GFX10:       ; %bb.0:
577; GFX10-NEXT:    v_mov_b32_e32 v1, 0
578; GFX10-NEXT:    s_mov_b32 s11, s9
579; GFX10-NEXT:    s_mov_b32 s10, s8
580; GFX10-NEXT:    s_mov_b32 s9, s7
581; GFX10-NEXT:    s_mov_b32 s8, s6
582; GFX10-NEXT:    s_mov_b32 s7, s5
583; GFX10-NEXT:    s_mov_b32 s6, s4
584; GFX10-NEXT:    s_mov_b32 s5, s3
585; GFX10-NEXT:    s_mov_b32 s4, s2
586; GFX10-NEXT:    v_mov_b32_e32 v2, v1
587; GFX10-NEXT:    v_mov_b32_e32 v3, v1
588; GFX10-NEXT:    image_load v[1:3], v0, s[4:11] dmask:0xf dim:SQ_RSRC_IMG_1D unorm tfe d16
589; GFX10-NEXT:    s_waitcnt vmcnt(0)
590; GFX10-NEXT:    global_store_dwordx2 v[0:1], v[1:2], off
591; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
592; GFX10-NEXT:    global_store_dword v[0:1], v3, off
593; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
594; GFX10-NEXT:    s_endpgm
595;
596; GFX11-LABEL: load_1d_v4f16_tfe_dmask15:
597; GFX11:       ; %bb.0:
598; GFX11-NEXT:    v_mov_b32_e32 v1, 0
599; GFX11-NEXT:    s_mov_b32 s11, s9
600; GFX11-NEXT:    s_mov_b32 s10, s8
601; GFX11-NEXT:    s_mov_b32 s9, s7
602; GFX11-NEXT:    s_mov_b32 s8, s6
603; GFX11-NEXT:    s_mov_b32 s7, s5
604; GFX11-NEXT:    s_mov_b32 s6, s4
605; GFX11-NEXT:    s_mov_b32 s5, s3
606; GFX11-NEXT:    s_mov_b32 s4, s2
607; GFX11-NEXT:    v_mov_b32_e32 v2, v1
608; GFX11-NEXT:    v_mov_b32_e32 v3, v1
609; GFX11-NEXT:    image_load v[1:3], v0, s[4:11] dmask:0xf dim:SQ_RSRC_IMG_1D unorm tfe d16
610; GFX11-NEXT:    s_waitcnt vmcnt(0)
611; GFX11-NEXT:    global_store_b64 v[0:1], v[1:2], off dlc
612; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
613; GFX11-NEXT:    global_store_b32 v[0:1], v3, off dlc
614; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
615; GFX11-NEXT:    s_endpgm
616;
617; GFX8-UNPACKED-LABEL: load_1d_v4f16_tfe_dmask15:
618; GFX8-UNPACKED:       ; %bb.0:
619; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v1, 0
620; GFX8-UNPACKED-NEXT:    s_mov_b32 s11, s9
621; GFX8-UNPACKED-NEXT:    s_mov_b32 s10, s8
622; GFX8-UNPACKED-NEXT:    s_mov_b32 s9, s7
623; GFX8-UNPACKED-NEXT:    s_mov_b32 s8, s6
624; GFX8-UNPACKED-NEXT:    s_mov_b32 s7, s5
625; GFX8-UNPACKED-NEXT:    s_mov_b32 s6, s4
626; GFX8-UNPACKED-NEXT:    s_mov_b32 s5, s3
627; GFX8-UNPACKED-NEXT:    s_mov_b32 s4, s2
628; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v2, v1
629; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v3, v1
630; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v4, v1
631; GFX8-UNPACKED-NEXT:    v_mov_b32_e32 v5, v1
632; GFX8-UNPACKED-NEXT:    image_load v[1:5], v0, s[4:11] dmask:0xf unorm tfe d16
633; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
634; GFX8-UNPACKED-NEXT:    v_lshlrev_b32_e32 v0, 16, v4
635; GFX8-UNPACKED-NEXT:    v_lshlrev_b32_e32 v4, 16, v2
636; GFX8-UNPACKED-NEXT:    v_or_b32_sdwa v2, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
637; GFX8-UNPACKED-NEXT:    v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
638; GFX8-UNPACKED-NEXT:    flat_store_dwordx2 v[0:1], v[1:2]
639; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
640; GFX8-UNPACKED-NEXT:    flat_store_dword v[0:1], v5
641; GFX8-UNPACKED-NEXT:    s_waitcnt vmcnt(0)
642; GFX8-UNPACKED-NEXT:    s_endpgm
643  %v = call { <4 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v4f16i32s.i32(i32 15, i32 %s, <8 x i32> %rsrc, i32 1, i32 0)
644  %v.data = extractvalue { <4 x half>, i32 } %v, 0
645  %v.err = extractvalue { <4 x half>, i32 } %v, 1
646  store volatile <4 x half> %v.data, <4 x half> addrspace(1)* undef
647  store volatile i32 %v.err, i32 addrspace(1)* undef
648  ret void
649}
650
651declare { half, i32 } @llvm.amdgcn.image.load.1d.sl_f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0
652declare { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0
653declare { <3 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v3f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0
654declare { <4 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v4f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0
655
656attributes #0 = { nounwind readonly }
657