blob: 47f65f5e4e5bf0c0bb0c9b72eb0cea0354bec415 [file] [log] [blame]
Jan Vesely30479502014-07-31 22:11:03 +00001; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
2; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Tom Stellard94593ee2013-06-03 17:40:18 +00003
Jan Vesely30479502014-07-31 22:11:03 +00004
Tom Stellard79243d92014-10-01 17:15:17 +00005; FUNC-LABEL: {{^}}ngroups_x:
Jan Vesely30479502014-07-31 22:11:03 +00006; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
7; EG: MOV [[VAL]], KC0[0].X
8
Tom Stellard326d6ec2014-11-05 14:50:53 +00009; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0
10; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
11; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000012define void @ngroups_x (i32 addrspace(1)* %out) {
13entry:
14 %0 = call i32 @llvm.r600.read.ngroups.x() #0
15 store i32 %0, i32 addrspace(1)* %out
16 ret void
17}
18
Tom Stellard79243d92014-10-01 17:15:17 +000019; FUNC-LABEL: {{^}}ngroups_y:
Jan Vesely30479502014-07-31 22:11:03 +000020; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
21; EG: MOV [[VAL]], KC0[0].Y
22
Tom Stellard326d6ec2014-11-05 14:50:53 +000023; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x1
24; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
25; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000026define void @ngroups_y (i32 addrspace(1)* %out) {
27entry:
28 %0 = call i32 @llvm.r600.read.ngroups.y() #0
29 store i32 %0, i32 addrspace(1)* %out
30 ret void
31}
32
Tom Stellard79243d92014-10-01 17:15:17 +000033; FUNC-LABEL: {{^}}ngroups_z:
Jan Vesely30479502014-07-31 22:11:03 +000034; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
35; EG: MOV [[VAL]], KC0[0].Z
36
Tom Stellard326d6ec2014-11-05 14:50:53 +000037; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x2
38; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
39; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000040define void @ngroups_z (i32 addrspace(1)* %out) {
41entry:
42 %0 = call i32 @llvm.r600.read.ngroups.z() #0
43 store i32 %0, i32 addrspace(1)* %out
44 ret void
45}
46
Tom Stellard79243d92014-10-01 17:15:17 +000047; FUNC-LABEL: {{^}}global_size_x:
Jan Vesely30479502014-07-31 22:11:03 +000048; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
49; EG: MOV [[VAL]], KC0[0].W
50
Tom Stellard326d6ec2014-11-05 14:50:53 +000051; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x3
52; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
53; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000054define void @global_size_x (i32 addrspace(1)* %out) {
55entry:
56 %0 = call i32 @llvm.r600.read.global.size.x() #0
57 store i32 %0, i32 addrspace(1)* %out
58 ret void
59}
60
Tom Stellard79243d92014-10-01 17:15:17 +000061; FUNC-LABEL: {{^}}global_size_y:
Jan Vesely30479502014-07-31 22:11:03 +000062; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
63; EG: MOV [[VAL]], KC0[1].X
64
Tom Stellard326d6ec2014-11-05 14:50:53 +000065; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x4
66; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
67; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000068define void @global_size_y (i32 addrspace(1)* %out) {
69entry:
70 %0 = call i32 @llvm.r600.read.global.size.y() #0
71 store i32 %0, i32 addrspace(1)* %out
72 ret void
73}
74
Tom Stellard79243d92014-10-01 17:15:17 +000075; FUNC-LABEL: {{^}}global_size_z:
Jan Vesely30479502014-07-31 22:11:03 +000076; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
77; EG: MOV [[VAL]], KC0[1].Y
78
Tom Stellard326d6ec2014-11-05 14:50:53 +000079; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x5
80; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
81; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000082define void @global_size_z (i32 addrspace(1)* %out) {
83entry:
84 %0 = call i32 @llvm.r600.read.global.size.z() #0
85 store i32 %0, i32 addrspace(1)* %out
86 ret void
87}
88
Tom Stellard79243d92014-10-01 17:15:17 +000089; FUNC-LABEL: {{^}}local_size_x:
Jan Vesely30479502014-07-31 22:11:03 +000090; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
91; EG: MOV [[VAL]], KC0[1].Z
92
Tom Stellard326d6ec2014-11-05 14:50:53 +000093; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x6
94; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
95; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +000096define void @local_size_x (i32 addrspace(1)* %out) {
97entry:
98 %0 = call i32 @llvm.r600.read.local.size.x() #0
99 store i32 %0, i32 addrspace(1)* %out
100 ret void
101}
102
Tom Stellard79243d92014-10-01 17:15:17 +0000103; FUNC-LABEL: {{^}}local_size_y:
Jan Vesely30479502014-07-31 22:11:03 +0000104; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
105; EG: MOV [[VAL]], KC0[1].W
106
Tom Stellard326d6ec2014-11-05 14:50:53 +0000107; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x7
108; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
109; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000110define void @local_size_y (i32 addrspace(1)* %out) {
111entry:
112 %0 = call i32 @llvm.r600.read.local.size.y() #0
113 store i32 %0, i32 addrspace(1)* %out
114 ret void
115}
116
Tom Stellard79243d92014-10-01 17:15:17 +0000117; FUNC-LABEL: {{^}}local_size_z:
Jan Vesely30479502014-07-31 22:11:03 +0000118; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
119; EG: MOV [[VAL]], KC0[2].X
120
Tom Stellard326d6ec2014-11-05 14:50:53 +0000121; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0x8
122; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
123; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000124define void @local_size_z (i32 addrspace(1)* %out) {
125entry:
126 %0 = call i32 @llvm.r600.read.local.size.z() #0
127 store i32 %0, i32 addrspace(1)* %out
128 ret void
129}
130
Jan Veselye5121f32014-10-14 20:05:26 +0000131; FUNC-LABEL: {{^}}get_work_dim:
132; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
133; EG: MOV [[VAL]], KC0[2].Z
134
Tom Stellard326d6ec2014-11-05 14:50:53 +0000135; SI: s_load_dword [[VAL:s[0-9]+]], s[0:1], 0xb
136; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]]
137; SI: buffer_store_dword [[VVAL]]
Jan Veselye5121f32014-10-14 20:05:26 +0000138define void @get_work_dim (i32 addrspace(1)* %out) {
139entry:
140 %0 = call i32 @llvm.AMDGPU.read.workdim() #0
141 store i32 %0, i32 addrspace(1)* %out
142 ret void
143}
144
Tom Stellardb02094e2014-07-21 15:45:01 +0000145; The tgid values are stored in sgprs offset by the number of user sgprs.
146; Currently we always use exactly 2 user sgprs for the pointer to the
Tom Stellard94593ee2013-06-03 17:40:18 +0000147; kernel arguments, but this may change in the future.
148
Tom Stellard79243d92014-10-01 17:15:17 +0000149; FUNC-LABEL: {{^}}tgid_x:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000150; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], s4
151; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000152define void @tgid_x (i32 addrspace(1)* %out) {
153entry:
154 %0 = call i32 @llvm.r600.read.tgid.x() #0
155 store i32 %0, i32 addrspace(1)* %out
156 ret void
157}
158
Tom Stellard79243d92014-10-01 17:15:17 +0000159; FUNC-LABEL: {{^}}tgid_y:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000160; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], s5
161; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000162define void @tgid_y (i32 addrspace(1)* %out) {
163entry:
164 %0 = call i32 @llvm.r600.read.tgid.y() #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_z:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000170; SI: v_mov_b32_e32 [[VVAL:v[0-9]+]], s6
171; SI: buffer_store_dword [[VVAL]]
Tom Stellard94593ee2013-06-03 17:40:18 +0000172define void @tgid_z (i32 addrspace(1)* %out) {
173entry:
174 %0 = call i32 @llvm.r600.read.tgid.z() #0
175 store i32 %0, i32 addrspace(1)* %out
176 ret void
177}
178
Tom Stellard79243d92014-10-01 17:15:17 +0000179; FUNC-LABEL: {{^}}tidig_x:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000180; SI: buffer_store_dword v0
Tom Stellard94593ee2013-06-03 17:40:18 +0000181define void @tidig_x (i32 addrspace(1)* %out) {
182entry:
183 %0 = call i32 @llvm.r600.read.tidig.x() #0
184 store i32 %0, i32 addrspace(1)* %out
185 ret void
186}
187
Tom Stellard79243d92014-10-01 17:15:17 +0000188; FUNC-LABEL: {{^}}tidig_y:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000189; SI: buffer_store_dword v1
Tom Stellard94593ee2013-06-03 17:40:18 +0000190define void @tidig_y (i32 addrspace(1)* %out) {
191entry:
192 %0 = call i32 @llvm.r600.read.tidig.y() #0
193 store i32 %0, i32 addrspace(1)* %out
194 ret void
195}
196
Tom Stellard79243d92014-10-01 17:15:17 +0000197; FUNC-LABEL: {{^}}tidig_z:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000198; SI: buffer_store_dword v2
Tom Stellard94593ee2013-06-03 17:40:18 +0000199define void @tidig_z (i32 addrspace(1)* %out) {
200entry:
201 %0 = call i32 @llvm.r600.read.tidig.z() #0
202 store i32 %0, i32 addrspace(1)* %out
203 ret void
204}
205
206declare i32 @llvm.r600.read.ngroups.x() #0
207declare i32 @llvm.r600.read.ngroups.y() #0
208declare i32 @llvm.r600.read.ngroups.z() #0
209
210declare i32 @llvm.r600.read.global.size.x() #0
211declare i32 @llvm.r600.read.global.size.y() #0
212declare i32 @llvm.r600.read.global.size.z() #0
213
214declare i32 @llvm.r600.read.local.size.x() #0
215declare i32 @llvm.r600.read.local.size.y() #0
216declare i32 @llvm.r600.read.local.size.z() #0
217
218declare i32 @llvm.r600.read.tgid.x() #0
219declare i32 @llvm.r600.read.tgid.y() #0
220declare i32 @llvm.r600.read.tgid.z() #0
221
222declare i32 @llvm.r600.read.tidig.x() #0
223declare i32 @llvm.r600.read.tidig.y() #0
224declare i32 @llvm.r600.read.tidig.z() #0
225
Jan Veselye5121f32014-10-14 20:05:26 +0000226declare i32 @llvm.AMDGPU.read.workdim() #0
227
Tom Stellard94593ee2013-06-03 17:40:18 +0000228attributes #0 = { readnone }