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
5 ; FUNC-LABEL: @ngroups_x
6 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
7 ; EG: MOV [[VAL]], KC0[0].X
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) {
14 %0 = call i32 @llvm.r600.read.ngroups.x() #0
15 store i32 %0, i32 addrspace(1)* %out
19 ; FUNC-LABEL: @ngroups_y
20 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
21 ; EG: MOV [[VAL]], KC0[0].Y
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) {
28 %0 = call i32 @llvm.r600.read.ngroups.y() #0
29 store i32 %0, i32 addrspace(1)* %out
33 ; FUNC-LABEL: @ngroups_z
34 ; EG: MEM_RAT_CACHELESS STORE_RAW [[VAL:T[0-9]+\.X]]
35 ; EG: MOV [[VAL]], KC0[0].Z
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) {
42 %0 = call i32 @llvm.r600.read.ngroups.z() #0
43 store i32 %0, i32 addrspace(1)* %out
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
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) {
56 %0 = call i32 @llvm.r600.read.global.size.x() #0
57 store i32 %0, i32 addrspace(1)* %out
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
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) {
70 %0 = call i32 @llvm.r600.read.global.size.y() #0
71 store i32 %0, i32 addrspace(1)* %out
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
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) {
84 %0 = call i32 @llvm.r600.read.global.size.z() #0
85 store i32 %0, i32 addrspace(1)* %out
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
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) {
98 %0 = call i32 @llvm.r600.read.local.size.x() #0
99 store i32 %0, i32 addrspace(1)* %out
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
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) {
112 %0 = call i32 @llvm.r600.read.local.size.y() #0
113 store i32 %0, i32 addrspace(1)* %out
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
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) {
126 %0 = call i32 @llvm.r600.read.local.size.z() #0
127 store i32 %0, i32 addrspace(1)* %out
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.
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) {
140 %0 = call i32 @llvm.r600.read.tgid.x() #0
141 store i32 %0, i32 addrspace(1)* %out
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) {
150 %0 = call i32 @llvm.r600.read.tgid.y() #0
151 store i32 %0, i32 addrspace(1)* %out
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) {
160 %0 = call i32 @llvm.r600.read.tgid.z() #0
161 store i32 %0, i32 addrspace(1)* %out
165 ; FUNC-LABEL: @tidig_x
166 ; SI: BUFFER_STORE_DWORD v0
167 define void @tidig_x (i32 addrspace(1)* %out) {
169 %0 = call i32 @llvm.r600.read.tidig.x() #0
170 store i32 %0, i32 addrspace(1)* %out
174 ; FUNC-LABEL: @tidig_y
175 ; SI: BUFFER_STORE_DWORD v1
176 define void @tidig_y (i32 addrspace(1)* %out) {
178 %0 = call i32 @llvm.r600.read.tidig.y() #0
179 store i32 %0, i32 addrspace(1)* %out
183 ; FUNC-LABEL: @tidig_z
184 ; SI: BUFFER_STORE_DWORD v2
185 define void @tidig_z (i32 addrspace(1)* %out) {
187 %0 = call i32 @llvm.r600.read.tidig.z() #0
188 store i32 %0, i32 addrspace(1)* %out
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
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
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
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
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
212 attributes #0 = { readnone }