Revert "R600: Add new intrinsic to read work dimensions"
[oota-llvm.git] / test / CodeGen / R600 / work-item-intrinsics.ll
1 ; 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
3
4
5 ; FUNC-LABEL: {{^}}ngroups_x:
6 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
7 ; EG: MOV [[VAL]], KC0[0].X
8
9 ; 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]]
12 define void @ngroups_x (i32 addrspace(1)* %out) {
13 entry:
14   %0 = call i32 @llvm.r600.read.ngroups.x() #0
15   store i32 %0, i32 addrspace(1)* %out
16   ret void
17 }
18
19 ; FUNC-LABEL: {{^}}ngroups_y:
20 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
21 ; EG: MOV [[VAL]], KC0[0].Y
22
23 ; 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]]
26 define void @ngroups_y (i32 addrspace(1)* %out) {
27 entry:
28   %0 = call i32 @llvm.r600.read.ngroups.y() #0
29   store i32 %0, i32 addrspace(1)* %out
30   ret void
31 }
32
33 ; FUNC-LABEL: {{^}}ngroups_z:
34 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
35 ; EG: MOV [[VAL]], KC0[0].Z
36
37 ; 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]]
40 define void @ngroups_z (i32 addrspace(1)* %out) {
41 entry:
42   %0 = call i32 @llvm.r600.read.ngroups.z() #0
43   store i32 %0, i32 addrspace(1)* %out
44   ret void
45 }
46
47 ; FUNC-LABEL: {{^}}global_size_x:
48 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
49 ; EG: MOV [[VAL]], KC0[0].W
50
51 ; 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]]
54 define void @global_size_x (i32 addrspace(1)* %out) {
55 entry:
56   %0 = call i32 @llvm.r600.read.global.size.x() #0
57   store i32 %0, i32 addrspace(1)* %out
58   ret void
59 }
60
61 ; FUNC-LABEL: {{^}}global_size_y:
62 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
63 ; EG: MOV [[VAL]], KC0[1].X
64
65 ; 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]]
68 define void @global_size_y (i32 addrspace(1)* %out) {
69 entry:
70   %0 = call i32 @llvm.r600.read.global.size.y() #0
71   store i32 %0, i32 addrspace(1)* %out
72   ret void
73 }
74
75 ; FUNC-LABEL: {{^}}global_size_z:
76 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
77 ; EG: MOV [[VAL]], KC0[1].Y
78
79 ; 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]]
82 define void @global_size_z (i32 addrspace(1)* %out) {
83 entry:
84   %0 = call i32 @llvm.r600.read.global.size.z() #0
85   store i32 %0, i32 addrspace(1)* %out
86   ret void
87 }
88
89 ; FUNC-LABEL: {{^}}local_size_x:
90 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
91 ; EG: MOV [[VAL]], KC0[1].Z
92
93 ; 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]]
96 define void @local_size_x (i32 addrspace(1)* %out) {
97 entry:
98   %0 = call i32 @llvm.r600.read.local.size.x() #0
99   store i32 %0, i32 addrspace(1)* %out
100   ret void
101 }
102
103 ; FUNC-LABEL: {{^}}local_size_y:
104 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
105 ; EG: MOV [[VAL]], KC0[1].W
106
107 ; 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]]
110 define void @local_size_y (i32 addrspace(1)* %out) {
111 entry:
112   %0 = call i32 @llvm.r600.read.local.size.y() #0
113   store i32 %0, i32 addrspace(1)* %out
114   ret void
115 }
116
117 ; FUNC-LABEL: {{^}}local_size_z:
118 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
119 ; EG: MOV [[VAL]], KC0[2].X
120
121 ; 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]]
124 define void @local_size_z (i32 addrspace(1)* %out) {
125 entry:
126   %0 = call i32 @llvm.r600.read.local.size.z() #0
127   store i32 %0, i32 addrspace(1)* %out
128   ret void
129 }
130
131 ; The tgid values are stored in sgprs offset by the number of user sgprs.
132 ; Currently we always use exactly 2 user sgprs for the pointer to the
133 ; kernel arguments, but this may change in the future.
134
135 ; FUNC-LABEL: {{^}}tgid_x:
136 ; SI: V_MOV_B32_e32 [[VVAL:v[0-9]+]], s4
137 ; SI: BUFFER_STORE_DWORD [[VVAL]]
138 define void @tgid_x (i32 addrspace(1)* %out) {
139 entry:
140   %0 = call i32 @llvm.r600.read.tgid.x() #0
141   store i32 %0, i32 addrspace(1)* %out
142   ret void
143 }
144
145 ; FUNC-LABEL: {{^}}tgid_y:
146 ; SI: V_MOV_B32_e32 [[VVAL:v[0-9]+]], s5
147 ; SI: BUFFER_STORE_DWORD [[VVAL]]
148 define void @tgid_y (i32 addrspace(1)* %out) {
149 entry:
150   %0 = call i32 @llvm.r600.read.tgid.y() #0
151   store i32 %0, i32 addrspace(1)* %out
152   ret void
153 }
154
155 ; FUNC-LABEL: {{^}}tgid_z:
156 ; SI: V_MOV_B32_e32 [[VVAL:v[0-9]+]], s6
157 ; SI: BUFFER_STORE_DWORD [[VVAL]]
158 define void @tgid_z (i32 addrspace(1)* %out) {
159 entry:
160   %0 = call i32 @llvm.r600.read.tgid.z() #0
161   store i32 %0, i32 addrspace(1)* %out
162   ret void
163 }
164
165 ; FUNC-LABEL: {{^}}tidig_x:
166 ; SI: BUFFER_STORE_DWORD v0
167 define void @tidig_x (i32 addrspace(1)* %out) {
168 entry:
169   %0 = call i32 @llvm.r600.read.tidig.x() #0
170   store i32 %0, i32 addrspace(1)* %out
171   ret void
172 }
173
174 ; FUNC-LABEL: {{^}}tidig_y:
175 ; SI: BUFFER_STORE_DWORD v1
176 define void @tidig_y (i32 addrspace(1)* %out) {
177 entry:
178   %0 = call i32 @llvm.r600.read.tidig.y() #0
179   store i32 %0, i32 addrspace(1)* %out
180   ret void
181 }
182
183 ; FUNC-LABEL: {{^}}tidig_z:
184 ; SI: BUFFER_STORE_DWORD v2
185 define void @tidig_z (i32 addrspace(1)* %out) {
186 entry:
187   %0 = call i32 @llvm.r600.read.tidig.z() #0
188   store i32 %0, i32 addrspace(1)* %out
189   ret void
190 }
191
192 declare i32 @llvm.r600.read.ngroups.x() #0
193 declare i32 @llvm.r600.read.ngroups.y() #0
194 declare i32 @llvm.r600.read.ngroups.z() #0
195
196 declare i32 @llvm.r600.read.global.size.x() #0
197 declare i32 @llvm.r600.read.global.size.y() #0
198 declare i32 @llvm.r600.read.global.size.z() #0
199
200 declare i32 @llvm.r600.read.local.size.x() #0
201 declare i32 @llvm.r600.read.local.size.y() #0
202 declare i32 @llvm.r600.read.local.size.z() #0
203
204 declare i32 @llvm.r600.read.tgid.x() #0
205 declare i32 @llvm.r600.read.tgid.y() #0
206 declare i32 @llvm.r600.read.tgid.z() #0
207
208 declare i32 @llvm.r600.read.tidig.x() #0
209 declare i32 @llvm.r600.read.tidig.y() #0
210 declare i32 @llvm.r600.read.tidig.z() #0
211
212 attributes #0 = { readnone }