1; RUN: llc -march=amdgcn -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck --check-prefixes=GCN,GFX90A %s
2
3; GCN-LABEL: {{^}}func_empty:
4; GCN-NOT: buffer_
5; GCN-NOT: v_accvgpr
6; GCN:     s_setpc_b64
7define void @func_empty() #0 {
8  ret void
9}
10
11; GCN-LABEL: {{^}}func_areg_4:
12; GCN-NOT: buffer_
13; GCN-NOT: v_accvgpr
14; GCN: use agpr3
15; GCN-NOT: buffer_
16; GCN-NOT: v_accvgpr
17; GCN: s_setpc_b64
18define void @func_areg_4() #0 {
19  call void asm sideeffect "; use agpr3", "~{a3}" ()
20  ret void
21}
22
23; GCN-LABEL: {{^}}func_areg_32:
24; GCN-NOT: buffer_
25; GCN-NOT: v_accvgpr
26; GCN: use agpr31
27; GCN-NOT: buffer_
28; GCN-NOT: v_accvgpr
29; GCN: s_setpc_b64
30define void @func_areg_32() #0 {
31  call void asm sideeffect "; use agpr31", "~{a31}" ()
32  ret void
33}
34
35; GCN-LABEL: {{^}}func_areg_33:
36; GFX908-NOT: buffer_
37; GCN-NOT:    v_accvgpr
38; GCN:        use agpr32
39; GFX908-NOT: buffer_
40; GCN-NOT:    v_accvgpr
41; GCN:        s_setpc_b64
42define void @func_areg_33() #0 {
43  call void asm sideeffect "; use agpr32", "~{a32}" ()
44  ret void
45}
46
47; GCN-LABEL: {{^}}func_areg_64:
48; GFX908-NOT: buffer_
49; GCN-NOT:    v_accvgpr
50; GFX90A:     buffer_store_dword a63,
51; GCN:        use agpr63
52; GFX90A:     buffer_load_dword a63,
53; GCN-NOT:    v_accvgpr
54; GCN:        s_setpc_b64
55define void @func_areg_64() #0 {
56  call void asm sideeffect "; use agpr63", "~{a63}" ()
57  ret void
58}
59
60; GCN-LABEL: {{^}}func_areg_31_63:
61; GFX908-NOT: buffer_
62; GCN-NOT:    v_accvgpr
63; GFX90A:     buffer_store_dword a63,
64; GCN:        use agpr31, agpr63
65; GFX90A:     buffer_load_dword a63,
66; GCN-NOT:    buffer_
67; GCN-NOT:    v_accvgpr
68; GCN:        s_setpc_b64
69define void @func_areg_31_63() #0 {
70  call void asm sideeffect "; use agpr31, agpr63", "~{a31},~{a63}" ()
71  ret void
72}
73
74declare void @func_unknown() #0
75
76; GCN-LABEL: {{^}}test_call_empty:
77; GCN-NOT:         buffer_
78; GCN-NOT:         v_accvgpr
79; GCN:             def a[0:31]
80; GFX908-COUNT-8:  v_accvgpr_read_b32
81; GFX90A-NOT:      v_accvgpr
82; GCN-NOT:         buffer_
83; GCN:             s_swappc_b64
84; GCN-NOT:         buffer_
85; GFX90A-NOT:      v_accvgpr
86; GFX908-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], v[{{[0-9:]+}}]
87; GFX90A-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], a[{{[0-9:]+}}]
88; GCN:             s_endpgm
89define amdgpu_kernel void @test_call_empty() #0 {
90bb:
91  %reg = call <32 x float> asm sideeffect "; def $0", "=a"()
92  call void @func_empty()
93  store volatile <32 x float> %reg, <32 x float> addrspace(1)* undef
94  ret void
95}
96
97; GCN-LABEL: {{^}}test_call_areg4:
98; GCN-NOT:         buffer_
99; GCN-NOT:         v_accvgpr
100; GFX908:          def a[0:31]
101; GFX90A:          def a[4:35]
102; GFX908-COUNT-8:  v_accvgpr_read_b32
103; GFX90A-NOT:      v_accvgpr
104; GCN-NOT:         buffer_
105; GCN:             s_swappc_b64
106; GCN-NOT:         buffer_
107; GFX90A-NOT:      v_accvgpr
108; GFX908-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], v[{{[0-9:]+}}]
109; GFX90A-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], a[{{[0-9:]+}}]
110; GCN:             s_endpgm
111define amdgpu_kernel void @test_call_areg4() #0 {
112bb:
113  %reg = call <32 x float> asm sideeffect "; def $0", "=a"()
114  call void @func_areg_4()
115  store volatile <32 x float> %reg, <32 x float> addrspace(1)* undef
116  ret void
117}
118
119; GCN-LABEL: {{^}}test_call_areg32:
120; GCN-NOT:         buffer_
121; GCN-NOT:         v_accvgpr
122; GFX908:          def a[0:31]
123; GFX90A:          def a[32:63]
124; GFX908-COUNT-8:  v_accvgpr_read_b32
125; GFX90A-NOT:      v_accvgpr
126; GCN-NOT:         buffer_
127; GCN:             s_swappc_b64
128; GCN-NOT:         buffer_
129; GFX90A-NOT:      v_accvgpr
130; GFX908-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], v[{{[0-9:]+}}]
131; GFX90A-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], a[{{[0-9:]+}}]
132; GCN:             s_endpgm
133define amdgpu_kernel void @test_call_areg32() #0 {
134bb:
135  %reg = call <32 x float> asm sideeffect "; def $0", "=a"()
136  call void @func_areg_32()
137  store volatile <32 x float> %reg, <32 x float> addrspace(1)* undef
138  ret void
139}
140
141; GCN-LABEL: {{^}}test_call_areg64:
142; GCN-NOT:         buffer_
143; GCN-NOT:         v_accvgpr
144; GCN:             def a[0:31]
145; GFX908-COUNT-8:  v_accvgpr_read_b32
146; GFX90A-NOT:      v_accvgpr
147; GCN-NOT:         buffer_
148; GCN:             s_swappc_b64
149; GCN-NOT:         buffer_
150; GFX90A-NOT:      v_accvgpr
151; GFX908-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], v[{{[0-9:]+}}]
152; GFX90A-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], a[{{[0-9:]+}}]
153; GCN:             s_endpgm
154define amdgpu_kernel void @test_call_areg64() #0 {
155bb:
156  %reg = call <32 x float> asm sideeffect "; def $0", "=a"()
157  call void @func_areg_64()
158  store volatile <32 x float> %reg, <32 x float> addrspace(1)* undef
159  ret void
160}
161
162; GCN-LABEL: {{^}}test_call_areg31_63:
163; GCN-NOT:         buffer_
164; GCN-NOT:         v_accvgpr
165; GFX908:          def a[0:31]
166; GFX90A:          def a[32:63]
167; GFX908-COUNT-8:  v_accvgpr_read_b32
168; GFX90A-NOT:      v_accvgpr
169; GCN-NOT:         buffer_
170; GCN:             s_swappc_b64
171; GCN-NOT:         buffer_
172; GFX90A-NOT:      v_accvgpr
173; GFX908-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], v[{{[0-9:]+}}]
174; GFX90A-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], a[{{[0-9:]+}}]
175; GCN:             s_endpgm
176define amdgpu_kernel void @test_call_areg31_63() #0 {
177bb:
178  %reg = call <32 x float> asm sideeffect "; def $0", "=a"()
179  call void @func_areg_31_63()
180  store volatile <32 x float> %reg, <32 x float> addrspace(1)* undef
181  ret void
182}
183
184; GCN-LABEL: {{^}}test_call_unknown:
185; GCN-NOT:         buffer_
186; GCN-NOT:         v_accvgpr
187; GFX908:          def a[0:31]
188; GFX90A:          def a[32:63]
189; GFX908-COUNT-8:  v_accvgpr_read_b32
190; GFX90A-NOT:      v_accvgpr
191; GCN-NOT:         buffer_
192; GCN:             s_swappc_b64
193; GCN-NOT:         buffer_
194; GFX90A-NOT:      v_accvgpr
195; GFX908-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], v[{{[0-9:]+}}]
196; GFX90A-COUNT-8:  global_store_dwordx4 v[{{[0-9:]+}}], a[{{[0-9:]+}}]
197; GCN:             s_endpgm
198define amdgpu_kernel void @test_call_unknown() #0 {
199bb:
200  %reg = call <32 x float> asm sideeffect "; def $0", "=a"()
201  call void @func_unknown()
202  store volatile <32 x float> %reg, <32 x float> addrspace(1)* undef
203  ret void
204}
205
206attributes #0 = { nounwind noinline "amdgpu-flat-work-group-size"="1,512" }
207