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