blob: 4328e964c1bf83f8984bc6ebe6efe8ea631dee02 [file] [log] [blame]
Marek Olsakfa6607d2015-02-11 14:26:46 +00001; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=GCN -check-prefix=FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=VI -check-prefix=GCN -check-prefix=FUNC %s
Jan Vesely30479502014-07-31 22:11:03 +00003; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
Tom Stellard94593ee2013-06-03 17:40:18 +00004
Jan Vesely30479502014-07-31 22:11:03 +00005
Tom Stellard79243d92014-10-01 17:15:17 +00006; FUNC-LABEL: {{^}}ngroups_x:
Jan Vesely30479502014-07-31 22:11:03 +00007; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
8; EG: MOV [[VAL]], KC0[0].X
9
Marek Olsakfa6607d2015-02-11 14:26:46 +000010; GCN: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0
11; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
12; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000013define void @ngroups_x (i32 addrspace(1)* %out) {
14entry:
15 %0 = call i32 @llvm.r600.read.ngroups.x() #0
16 store i32 %0, i32 addrspace(1)* %out
17 ret void
18}
19
Tom Stellard79243d92014-10-01 17:15:17 +000020; FUNC-LABEL: {{^}}ngroups_y:
Jan Vesely30479502014-07-31 22:11:03 +000021; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
22; EG: MOV [[VAL]], KC0[0].Y
23
Tom Stellard326d6ec2014-11-05 14:50:53 +000024; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x1
Marek Olsakfa6607d2015-02-11 14:26:46 +000025; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x4
26; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
27; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000028define void @ngroups_y (i32 addrspace(1)* %out) {
29entry:
30 %0 = call i32 @llvm.r600.read.ngroups.y() #0
31 store i32 %0, i32 addrspace(1)* %out
32 ret void
33}
34
Tom Stellard79243d92014-10-01 17:15:17 +000035; FUNC-LABEL: {{^}}ngroups_z:
Jan Vesely30479502014-07-31 22:11:03 +000036; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
37; EG: MOV [[VAL]], KC0[0].Z
38
Tom Stellard326d6ec2014-11-05 14:50:53 +000039; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x2
Marek Olsakfa6607d2015-02-11 14:26:46 +000040; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x8
41; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
42; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000043define void @ngroups_z (i32 addrspace(1)* %out) {
44entry:
45 %0 = call i32 @llvm.r600.read.ngroups.z() #0
46 store i32 %0, i32 addrspace(1)* %out
47 ret void
48}
49
Tom Stellard79243d92014-10-01 17:15:17 +000050; FUNC-LABEL: {{^}}global_size_x:
Jan Vesely30479502014-07-31 22:11:03 +000051; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
52; EG: MOV [[VAL]], KC0[0].W
53
Tom Stellard326d6ec2014-11-05 14:50:53 +000054; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x3
Marek Olsakfa6607d2015-02-11 14:26:46 +000055; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0xc
56; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
57; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000058define void @global_size_x (i32 addrspace(1)* %out) {
59entry:
60 %0 = call i32 @llvm.r600.read.global.size.x() #0
61 store i32 %0, i32 addrspace(1)* %out
62 ret void
63}
64
Tom Stellard79243d92014-10-01 17:15:17 +000065; FUNC-LABEL: {{^}}global_size_y:
Jan Vesely30479502014-07-31 22:11:03 +000066; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
67; EG: MOV [[VAL]], KC0[1].X
68
Tom Stellard326d6ec2014-11-05 14:50:53 +000069; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x4
Marek Olsakfa6607d2015-02-11 14:26:46 +000070; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x10
71; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
72; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000073define void @global_size_y (i32 addrspace(1)* %out) {
74entry:
75 %0 = call i32 @llvm.r600.read.global.size.y() #0
76 store i32 %0, i32 addrspace(1)* %out
77 ret void
78}
79
Tom Stellard79243d92014-10-01 17:15:17 +000080; FUNC-LABEL: {{^}}global_size_z:
Jan Vesely30479502014-07-31 22:11:03 +000081; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
82; EG: MOV [[VAL]], KC0[1].Y
83
Tom Stellard326d6ec2014-11-05 14:50:53 +000084; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x5
Marek Olsakfa6607d2015-02-11 14:26:46 +000085; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x14
86; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
87; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000088define void @global_size_z (i32 addrspace(1)* %out) {
89entry:
90 %0 = call i32 @llvm.r600.read.global.size.z() #0
91 store i32 %0, i32 addrspace(1)* %out
92 ret void
93}
94
Tom Stellard79243d92014-10-01 17:15:17 +000095; FUNC-LABEL: {{^}}local_size_x:
Jan Vesely30479502014-07-31 22:11:03 +000096; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
97; EG: MOV [[VAL]], KC0[1].Z
98
Tom Stellard326d6ec2014-11-05 14:50:53 +000099; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x6
Marek Olsakfa6607d2015-02-11 14:26:46 +0000100; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x18
101; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
102; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000103define void @local_size_x (i32 addrspace(1)* %out) {
104entry:
105 %0 = call i32 @llvm.r600.read.local.size.x() #0
106 store i32 %0, i32 addrspace(1)* %out
107 ret void
108}
109
Tom Stellard79243d92014-10-01 17:15:17 +0000110; FUNC-LABEL: {{^}}local_size_y:
Jan Vesely30479502014-07-31 22:11:03 +0000111; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
112; EG: MOV [[VAL]], KC0[1].W
113
Tom Stellard326d6ec2014-11-05 14:50:53 +0000114; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x7
Marek Olsakfa6607d2015-02-11 14:26:46 +0000115; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x1c
116; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
117; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000118define void @local_size_y (i32 addrspace(1)* %out) {
119entry:
120 %0 = call i32 @llvm.r600.read.local.size.y() #0
121 store i32 %0, i32 addrspace(1)* %out
122 ret void
123}
124
Tom Stellard79243d92014-10-01 17:15:17 +0000125; FUNC-LABEL: {{^}}local_size_z:
Jan Vesely30479502014-07-31 22:11:03 +0000126; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
127; EG: MOV [[VAL]], KC0[2].X
128
Tom Stellard326d6ec2014-11-05 14:50:53 +0000129; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x8
Marek Olsakfa6607d2015-02-11 14:26:46 +0000130; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x20
131; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
132; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000133define void @local_size_z (i32 addrspace(1)* %out) {
134entry:
135 %0 = call i32 @llvm.r600.read.local.size.z() #0
136 store i32 %0, i32 addrspace(1)* %out
137 ret void
138}
139
Jan Veselye5121f32014-10-14 20:05:26 +0000140; FUNC-LABEL: {{^}}get_work_dim:
141; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
142; EG: MOV [[VAL]], KC0[2].Z
143
Tom Stellard326d6ec2014-11-05 14:50:53 +0000144; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0xb
Marek Olsakfa6607d2015-02-11 14:26:46 +0000145; VI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x2c
146; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
147; GCN: buffer_store_dword [[VVAL]]
Jan Veselye5121f32014-10-14 20:05:26 +0000148define void @get_work_dim (i32 addrspace(1)* %out) {
149entry:
150 %0 = call i32 @llvm.AMDGPU.read.workdim() #0
151 store i32 %0, i32 addrspace(1)* %out
152 ret void
153}
154
Tom Stellardb02094e2014-07-21 15:45:01 +0000155; The tgid values are stored in sgprs offset by the number of user sgprs.
156; Currently we always use exactly 2 user sgprs for the pointer to the
Tom Stellard94593ee2013-06-03 17:40:18 +0000157; kernel arguments, but this may change in the future.
158
Tom Stellard79243d92014-10-01 17:15:17 +0000159; FUNC-LABEL: {{^}}tgid_x:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000160; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], s4
161; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000162define void @tgid_x (i32 addrspace(1)* %out) {
163entry:
164 %0 = call i32 @llvm.r600.read.tgid.x() #0
165 store i32 %0, i32 addrspace(1)* %out
166 ret void
167}
168
Tom Stellard79243d92014-10-01 17:15:17 +0000169; FUNC-LABEL: {{^}}tgid_y:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000170; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], s5
171; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000172define void @tgid_y (i32 addrspace(1)* %out) {
173entry:
174 %0 = call i32 @llvm.r600.read.tgid.y() #0
175 store i32 %0, i32 addrspace(1)* %out
176 ret void
177}
178
Tom Stellard79243d92014-10-01 17:15:17 +0000179; FUNC-LABEL: {{^}}tgid_z:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000180; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], s6
181; GCN: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000182define void @tgid_z (i32 addrspace(1)* %out) {
183entry:
184 %0 = call i32 @llvm.r600.read.tgid.z() #0
185 store i32 %0, i32 addrspace(1)* %out
186 ret void
187}
188
Tom Stellard79243d92014-10-01 17:15:17 +0000189; FUNC-LABEL: {{^}}tidig_x:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000190; GCN: buffer_store_dword v0
Tom Stellard94593ee2013-06-03 17:40:18 +0000191define void @tidig_x (i32 addrspace(1)* %out) {
192entry:
193 %0 = call i32 @llvm.r600.read.tidig.x() #0
194 store i32 %0, i32 addrspace(1)* %out
195 ret void
196}
197
Tom Stellard79243d92014-10-01 17:15:17 +0000198; FUNC-LABEL: {{^}}tidig_y:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000199; GCN: buffer_store_dword v1
Tom Stellard94593ee2013-06-03 17:40:18 +0000200define void @tidig_y (i32 addrspace(1)* %out) {
201entry:
202 %0 = call i32 @llvm.r600.read.tidig.y() #0
203 store i32 %0, i32 addrspace(1)* %out
204 ret void
205}
206
Tom Stellard79243d92014-10-01 17:15:17 +0000207; FUNC-LABEL: {{^}}tidig_z:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000208; GCN: buffer_store_dword v2
Tom Stellard94593ee2013-06-03 17:40:18 +0000209define void @tidig_z (i32 addrspace(1)* %out) {
210entry:
211 %0 = call i32 @llvm.r600.read.tidig.z() #0
212 store i32 %0, i32 addrspace(1)* %out
213 ret void
214}
215
216declare i32 @llvm.r600.read.ngroups.x() #0
217declare i32 @llvm.r600.read.ngroups.y() #0
218declare i32 @llvm.r600.read.ngroups.z() #0
219
220declare i32 @llvm.r600.read.global.size.x() #0
221declare i32 @llvm.r600.read.global.size.y() #0
222declare i32 @llvm.r600.read.global.size.z() #0
223
224declare i32 @llvm.r600.read.local.size.x() #0
225declare i32 @llvm.r600.read.local.size.y() #0
226declare i32 @llvm.r600.read.local.size.z() #0
227
228declare i32 @llvm.r600.read.tgid.x() #0
229declare i32 @llvm.r600.read.tgid.y() #0
230declare i32 @llvm.r600.read.tgid.z() #0
231
232declare i32 @llvm.r600.read.tidig.x() #0
233declare i32 @llvm.r600.read.tidig.y() #0
234declare i32 @llvm.r600.read.tidig.z() #0
235
Jan Veselye5121f32014-10-14 20:05:26 +0000236declare i32 @llvm.AMDGPU.read.workdim() #0
237
Tom Stellard94593ee2013-06-03 17:40:18 +0000238attributes #0 = { readnone }