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