Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / sub.ll
blobded308ae4f23077e572061690b55ac7271fcf4df
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX6 %s
3 ; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX8 %s
4 ; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9 %s
5 ; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1200 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX12 %s
7 declare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone speculatable
9 define amdgpu_kernel void @s_sub_i32(ptr addrspace(1) %out, i32 %a, i32 %b) {
10 ; GFX6-LABEL: s_sub_i32:
11 ; GFX6:       ; %bb.0:
12 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
13 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
14 ; GFX6-NEXT:    s_mov_b32 s6, -1
15 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
16 ; GFX6-NEXT:    s_mov_b32 s4, s0
17 ; GFX6-NEXT:    s_sub_i32 s0, s2, s3
18 ; GFX6-NEXT:    s_mov_b32 s5, s1
19 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
20 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
21 ; GFX6-NEXT:    s_endpgm
23 ; GFX8-LABEL: s_sub_i32:
24 ; GFX8:       ; %bb.0:
25 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
26 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
27 ; GFX8-NEXT:    s_sub_i32 s2, s2, s3
28 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
29 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
30 ; GFX8-NEXT:    v_mov_b32_e32 v2, s2
31 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
32 ; GFX8-NEXT:    s_endpgm
34 ; GFX9-LABEL: s_sub_i32:
35 ; GFX9:       ; %bb.0:
36 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
37 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
38 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
39 ; GFX9-NEXT:    s_sub_i32 s2, s2, s3
40 ; GFX9-NEXT:    v_mov_b32_e32 v1, s2
41 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
42 ; GFX9-NEXT:    s_endpgm
44 ; GFX12-LABEL: s_sub_i32:
45 ; GFX12:       ; %bb.0:
46 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
47 ; GFX12-NEXT:    s_wait_kmcnt 0x0
48 ; GFX12-NEXT:    s_sub_co_i32 s2, s2, s3
49 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
50 ; GFX12-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
51 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
52 ; GFX12-NEXT:    s_nop 0
53 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
54 ; GFX12-NEXT:    s_endpgm
55   %result = sub i32 %a, %b
56   store i32 %result, ptr addrspace(1) %out
57   ret void
60 define amdgpu_kernel void @s_sub_imm_i32(ptr addrspace(1) %out, i32 %a) {
61 ; GFX6-LABEL: s_sub_imm_i32:
62 ; GFX6:       ; %bb.0:
63 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0xb
64 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
65 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
66 ; GFX6-NEXT:    s_mov_b32 s2, -1
67 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
68 ; GFX6-NEXT:    s_sub_i32 s4, 0x4d2, s4
69 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
70 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
71 ; GFX6-NEXT:    s_endpgm
73 ; GFX8-LABEL: s_sub_imm_i32:
74 ; GFX8:       ; %bb.0:
75 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x2c
76 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
77 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
78 ; GFX8-NEXT:    s_sub_i32 s2, 0x4d2, s2
79 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
80 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
81 ; GFX8-NEXT:    v_mov_b32_e32 v2, s2
82 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
83 ; GFX8-NEXT:    s_endpgm
85 ; GFX9-LABEL: s_sub_imm_i32:
86 ; GFX9:       ; %bb.0:
87 ; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
88 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
89 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
90 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
91 ; GFX9-NEXT:    s_sub_i32 s0, 0x4d2, s4
92 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
93 ; GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
94 ; GFX9-NEXT:    s_endpgm
96 ; GFX12-LABEL: s_sub_imm_i32:
97 ; GFX12:       ; %bb.0:
98 ; GFX12-NEXT:    s_load_b96 s[0:2], s[0:1], 0x24
99 ; GFX12-NEXT:    s_wait_kmcnt 0x0
100 ; GFX12-NEXT:    s_sub_co_i32 s2, 0x4d2, s2
101 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
102 ; GFX12-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
103 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
104 ; GFX12-NEXT:    s_nop 0
105 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
106 ; GFX12-NEXT:    s_endpgm
107   %result = sub i32 1234, %a
108   store i32 %result, ptr addrspace(1) %out
109   ret void
112 define amdgpu_kernel void @test_sub_i32(ptr addrspace(1) %out, ptr addrspace(1) %in) {
113 ; GFX6-LABEL: test_sub_i32:
114 ; GFX6:       ; %bb.0:
115 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
116 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
117 ; GFX6-NEXT:    s_mov_b32 s6, -1
118 ; GFX6-NEXT:    s_mov_b32 s10, s6
119 ; GFX6-NEXT:    s_mov_b32 s11, s7
120 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
121 ; GFX6-NEXT:    s_mov_b32 s8, s2
122 ; GFX6-NEXT:    s_mov_b32 s9, s3
123 ; GFX6-NEXT:    buffer_load_dwordx2 v[0:1], off, s[8:11], 0
124 ; GFX6-NEXT:    s_mov_b32 s4, s0
125 ; GFX6-NEXT:    s_mov_b32 s5, s1
126 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
127 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
128 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
129 ; GFX6-NEXT:    s_endpgm
131 ; GFX8-LABEL: test_sub_i32:
132 ; GFX8:       ; %bb.0:
133 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
134 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
135 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
136 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
137 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
138 ; GFX8-NEXT:    v_mov_b32_e32 v2, s0
139 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
140 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
141 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v1
142 ; GFX8-NEXT:    flat_store_dword v[2:3], v0
143 ; GFX8-NEXT:    s_endpgm
145 ; GFX9-LABEL: test_sub_i32:
146 ; GFX9:       ; %bb.0:
147 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
148 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
149 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
150 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
151 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
152 ; GFX9-NEXT:    v_sub_u32_e32 v0, v0, v1
153 ; GFX9-NEXT:    global_store_dword v2, v0, s[0:1]
154 ; GFX9-NEXT:    s_endpgm
156 ; GFX12-LABEL: test_sub_i32:
157 ; GFX12:       ; %bb.0:
158 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
159 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
160 ; GFX12-NEXT:    s_wait_kmcnt 0x0
161 ; GFX12-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
162 ; GFX12-NEXT:    s_wait_loadcnt 0x0
163 ; GFX12-NEXT:    v_sub_nc_u32_e32 v0, v0, v1
164 ; GFX12-NEXT:    global_store_b32 v2, v0, s[0:1]
165 ; GFX12-NEXT:    s_nop 0
166 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
167 ; GFX12-NEXT:    s_endpgm
168   %b_ptr = getelementptr i32, ptr addrspace(1) %in, i32 1
169   %a = load i32, ptr addrspace(1) %in
170   %b = load i32, ptr addrspace(1) %b_ptr
171   %result = sub i32 %a, %b
172   store i32 %result, ptr addrspace(1) %out
173   ret void
176 define amdgpu_kernel void @test_sub_imm_i32(ptr addrspace(1) %out, ptr addrspace(1) %in) {
177 ; GFX6-LABEL: test_sub_imm_i32:
178 ; GFX6:       ; %bb.0:
179 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
180 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
181 ; GFX6-NEXT:    s_mov_b32 s6, -1
182 ; GFX6-NEXT:    s_mov_b32 s10, s6
183 ; GFX6-NEXT:    s_mov_b32 s11, s7
184 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
185 ; GFX6-NEXT:    s_mov_b32 s8, s2
186 ; GFX6-NEXT:    s_mov_b32 s9, s3
187 ; GFX6-NEXT:    buffer_load_dword v0, off, s[8:11], 0
188 ; GFX6-NEXT:    s_mov_b32 s4, s0
189 ; GFX6-NEXT:    s_mov_b32 s5, s1
190 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
191 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, 0x7b, v0
192 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
193 ; GFX6-NEXT:    s_endpgm
195 ; GFX8-LABEL: test_sub_imm_i32:
196 ; GFX8:       ; %bb.0:
197 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
198 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
199 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
200 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
201 ; GFX8-NEXT:    flat_load_dword v2, v[0:1]
202 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
203 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
204 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
205 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, 0x7b, v2
206 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
207 ; GFX8-NEXT:    s_endpgm
209 ; GFX9-LABEL: test_sub_imm_i32:
210 ; GFX9:       ; %bb.0:
211 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
212 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
213 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
214 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
215 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
216 ; GFX9-NEXT:    v_sub_u32_e32 v1, 0x7b, v1
217 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
218 ; GFX9-NEXT:    s_endpgm
220 ; GFX12-LABEL: test_sub_imm_i32:
221 ; GFX12:       ; %bb.0:
222 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
223 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
224 ; GFX12-NEXT:    s_wait_kmcnt 0x0
225 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
226 ; GFX12-NEXT:    s_wait_loadcnt 0x0
227 ; GFX12-NEXT:    v_sub_nc_u32_e32 v1, 0x7b, v1
228 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
229 ; GFX12-NEXT:    s_nop 0
230 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
231 ; GFX12-NEXT:    s_endpgm
232   %a = load i32, ptr addrspace(1) %in
233   %result = sub i32 123, %a
234   store i32 %result, ptr addrspace(1) %out
235   ret void
238 define amdgpu_kernel void @test_sub_v2i32(ptr addrspace(1) %out, ptr addrspace(1) %in) {
239 ; GFX6-LABEL: test_sub_v2i32:
240 ; GFX6:       ; %bb.0:
241 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
242 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
243 ; GFX6-NEXT:    s_mov_b32 s6, -1
244 ; GFX6-NEXT:    s_mov_b32 s10, s6
245 ; GFX6-NEXT:    s_mov_b32 s11, s7
246 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
247 ; GFX6-NEXT:    s_mov_b32 s8, s2
248 ; GFX6-NEXT:    s_mov_b32 s9, s3
249 ; GFX6-NEXT:    buffer_load_dwordx4 v[0:3], off, s[8:11], 0
250 ; GFX6-NEXT:    s_mov_b32 s4, s0
251 ; GFX6-NEXT:    s_mov_b32 s5, s1
252 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
253 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v3
254 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2
255 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
256 ; GFX6-NEXT:    s_endpgm
258 ; GFX8-LABEL: test_sub_v2i32:
259 ; GFX8:       ; %bb.0:
260 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
261 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
262 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
263 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
264 ; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
265 ; GFX8-NEXT:    v_mov_b32_e32 v4, s0
266 ; GFX8-NEXT:    v_mov_b32_e32 v5, s1
267 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
268 ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, v1, v3
269 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v2
270 ; GFX8-NEXT:    flat_store_dwordx2 v[4:5], v[0:1]
271 ; GFX8-NEXT:    s_endpgm
273 ; GFX9-LABEL: test_sub_v2i32:
274 ; GFX9:       ; %bb.0:
275 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
276 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
277 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
278 ; GFX9-NEXT:    global_load_dwordx4 v[0:3], v4, s[2:3]
279 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
280 ; GFX9-NEXT:    v_sub_u32_e32 v1, v1, v3
281 ; GFX9-NEXT:    v_sub_u32_e32 v0, v0, v2
282 ; GFX9-NEXT:    global_store_dwordx2 v4, v[0:1], s[0:1]
283 ; GFX9-NEXT:    s_endpgm
285 ; GFX12-LABEL: test_sub_v2i32:
286 ; GFX12:       ; %bb.0:
287 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
288 ; GFX12-NEXT:    v_mov_b32_e32 v4, 0
289 ; GFX12-NEXT:    s_wait_kmcnt 0x0
290 ; GFX12-NEXT:    global_load_b128 v[0:3], v4, s[2:3]
291 ; GFX12-NEXT:    s_wait_loadcnt 0x0
292 ; GFX12-NEXT:    v_sub_nc_u32_e32 v1, v1, v3
293 ; GFX12-NEXT:    v_sub_nc_u32_e32 v0, v0, v2
294 ; GFX12-NEXT:    global_store_b64 v4, v[0:1], s[0:1]
295 ; GFX12-NEXT:    s_nop 0
296 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
297 ; GFX12-NEXT:    s_endpgm
298   %b_ptr = getelementptr <2 x i32>, ptr addrspace(1) %in, i32 1
299   %a = load <2 x i32>, ptr addrspace(1) %in
300   %b = load <2 x i32>, ptr addrspace(1) %b_ptr
301   %result = sub <2 x i32> %a, %b
302   store <2 x i32> %result, ptr addrspace(1) %out
303   ret void
306 define amdgpu_kernel void @test_sub_v4i32(ptr addrspace(1) %out, ptr addrspace(1) %in) {
307 ; GFX6-LABEL: test_sub_v4i32:
308 ; GFX6:       ; %bb.0:
309 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
310 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
311 ; GFX6-NEXT:    s_mov_b32 s6, -1
312 ; GFX6-NEXT:    s_mov_b32 s10, s6
313 ; GFX6-NEXT:    s_mov_b32 s11, s7
314 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
315 ; GFX6-NEXT:    s_mov_b32 s8, s2
316 ; GFX6-NEXT:    s_mov_b32 s9, s3
317 ; GFX6-NEXT:    buffer_load_dwordx4 v[0:3], off, s[8:11], 0
318 ; GFX6-NEXT:    buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16
319 ; GFX6-NEXT:    s_mov_b32 s4, s0
320 ; GFX6-NEXT:    s_mov_b32 s5, s1
321 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
322 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v7
323 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v6
324 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v5
325 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v4
326 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[4:7], 0
327 ; GFX6-NEXT:    s_endpgm
329 ; GFX8-LABEL: test_sub_v4i32:
330 ; GFX8:       ; %bb.0:
331 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
332 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
333 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
334 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
335 ; GFX8-NEXT:    s_add_u32 s2, s2, 16
336 ; GFX8-NEXT:    s_addc_u32 s3, s3, 0
337 ; GFX8-NEXT:    v_mov_b32_e32 v5, s3
338 ; GFX8-NEXT:    v_mov_b32_e32 v4, s2
339 ; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
340 ; GFX8-NEXT:    flat_load_dwordx4 v[4:7], v[4:5]
341 ; GFX8-NEXT:    v_mov_b32_e32 v8, s0
342 ; GFX8-NEXT:    v_mov_b32_e32 v9, s1
343 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
344 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, v3, v7
345 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v2, v6
346 ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, v1, v5
347 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v4
348 ; GFX8-NEXT:    flat_store_dwordx4 v[8:9], v[0:3]
349 ; GFX8-NEXT:    s_endpgm
351 ; GFX9-LABEL: test_sub_v4i32:
352 ; GFX9:       ; %bb.0:
353 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
354 ; GFX9-NEXT:    v_mov_b32_e32 v8, 0
355 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
356 ; GFX9-NEXT:    global_load_dwordx4 v[0:3], v8, s[2:3] offset:16
357 ; GFX9-NEXT:    global_load_dwordx4 v[4:7], v8, s[2:3]
358 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
359 ; GFX9-NEXT:    v_sub_u32_e32 v3, v7, v3
360 ; GFX9-NEXT:    v_sub_u32_e32 v2, v6, v2
361 ; GFX9-NEXT:    v_sub_u32_e32 v1, v5, v1
362 ; GFX9-NEXT:    v_sub_u32_e32 v0, v4, v0
363 ; GFX9-NEXT:    global_store_dwordx4 v8, v[0:3], s[0:1]
364 ; GFX9-NEXT:    s_endpgm
366 ; GFX12-LABEL: test_sub_v4i32:
367 ; GFX12:       ; %bb.0:
368 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
369 ; GFX12-NEXT:    v_mov_b32_e32 v8, 0
370 ; GFX12-NEXT:    s_wait_kmcnt 0x0
371 ; GFX12-NEXT:    s_clause 0x1
372 ; GFX12-NEXT:    global_load_b128 v[0:3], v8, s[2:3] offset:16
373 ; GFX12-NEXT:    global_load_b128 v[4:7], v8, s[2:3]
374 ; GFX12-NEXT:    s_wait_loadcnt 0x0
375 ; GFX12-NEXT:    v_sub_nc_u32_e32 v3, v7, v3
376 ; GFX12-NEXT:    v_sub_nc_u32_e32 v2, v6, v2
377 ; GFX12-NEXT:    v_sub_nc_u32_e32 v1, v5, v1
378 ; GFX12-NEXT:    v_sub_nc_u32_e32 v0, v4, v0
379 ; GFX12-NEXT:    global_store_b128 v8, v[0:3], s[0:1]
380 ; GFX12-NEXT:    s_nop 0
381 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
382 ; GFX12-NEXT:    s_endpgm
383   %b_ptr = getelementptr <4 x i32>, ptr addrspace(1) %in, i32 1
384   %a = load <4 x i32>, ptr addrspace(1) %in
385   %b = load <4 x i32>, ptr addrspace(1) %b_ptr
386   %result = sub <4 x i32> %a, %b
387   store <4 x i32> %result, ptr addrspace(1) %out
388   ret void
391 define amdgpu_kernel void @test_sub_i16(ptr addrspace(1) %out, ptr addrspace(1) %in) {
392 ; GFX6-LABEL: test_sub_i16:
393 ; GFX6:       ; %bb.0:
394 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
395 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
396 ; GFX6-NEXT:    s_mov_b32 s10, 0
397 ; GFX6-NEXT:    s_mov_b32 s11, s7
398 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
399 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
400 ; GFX6-NEXT:    s_mov_b64 s[8:9], s[2:3]
401 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
402 ; GFX6-NEXT:    buffer_load_ushort v2, v[0:1], s[8:11], 0 addr64 glc
403 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
404 ; GFX6-NEXT:    buffer_load_ushort v0, v[0:1], s[8:11], 0 addr64 offset:2 glc
405 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
406 ; GFX6-NEXT:    s_mov_b32 s6, -1
407 ; GFX6-NEXT:    s_mov_b32 s4, s0
408 ; GFX6-NEXT:    s_mov_b32 s5, s1
409 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v2, v0
410 ; GFX6-NEXT:    buffer_store_short v0, off, s[4:7], 0
411 ; GFX6-NEXT:    s_endpgm
413 ; GFX8-LABEL: test_sub_i16:
414 ; GFX8:       ; %bb.0:
415 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
416 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
417 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
418 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
419 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
420 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
421 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, 2, v0
422 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
423 ; GFX8-NEXT:    flat_load_ushort v4, v[0:1] glc
424 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
425 ; GFX8-NEXT:    flat_load_ushort v2, v[2:3] glc
426 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
427 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
428 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
429 ; GFX8-NEXT:    v_sub_u16_e32 v2, v4, v2
430 ; GFX8-NEXT:    flat_store_short v[0:1], v2
431 ; GFX8-NEXT:    s_endpgm
433 ; GFX9-LABEL: test_sub_i16:
434 ; GFX9:       ; %bb.0:
435 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
436 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
437 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
438 ; GFX9-NEXT:    global_load_ushort v1, v0, s[2:3] glc
439 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
440 ; GFX9-NEXT:    global_load_ushort v2, v0, s[2:3] offset:2 glc
441 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
442 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
443 ; GFX9-NEXT:    v_sub_u16_e32 v1, v1, v2
444 ; GFX9-NEXT:    global_store_short v0, v1, s[0:1]
445 ; GFX9-NEXT:    s_endpgm
447 ; GFX12-LABEL: test_sub_i16:
448 ; GFX12:       ; %bb.0:
449 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
450 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
451 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
452 ; GFX12-NEXT:    s_wait_kmcnt 0x0
453 ; GFX12-NEXT:    global_load_u16 v1, v0, s[2:3] scope:SCOPE_SYS
454 ; GFX12-NEXT:    s_wait_loadcnt 0x0
455 ; GFX12-NEXT:    global_load_u16 v0, v0, s[2:3] offset:2 scope:SCOPE_SYS
456 ; GFX12-NEXT:    s_wait_loadcnt 0x0
457 ; GFX12-NEXT:    v_sub_nc_u16 v0, v1, v0
458 ; GFX12-NEXT:    global_store_b16 v2, v0, s[0:1]
459 ; GFX12-NEXT:    s_nop 0
460 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
461 ; GFX12-NEXT:    s_endpgm
462   %tid = call i32 @llvm.amdgcn.workitem.id.x()
463   %gep = getelementptr i16, ptr addrspace(1) %in, i32 %tid
464   %b_ptr = getelementptr i16, ptr addrspace(1) %gep, i32 1
465   %a = load volatile i16, ptr addrspace(1) %gep
466   %b = load volatile i16, ptr addrspace(1) %b_ptr
467   %result = sub i16 %a, %b
468   store i16 %result, ptr addrspace(1) %out
469   ret void
472 define amdgpu_kernel void @test_sub_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %in) {
473 ; GFX6-LABEL: test_sub_v2i16:
474 ; GFX6:       ; %bb.0:
475 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
476 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
477 ; GFX6-NEXT:    s_mov_b32 s10, 0
478 ; GFX6-NEXT:    s_mov_b32 s11, s7
479 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
480 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
481 ; GFX6-NEXT:    s_mov_b64 s[8:9], s[2:3]
482 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
483 ; GFX6-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[8:11], 0 addr64
484 ; GFX6-NEXT:    s_mov_b32 s6, -1
485 ; GFX6-NEXT:    s_mov_b32 s4, s0
486 ; GFX6-NEXT:    s_mov_b32 s5, s1
487 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
488 ; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
489 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
490 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
491 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v2, v3
492 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
493 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
494 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
495 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
496 ; GFX6-NEXT:    s_endpgm
498 ; GFX8-LABEL: test_sub_v2i16:
499 ; GFX8:       ; %bb.0:
500 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
501 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
502 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
503 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
504 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
505 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
506 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
507 ; GFX8-NEXT:    v_mov_b32_e32 v2, s0
508 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
509 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
510 ; GFX8-NEXT:    v_sub_u16_e32 v4, v0, v1
511 ; GFX8-NEXT:    v_sub_u16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
512 ; GFX8-NEXT:    v_or_b32_e32 v0, v4, v0
513 ; GFX8-NEXT:    flat_store_dword v[2:3], v0
514 ; GFX8-NEXT:    s_endpgm
516 ; GFX9-LABEL: test_sub_v2i16:
517 ; GFX9:       ; %bb.0:
518 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
519 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
520 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
521 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
522 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v0, s[2:3]
523 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
524 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v1
525 ; GFX9-NEXT:    global_store_dword v2, v0, s[0:1]
526 ; GFX9-NEXT:    s_endpgm
528 ; GFX12-LABEL: test_sub_v2i16:
529 ; GFX12:       ; %bb.0:
530 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
531 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
532 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
533 ; GFX12-NEXT:    s_wait_kmcnt 0x0
534 ; GFX12-NEXT:    global_load_b64 v[0:1], v0, s[2:3]
535 ; GFX12-NEXT:    s_wait_loadcnt 0x0
536 ; GFX12-NEXT:    v_pk_sub_i16 v0, v0, v1
537 ; GFX12-NEXT:    global_store_b32 v2, v0, s[0:1]
538 ; GFX12-NEXT:    s_nop 0
539 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
540 ; GFX12-NEXT:    s_endpgm
541   %tid = call i32 @llvm.amdgcn.workitem.id.x()
542   %gep = getelementptr <2 x i16>, ptr addrspace(1) %in, i32 %tid
543   %b_ptr = getelementptr <2 x i16>, ptr addrspace(1) %gep, i16 1
544   %a = load <2 x i16>, ptr addrspace(1) %gep
545   %b = load <2 x i16>, ptr addrspace(1) %b_ptr
546   %result = sub <2 x i16> %a, %b
547   store <2 x i16> %result, ptr addrspace(1) %out
548   ret void
551 define amdgpu_kernel void @test_sub_v4i16(ptr addrspace(1) %out, ptr addrspace(1) %in) {
552 ; GFX6-LABEL: test_sub_v4i16:
553 ; GFX6:       ; %bb.0:
554 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
555 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
556 ; GFX6-NEXT:    s_mov_b32 s10, 0
557 ; GFX6-NEXT:    s_mov_b32 s11, s7
558 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
559 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
560 ; GFX6-NEXT:    s_mov_b64 s[8:9], s[2:3]
561 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
562 ; GFX6-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[8:11], 0 addr64
563 ; GFX6-NEXT:    s_mov_b32 s6, -1
564 ; GFX6-NEXT:    s_mov_b32 s4, s0
565 ; GFX6-NEXT:    s_mov_b32 s5, s1
566 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
567 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
568 ; GFX6-NEXT:    v_lshrrev_b32_e32 v5, 16, v1
569 ; GFX6-NEXT:    v_lshrrev_b32_e32 v6, 16, v2
570 ; GFX6-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
571 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v3
572 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2
573 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v5, v7
574 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v4, v6
575 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff, v1
576 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
577 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
578 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
579 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
580 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v3
581 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
582 ; GFX6-NEXT:    s_endpgm
584 ; GFX8-LABEL: test_sub_v4i16:
585 ; GFX8:       ; %bb.0:
586 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
587 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
588 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
589 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
590 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
591 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
592 ; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
593 ; GFX8-NEXT:    v_mov_b32_e32 v4, s0
594 ; GFX8-NEXT:    v_mov_b32_e32 v5, s1
595 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
596 ; GFX8-NEXT:    v_sub_u16_e32 v6, v1, v3
597 ; GFX8-NEXT:    v_sub_u16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
598 ; GFX8-NEXT:    v_sub_u16_e32 v3, v0, v2
599 ; GFX8-NEXT:    v_sub_u16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
600 ; GFX8-NEXT:    v_or_b32_e32 v1, v6, v1
601 ; GFX8-NEXT:    v_or_b32_e32 v0, v3, v0
602 ; GFX8-NEXT:    flat_store_dwordx2 v[4:5], v[0:1]
603 ; GFX8-NEXT:    s_endpgm
605 ; GFX9-LABEL: test_sub_v4i16:
606 ; GFX9:       ; %bb.0:
607 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
608 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
609 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
610 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
611 ; GFX9-NEXT:    global_load_dwordx4 v[0:3], v0, s[2:3]
612 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
613 ; GFX9-NEXT:    v_pk_sub_i16 v1, v1, v3
614 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v2
615 ; GFX9-NEXT:    global_store_dwordx2 v4, v[0:1], s[0:1]
616 ; GFX9-NEXT:    s_endpgm
618 ; GFX12-LABEL: test_sub_v4i16:
619 ; GFX12:       ; %bb.0:
620 ; GFX12-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
621 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
622 ; GFX12-NEXT:    v_mov_b32_e32 v4, 0
623 ; GFX12-NEXT:    s_wait_kmcnt 0x0
624 ; GFX12-NEXT:    global_load_b128 v[0:3], v0, s[2:3]
625 ; GFX12-NEXT:    s_wait_loadcnt 0x0
626 ; GFX12-NEXT:    v_pk_sub_i16 v1, v1, v3
627 ; GFX12-NEXT:    v_pk_sub_i16 v0, v0, v2
628 ; GFX12-NEXT:    global_store_b64 v4, v[0:1], s[0:1]
629 ; GFX12-NEXT:    s_nop 0
630 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
631 ; GFX12-NEXT:    s_endpgm
632   %tid = call i32 @llvm.amdgcn.workitem.id.x()
633   %gep = getelementptr <4 x i16>, ptr addrspace(1) %in, i32 %tid
634   %b_ptr = getelementptr <4 x i16>, ptr addrspace(1) %gep, i16 1
635   %a = load <4 x i16>, ptr addrspace(1) %gep
636   %b = load <4 x i16>, ptr addrspace(1) %b_ptr
637   %result = sub <4 x i16> %a, %b
638   store <4 x i16> %result, ptr addrspace(1) %out
639   ret void
642 define amdgpu_kernel void @s_sub_i64(ptr addrspace(1) noalias %out, i64 %a, i64 %b) nounwind {
643 ; GFX6-LABEL: s_sub_i64:
644 ; GFX6:       ; %bb.0:
645 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0xb
646 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
647 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
648 ; GFX6-NEXT:    s_mov_b32 s2, -1
649 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
650 ; GFX6-NEXT:    s_sub_u32 s4, s4, s6
651 ; GFX6-NEXT:    s_subb_u32 s5, s5, s7
652 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
653 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
654 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
655 ; GFX6-NEXT:    s_endpgm
657 ; GFX8-LABEL: s_sub_i64:
658 ; GFX8:       ; %bb.0:
659 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
660 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
661 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
662 ; GFX8-NEXT:    s_sub_u32 s2, s4, s6
663 ; GFX8-NEXT:    s_subb_u32 s3, s5, s7
664 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
665 ; GFX8-NEXT:    v_mov_b32_e32 v2, s2
666 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
667 ; GFX8-NEXT:    v_mov_b32_e32 v3, s3
668 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]
669 ; GFX8-NEXT:    s_endpgm
671 ; GFX9-LABEL: s_sub_i64:
672 ; GFX9:       ; %bb.0:
673 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x2c
674 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
675 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0
676 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
677 ; GFX9-NEXT:    s_sub_u32 s0, s4, s6
678 ; GFX9-NEXT:    s_subb_u32 s1, s5, s7
679 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
680 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
681 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[2:3]
682 ; GFX9-NEXT:    s_endpgm
684 ; GFX12-LABEL: s_sub_i64:
685 ; GFX12:       ; %bb.0:
686 ; GFX12-NEXT:    s_clause 0x1
687 ; GFX12-NEXT:    s_load_b128 s[4:7], s[0:1], 0x2c
688 ; GFX12-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
689 ; GFX12-NEXT:    s_wait_kmcnt 0x0
690 ; GFX12-NEXT:    s_sub_nc_u64 s[2:3], s[4:5], s[6:7]
691 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
692 ; GFX12-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
693 ; GFX12-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
694 ; GFX12-NEXT:    s_nop 0
695 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
696 ; GFX12-NEXT:    s_endpgm
697   %result = sub i64 %a, %b
698   store i64 %result, ptr addrspace(1) %out, align 8
699   ret void
702 define amdgpu_kernel void @v_sub_i64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %inA, ptr addrspace(1) noalias %inB) nounwind {
703 ; GFX6-LABEL: v_sub_i64:
704 ; GFX6:       ; %bb.0:
705 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
706 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
707 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
708 ; GFX6-NEXT:    s_mov_b32 s14, 0
709 ; GFX6-NEXT:    s_mov_b32 s15, s11
710 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
711 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
712 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[14:15]
713 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
714 ; GFX6-NEXT:    s_mov_b64 s[12:13], s[6:7]
715 ; GFX6-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
716 ; GFX6-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[12:15], 0 addr64
717 ; GFX6-NEXT:    s_mov_b32 s10, -1
718 ; GFX6-NEXT:    s_mov_b32 s8, s4
719 ; GFX6-NEXT:    s_mov_b32 s9, s5
720 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
721 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2
722 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v3, vcc
723 ; GFX6-NEXT:    buffer_store_dwordx2 v[0:1], off, s[8:11], 0
724 ; GFX6-NEXT:    s_endpgm
726 ; GFX8-LABEL: v_sub_i64:
727 ; GFX8:       ; %bb.0:
728 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
729 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
730 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
731 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
732 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
733 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
734 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
735 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
736 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
737 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
738 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
739 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[2:3]
740 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
741 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v2
742 ; GFX8-NEXT:    v_subb_u32_e32 v1, vcc, v1, v3, vcc
743 ; GFX8-NEXT:    v_mov_b32_e32 v2, s4
744 ; GFX8-NEXT:    v_mov_b32_e32 v3, s5
745 ; GFX8-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
746 ; GFX8-NEXT:    s_endpgm
748 ; GFX9-LABEL: v_sub_i64:
749 ; GFX9:       ; %bb.0:
750 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
751 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
752 ; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
753 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
754 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v4, s[6:7]
755 ; GFX9-NEXT:    global_load_dwordx2 v[2:3], v4, s[2:3]
756 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
757 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
758 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, v0, v2
759 ; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v1, v3, vcc
760 ; GFX9-NEXT:    global_store_dwordx2 v4, v[0:1], s[4:5]
761 ; GFX9-NEXT:    s_endpgm
763 ; GFX12-LABEL: v_sub_i64:
764 ; GFX12:       ; %bb.0:
765 ; GFX12-NEXT:    s_clause 0x1
766 ; GFX12-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
767 ; GFX12-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
768 ; GFX12-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
769 ; GFX12-NEXT:    v_mov_b32_e32 v4, 0
770 ; GFX12-NEXT:    s_wait_kmcnt 0x0
771 ; GFX12-NEXT:    s_clause 0x1
772 ; GFX12-NEXT:    global_load_b64 v[0:1], v2, s[6:7]
773 ; GFX12-NEXT:    global_load_b64 v[2:3], v2, s[0:1]
774 ; GFX12-NEXT:    s_wait_loadcnt 0x0
775 ; GFX12-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v2
776 ; GFX12-NEXT:    v_sub_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo
777 ; GFX12-NEXT:    global_store_b64 v4, v[0:1], s[4:5]
778 ; GFX12-NEXT:    s_nop 0
779 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
780 ; GFX12-NEXT:    s_endpgm
781   %tid = call i32 @llvm.amdgcn.workitem.id.x() readnone
782   %a_ptr = getelementptr i64, ptr addrspace(1) %inA, i32 %tid
783   %b_ptr = getelementptr i64, ptr addrspace(1) %inB, i32 %tid
784   %a = load i64, ptr addrspace(1) %a_ptr
785   %b = load i64, ptr addrspace(1) %b_ptr
786   %result = sub i64 %a, %b
787   store i64 %result, ptr addrspace(1) %out, align 8
788   ret void
791 define amdgpu_kernel void @v_test_sub_v2i64(ptr addrspace(1) %out, ptr addrspace(1) noalias %inA, ptr addrspace(1) noalias %inB) {
792 ; GFX6-LABEL: v_test_sub_v2i64:
793 ; GFX6:       ; %bb.0:
794 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
795 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
796 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
797 ; GFX6-NEXT:    s_mov_b32 s14, 0
798 ; GFX6-NEXT:    s_mov_b32 s15, s11
799 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 4, v0
800 ; GFX6-NEXT:    v_mov_b32_e32 v5, 0
801 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[14:15]
802 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
803 ; GFX6-NEXT:    s_mov_b64 s[12:13], s[6:7]
804 ; GFX6-NEXT:    buffer_load_dwordx4 v[0:3], v[4:5], s[0:3], 0 addr64
805 ; GFX6-NEXT:    buffer_load_dwordx4 v[4:7], v[4:5], s[12:15], 0 addr64
806 ; GFX6-NEXT:    s_mov_b32 s10, -1
807 ; GFX6-NEXT:    s_mov_b32 s8, s4
808 ; GFX6-NEXT:    s_mov_b32 s9, s5
809 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
810 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v6, v2
811 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v7, v3, vcc
812 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v4, v0
813 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v5, v1, vcc
814 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[8:11], 0
815 ; GFX6-NEXT:    s_endpgm
817 ; GFX8-LABEL: v_test_sub_v2i64:
818 ; GFX8:       ; %bb.0:
819 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
820 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
821 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 4, v0
822 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
823 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
824 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
825 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
826 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
827 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, s0, v2
828 ; GFX8-NEXT:    v_addc_u32_e32 v5, vcc, 0, v3, vcc
829 ; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
830 ; GFX8-NEXT:    flat_load_dwordx4 v[4:7], v[4:5]
831 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
832 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v2, v6
833 ; GFX8-NEXT:    v_subb_u32_e32 v3, vcc, v3, v7, vcc
834 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v4
835 ; GFX8-NEXT:    v_subb_u32_e32 v1, vcc, v1, v5, vcc
836 ; GFX8-NEXT:    v_mov_b32_e32 v4, s4
837 ; GFX8-NEXT:    v_mov_b32_e32 v5, s5
838 ; GFX8-NEXT:    flat_store_dwordx4 v[4:5], v[0:3]
839 ; GFX8-NEXT:    s_endpgm
841 ; GFX9-LABEL: v_test_sub_v2i64:
842 ; GFX9:       ; %bb.0:
843 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
844 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
845 ; GFX9-NEXT:    v_lshlrev_b32_e32 v8, 4, v0
846 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
847 ; GFX9-NEXT:    global_load_dwordx4 v[0:3], v8, s[6:7]
848 ; GFX9-NEXT:    global_load_dwordx4 v[4:7], v8, s[2:3]
849 ; GFX9-NEXT:    v_mov_b32_e32 v8, 0
850 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
851 ; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, v2, v6
852 ; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v3, v7, vcc
853 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, v0, v4
854 ; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v1, v5, vcc
855 ; GFX9-NEXT:    global_store_dwordx4 v8, v[0:3], s[4:5]
856 ; GFX9-NEXT:    s_endpgm
858 ; GFX12-LABEL: v_test_sub_v2i64:
859 ; GFX12:       ; %bb.0:
860 ; GFX12-NEXT:    s_clause 0x1
861 ; GFX12-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
862 ; GFX12-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
863 ; GFX12-NEXT:    v_lshlrev_b32_e32 v4, 4, v0
864 ; GFX12-NEXT:    v_mov_b32_e32 v8, 0
865 ; GFX12-NEXT:    s_wait_kmcnt 0x0
866 ; GFX12-NEXT:    s_clause 0x1
867 ; GFX12-NEXT:    global_load_b128 v[0:3], v4, s[6:7]
868 ; GFX12-NEXT:    global_load_b128 v[4:7], v4, s[0:1]
869 ; GFX12-NEXT:    s_wait_loadcnt 0x0
870 ; GFX12-NEXT:    v_sub_co_u32 v2, vcc_lo, v2, v6
871 ; GFX12-NEXT:    v_sub_co_ci_u32_e32 v3, vcc_lo, v3, v7, vcc_lo
872 ; GFX12-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v4
873 ; GFX12-NEXT:    v_sub_co_ci_u32_e32 v1, vcc_lo, v1, v5, vcc_lo
874 ; GFX12-NEXT:    global_store_b128 v8, v[0:3], s[4:5]
875 ; GFX12-NEXT:    s_nop 0
876 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
877 ; GFX12-NEXT:    s_endpgm
878   %tid = call i32 @llvm.amdgcn.workitem.id.x() readnone
879   %a_ptr = getelementptr <2 x i64>, ptr addrspace(1) %inA, i32 %tid
880   %b_ptr = getelementptr <2 x i64>, ptr addrspace(1) %inB, i32 %tid
881   %a = load <2 x i64>, ptr addrspace(1) %a_ptr
882   %b = load <2 x i64>, ptr addrspace(1) %b_ptr
883   %result = sub <2 x i64> %a, %b
884   store <2 x i64> %result, ptr addrspace(1) %out
885   ret void
888 define amdgpu_kernel void @v_test_sub_v4i64(ptr addrspace(1) %out, ptr addrspace(1) noalias %inA, ptr addrspace(1) noalias %inB) {
889 ; GFX6-LABEL: v_test_sub_v4i64:
890 ; GFX6:       ; %bb.0:
891 ; GFX6-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
892 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
893 ; GFX6-NEXT:    s_mov_b32 s11, 0xf000
894 ; GFX6-NEXT:    s_mov_b32 s14, 0
895 ; GFX6-NEXT:    s_mov_b32 s15, s11
896 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
897 ; GFX6-NEXT:    s_mov_b64 s[12:13], s[6:7]
898 ; GFX6-NEXT:    v_lshlrev_b32_e32 v12, 5, v0
899 ; GFX6-NEXT:    v_mov_b32_e32 v13, 0
900 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[14:15]
901 ; GFX6-NEXT:    buffer_load_dwordx4 v[0:3], v[12:13], s[12:15], 0 addr64
902 ; GFX6-NEXT:    buffer_load_dwordx4 v[4:7], v[12:13], s[0:3], 0 addr64
903 ; GFX6-NEXT:    buffer_load_dwordx4 v[8:11], v[12:13], s[0:3], 0 addr64 offset:16
904 ; GFX6-NEXT:    buffer_load_dwordx4 v[12:15], v[12:13], s[12:15], 0 addr64 offset:16
905 ; GFX6-NEXT:    s_mov_b32 s10, -1
906 ; GFX6-NEXT:    s_mov_b32 s8, s4
907 ; GFX6-NEXT:    s_mov_b32 s9, s5
908 ; GFX6-NEXT:    s_waitcnt vmcnt(2)
909 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v6
910 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v3, v7, vcc
911 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v4
912 ; GFX6-NEXT:    v_subb_u32_e32 v1, vcc, v1, v5, vcc
913 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
914 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, v14, v10
915 ; GFX6-NEXT:    v_subb_u32_e32 v7, vcc, v15, v11, vcc
916 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, v12, v8
917 ; GFX6-NEXT:    v_subb_u32_e32 v5, vcc, v13, v9, vcc
918 ; GFX6-NEXT:    buffer_store_dwordx4 v[4:7], off, s[8:11], 0 offset:16
919 ; GFX6-NEXT:    buffer_store_dwordx4 v[0:3], off, s[8:11], 0
920 ; GFX6-NEXT:    s_endpgm
922 ; GFX8-LABEL: v_test_sub_v4i64:
923 ; GFX8:       ; %bb.0:
924 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
925 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
926 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 5, v0
927 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
928 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
929 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, s6, v0
930 ; GFX8-NEXT:    v_addc_u32_e32 v9, vcc, 0, v1, vcc
931 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
932 ; GFX8-NEXT:    v_add_u32_e32 v12, vcc, s0, v0
933 ; GFX8-NEXT:    v_addc_u32_e32 v13, vcc, 0, v1, vcc
934 ; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[8:9]
935 ; GFX8-NEXT:    flat_load_dwordx4 v[4:7], v[12:13]
936 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, 16, v8
937 ; GFX8-NEXT:    v_addc_u32_e32 v9, vcc, 0, v9, vcc
938 ; GFX8-NEXT:    v_add_u32_e32 v12, vcc, 16, v12
939 ; GFX8-NEXT:    v_addc_u32_e32 v13, vcc, 0, v13, vcc
940 ; GFX8-NEXT:    flat_load_dwordx4 v[8:11], v[8:9]
941 ; GFX8-NEXT:    flat_load_dwordx4 v[12:15], v[12:13]
942 ; GFX8-NEXT:    v_mov_b32_e32 v17, s5
943 ; GFX8-NEXT:    v_mov_b32_e32 v16, s4
944 ; GFX8-NEXT:    s_add_u32 s0, s4, 16
945 ; GFX8-NEXT:    s_addc_u32 s1, s5, 0
946 ; GFX8-NEXT:    s_waitcnt vmcnt(2)
947 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v2, v6
948 ; GFX8-NEXT:    v_subb_u32_e32 v3, vcc, v3, v7, vcc
949 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v4
950 ; GFX8-NEXT:    v_subb_u32_e32 v1, vcc, v1, v5, vcc
951 ; GFX8-NEXT:    flat_store_dwordx4 v[16:17], v[0:3]
952 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
953 ; GFX8-NEXT:    v_sub_u32_e32 v6, vcc, v10, v14
954 ; GFX8-NEXT:    v_subb_u32_e32 v7, vcc, v11, v15, vcc
955 ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, v8, v12
956 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
957 ; GFX8-NEXT:    v_subb_u32_e32 v5, vcc, v9, v13, vcc
958 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
959 ; GFX8-NEXT:    flat_store_dwordx4 v[0:1], v[4:7]
960 ; GFX8-NEXT:    s_endpgm
962 ; GFX9-LABEL: v_test_sub_v4i64:
963 ; GFX9:       ; %bb.0:
964 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
965 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
966 ; GFX9-NEXT:    v_lshlrev_b32_e32 v16, 5, v0
967 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
968 ; GFX9-NEXT:    global_load_dwordx4 v[0:3], v16, s[6:7]
969 ; GFX9-NEXT:    global_load_dwordx4 v[4:7], v16, s[2:3]
970 ; GFX9-NEXT:    global_load_dwordx4 v[8:11], v16, s[6:7] offset:16
971 ; GFX9-NEXT:    global_load_dwordx4 v[12:15], v16, s[2:3] offset:16
972 ; GFX9-NEXT:    v_mov_b32_e32 v16, 0
973 ; GFX9-NEXT:    s_waitcnt vmcnt(2)
974 ; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, v2, v6
975 ; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v3, v7, vcc
976 ; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, v0, v4
977 ; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v1, v5, vcc
978 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
979 ; GFX9-NEXT:    v_sub_co_u32_e32 v6, vcc, v10, v14
980 ; GFX9-NEXT:    v_subb_co_u32_e32 v7, vcc, v11, v15, vcc
981 ; GFX9-NEXT:    v_sub_co_u32_e32 v4, vcc, v8, v12
982 ; GFX9-NEXT:    v_subb_co_u32_e32 v5, vcc, v9, v13, vcc
983 ; GFX9-NEXT:    global_store_dwordx4 v16, v[4:7], s[4:5] offset:16
984 ; GFX9-NEXT:    global_store_dwordx4 v16, v[0:3], s[4:5]
985 ; GFX9-NEXT:    s_endpgm
987 ; GFX12-LABEL: v_test_sub_v4i64:
988 ; GFX12:       ; %bb.0:
989 ; GFX12-NEXT:    s_clause 0x1
990 ; GFX12-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
991 ; GFX12-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
992 ; GFX12-NEXT:    v_lshlrev_b32_e32 v12, 5, v0
993 ; GFX12-NEXT:    v_mov_b32_e32 v16, 0
994 ; GFX12-NEXT:    s_wait_kmcnt 0x0
995 ; GFX12-NEXT:    s_clause 0x3
996 ; GFX12-NEXT:    global_load_b128 v[0:3], v12, s[6:7]
997 ; GFX12-NEXT:    global_load_b128 v[4:7], v12, s[0:1]
998 ; GFX12-NEXT:    global_load_b128 v[8:11], v12, s[6:7] offset:16
999 ; GFX12-NEXT:    global_load_b128 v[12:15], v12, s[0:1] offset:16
1000 ; GFX12-NEXT:    s_wait_loadcnt 0x2
1001 ; GFX12-NEXT:    v_sub_co_u32 v2, vcc_lo, v2, v6
1002 ; GFX12-NEXT:    v_sub_co_ci_u32_e32 v3, vcc_lo, v3, v7, vcc_lo
1003 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1004 ; GFX12-NEXT:    v_sub_co_u32 v10, vcc_lo, v10, v14
1005 ; GFX12-NEXT:    v_sub_co_ci_u32_e32 v11, vcc_lo, v11, v15, vcc_lo
1006 ; GFX12-NEXT:    v_sub_co_u32 v8, vcc_lo, v8, v12
1007 ; GFX12-NEXT:    v_sub_co_ci_u32_e32 v9, vcc_lo, v9, v13, vcc_lo
1008 ; GFX12-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v4
1009 ; GFX12-NEXT:    v_sub_co_ci_u32_e32 v1, vcc_lo, v1, v5, vcc_lo
1010 ; GFX12-NEXT:    s_clause 0x1
1011 ; GFX12-NEXT:    global_store_b128 v16, v[8:11], s[4:5] offset:16
1012 ; GFX12-NEXT:    global_store_b128 v16, v[0:3], s[4:5]
1013 ; GFX12-NEXT:    s_nop 0
1014 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1015 ; GFX12-NEXT:    s_endpgm
1016   %tid = call i32 @llvm.amdgcn.workitem.id.x() readnone
1017   %a_ptr = getelementptr <4 x i64>, ptr addrspace(1) %inA, i32 %tid
1018   %b_ptr = getelementptr <4 x i64>, ptr addrspace(1) %inB, i32 %tid
1019   %a = load <4 x i64>, ptr addrspace(1) %a_ptr
1020   %b = load <4 x i64>, ptr addrspace(1) %b_ptr
1021   %result = sub <4 x i64> %a, %b
1022   store <4 x i64> %result, ptr addrspace(1) %out
1023   ret void
1026 ; Make sure the VOP3 form of sub is initially selected. Otherwise pair
1027 ; of opies from/to VCC would be necessary
1029 define amdgpu_ps void @sub_select_vop3(i32 inreg %s, i32 %v) {
1030 ; GFX6-LABEL: sub_select_vop3:
1031 ; GFX6:       ; %bb.0:
1032 ; GFX6-NEXT:    v_subrev_i32_e64 v0, s[0:1], s0, v0
1033 ; GFX6-NEXT:    s_mov_b32 m0, -1
1034 ; GFX6-NEXT:    ;;#ASMSTART
1035 ; GFX6-NEXT:    ; def vcc
1036 ; GFX6-NEXT:    ;;#ASMEND
1037 ; GFX6-NEXT:    ds_write_b32 v0, v0
1038 ; GFX6-NEXT:    ;;#ASMSTART
1039 ; GFX6-NEXT:    ; use vcc
1040 ; GFX6-NEXT:    ;;#ASMEND
1041 ; GFX6-NEXT:    s_endpgm
1043 ; GFX8-LABEL: sub_select_vop3:
1044 ; GFX8:       ; %bb.0:
1045 ; GFX8-NEXT:    v_subrev_u32_e64 v0, s[0:1], s0, v0
1046 ; GFX8-NEXT:    s_mov_b32 m0, -1
1047 ; GFX8-NEXT:    ;;#ASMSTART
1048 ; GFX8-NEXT:    ; def vcc
1049 ; GFX8-NEXT:    ;;#ASMEND
1050 ; GFX8-NEXT:    ds_write_b32 v0, v0
1051 ; GFX8-NEXT:    ;;#ASMSTART
1052 ; GFX8-NEXT:    ; use vcc
1053 ; GFX8-NEXT:    ;;#ASMEND
1054 ; GFX8-NEXT:    s_endpgm
1056 ; GFX9-LABEL: sub_select_vop3:
1057 ; GFX9:       ; %bb.0:
1058 ; GFX9-NEXT:    v_subrev_u32_e32 v0, s0, v0
1059 ; GFX9-NEXT:    ;;#ASMSTART
1060 ; GFX9-NEXT:    ; def vcc
1061 ; GFX9-NEXT:    ;;#ASMEND
1062 ; GFX9-NEXT:    ds_write_b32 v0, v0
1063 ; GFX9-NEXT:    ;;#ASMSTART
1064 ; GFX9-NEXT:    ; use vcc
1065 ; GFX9-NEXT:    ;;#ASMEND
1066 ; GFX9-NEXT:    s_endpgm
1068 ; GFX12-LABEL: sub_select_vop3:
1069 ; GFX12:       ; %bb.0:
1070 ; GFX12-NEXT:    v_subrev_nc_u32_e32 v0, s0, v0
1071 ; GFX12-NEXT:    ;;#ASMSTART
1072 ; GFX12-NEXT:    ; def vcc
1073 ; GFX12-NEXT:    ;;#ASMEND
1074 ; GFX12-NEXT:    ds_store_b32 v0, v0
1075 ; GFX12-NEXT:    ;;#ASMSTART
1076 ; GFX12-NEXT:    ; use vcc
1077 ; GFX12-NEXT:    ;;#ASMEND
1078 ; GFX12-NEXT:    s_endpgm
1079   %vcc = call i64 asm sideeffect "; def vcc", "={vcc}"()
1080   %sub = sub i32 %v, %s
1081   store i32 %sub, ptr addrspace(3) undef
1082   call void asm sideeffect "; use vcc", "{vcc}"(i64 %vcc)
1083   ret void