[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / shrink-add-sub-constant.ll
blob8da720d7f991cddaf81bf4a70e079aeea5e7202b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel=0 -march=amdgcn < %s | FileCheck --check-prefixes=SI,SI-SDAG %s
3 ; RUN: llc -global-isel=1 -march=amdgcn < %s | FileCheck --check-prefixes=SI,SI-GISEL %s
4 ; RUN: llc -global-isel=0 -march=amdgcn -mcpu=tonga < %s | FileCheck --check-prefixes=VI,VI-SDAG %s
5 ; RUN: llc -global-isel=1 -march=amdgcn -mcpu=tonga < %s | FileCheck --check-prefixes=VI,VI-GISEL %s
6 ; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx900 < %s | FileCheck --check-prefixes=GFX9,GFX9-SDAG %s
7 ; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx900 < %s | FileCheck --check-prefixes=GFX9,GFX9-GISEL %s
8 ; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx1010 < %s | FileCheck --check-prefixes=GFX10,GFX10-SDAG %s
9 ; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx1010 < %s | FileCheck --check-prefixes=GFX10,GFX10-GISEL %s
10 ; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx1100 < %s | FileCheck --check-prefixes=GFX11,GFX11-SDAG %s
11 ; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx1100 < %s | FileCheck --check-prefixes=GFX11,GFX11-GISEL %s
13 ; Test that add/sub with a constant is swapped to sub/add with negated
14 ; constant to minimize code size.
16 define amdgpu_kernel void @v_test_i32_x_sub_64(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
17 ; SI-SDAG-LABEL: v_test_i32_x_sub_64:
18 ; SI-SDAG:       ; %bb.0:
19 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
20 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
21 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
22 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
23 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
24 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
25 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
26 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
27 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
28 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
29 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
30 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
31 ; SI-SDAG-NEXT:    s_endpgm
33 ; SI-GISEL-LABEL: v_test_i32_x_sub_64:
34 ; SI-GISEL:       ; %bb.0:
35 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
36 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
37 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
38 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
39 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
40 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
41 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
42 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
43 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
44 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
45 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
46 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
47 ; SI-GISEL-NEXT:    s_endpgm
49 ; VI-SDAG-LABEL: v_test_i32_x_sub_64:
50 ; VI-SDAG:       ; %bb.0:
51 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
52 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
53 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
54 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
55 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
56 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
57 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
58 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
59 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
60 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
61 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
62 ; VI-SDAG-NEXT:    v_subrev_u32_e32 v2, vcc, 64, v3
63 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
64 ; VI-SDAG-NEXT:    s_endpgm
66 ; VI-GISEL-LABEL: v_test_i32_x_sub_64:
67 ; VI-GISEL:       ; %bb.0:
68 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
69 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
70 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
71 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
72 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
73 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
74 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
75 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
76 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
77 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
78 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
79 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
80 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
81 ; VI-GISEL-NEXT:    v_subrev_u32_e32 v2, vcc, 64, v3
82 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
83 ; VI-GISEL-NEXT:    s_endpgm
85 ; GFX9-LABEL: v_test_i32_x_sub_64:
86 ; GFX9:       ; %bb.0:
87 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
88 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
89 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
90 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
91 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
92 ; GFX9-NEXT:    v_subrev_u32_e32 v1, 64, v1
93 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
94 ; GFX9-NEXT:    s_endpgm
96 ; GFX10-LABEL: v_test_i32_x_sub_64:
97 ; GFX10:       ; %bb.0:
98 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
99 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
100 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
101 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
102 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
103 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v1, 64, v1
104 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
105 ; GFX10-NEXT:    s_endpgm
107 ; GFX11-LABEL: v_test_i32_x_sub_64:
108 ; GFX11:       ; %bb.0:
109 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
110 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
111 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
112 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
113 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
114 ; GFX11-NEXT:    v_subrev_nc_u32_e32 v1, 64, v1
115 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
116 ; GFX11-NEXT:    s_nop 0
117 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
118 ; GFX11-NEXT:    s_endpgm
119   %tid = call i32 @llvm.amdgcn.workitem.id.x()
120   %tid.ext = sext i32 %tid to i64
121   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
122   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
123   %x = load i32, ptr addrspace(1) %gep
124   %result = sub i32 %x, 64
125   store i32 %result, ptr addrspace(1) %gep.out
126   ret void
129 define amdgpu_kernel void @v_test_i32_x_sub_64_multi_use(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
130 ; SI-SDAG-LABEL: v_test_i32_x_sub_64_multi_use:
131 ; SI-SDAG:       ; %bb.0:
132 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
133 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
134 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
135 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
136 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
137 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
138 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
139 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc
140 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
141 ; SI-SDAG-NEXT:    buffer_load_dword v3, v[0:1], s[4:7], 0 addr64 glc
142 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
143 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
144 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
145 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v3
146 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
147 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
148 ; SI-SDAG-NEXT:    buffer_store_dword v3, v[0:1], s[0:3], 0 addr64
149 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
150 ; SI-SDAG-NEXT:    s_endpgm
152 ; SI-GISEL-LABEL: v_test_i32_x_sub_64_multi_use:
153 ; SI-GISEL:       ; %bb.0:
154 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
155 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
156 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
157 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
158 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
159 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
160 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
161 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc
162 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
163 ; SI-GISEL-NEXT:    buffer_load_dword v3, v[0:1], s[4:7], 0 addr64 glc
164 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
165 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
166 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
167 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v3
168 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
169 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
170 ; SI-GISEL-NEXT:    buffer_store_dword v3, v[0:1], s[0:3], 0 addr64
171 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
172 ; SI-GISEL-NEXT:    s_endpgm
174 ; VI-SDAG-LABEL: v_test_i32_x_sub_64_multi_use:
175 ; VI-SDAG:       ; %bb.0:
176 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
177 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
178 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
179 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
180 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
181 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
182 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1] glc
183 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
184 ; VI-SDAG-NEXT:    flat_load_dword v4, v[0:1] glc
185 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
186 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
187 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
188 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
189 ; VI-SDAG-NEXT:    v_subrev_u32_e32 v2, vcc, 64, v3
190 ; VI-SDAG-NEXT:    v_subrev_u32_e32 v3, vcc, 64, v4
191 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
192 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
193 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v3
194 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
195 ; VI-SDAG-NEXT:    s_endpgm
197 ; VI-GISEL-LABEL: v_test_i32_x_sub_64_multi_use:
198 ; VI-GISEL:       ; %bb.0:
199 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
200 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
201 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
202 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
203 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
204 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
205 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
206 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1] glc
207 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
208 ; VI-GISEL-NEXT:    flat_load_dword v4, v[0:1] glc
209 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
210 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
211 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
212 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
213 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
214 ; VI-GISEL-NEXT:    v_subrev_u32_e32 v2, vcc, 64, v3
215 ; VI-GISEL-NEXT:    v_subrev_u32_e32 v3, vcc, 64, v4
216 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
217 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
218 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v3
219 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
220 ; VI-GISEL-NEXT:    s_endpgm
222 ; GFX9-LABEL: v_test_i32_x_sub_64_multi_use:
223 ; GFX9:       ; %bb.0:
224 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
225 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
226 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
227 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3] glc
228 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
229 ; GFX9-NEXT:    global_load_dword v2, v0, s[2:3] glc
230 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
231 ; GFX9-NEXT:    v_subrev_u32_e32 v1, 64, v1
232 ; GFX9-NEXT:    v_subrev_u32_e32 v2, 64, v2
233 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
234 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
235 ; GFX9-NEXT:    global_store_dword v0, v2, s[0:1]
236 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
237 ; GFX9-NEXT:    s_endpgm
239 ; GFX10-LABEL: v_test_i32_x_sub_64_multi_use:
240 ; GFX10:       ; %bb.0:
241 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
242 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
243 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
244 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3] glc dlc
245 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
246 ; GFX10-NEXT:    global_load_dword v2, v0, s[2:3] glc dlc
247 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
248 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v1, 64, v1
249 ; GFX10-NEXT:    v_subrev_nc_u32_e32 v2, 64, v2
250 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
251 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
252 ; GFX10-NEXT:    global_store_dword v0, v2, s[0:1]
253 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
254 ; GFX10-NEXT:    s_endpgm
256 ; GFX11-LABEL: v_test_i32_x_sub_64_multi_use:
257 ; GFX11:       ; %bb.0:
258 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
259 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
260 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
261 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3] glc dlc
262 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
263 ; GFX11-NEXT:    global_load_b32 v2, v0, s[2:3] glc dlc
264 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
265 ; GFX11-NEXT:    v_subrev_nc_u32_e32 v1, 64, v1
266 ; GFX11-NEXT:    v_subrev_nc_u32_e32 v2, 64, v2
267 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1] dlc
268 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
269 ; GFX11-NEXT:    global_store_b32 v0, v2, s[0:1] dlc
270 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
271 ; GFX11-NEXT:    s_nop 0
272 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
273 ; GFX11-NEXT:    s_endpgm
274   %tid = call i32 @llvm.amdgcn.workitem.id.x()
275   %tid.ext = sext i32 %tid to i64
276   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
277   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
278   %x = load volatile i32, ptr addrspace(1) %gep
279   %y = load volatile i32, ptr addrspace(1) %gep
280   %result0 = sub i32 %x, 64
281   %result1 = sub i32 %y, 64
282   store volatile i32 %result0, ptr addrspace(1) %gep.out
283   store volatile i32 %result1, ptr addrspace(1) %gep.out
284   ret void
287 define amdgpu_kernel void @v_test_i32_64_sub_x(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
288 ; SI-SDAG-LABEL: v_test_i32_64_sub_x:
289 ; SI-SDAG:       ; %bb.0:
290 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
291 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
292 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
293 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
294 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
295 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
296 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
297 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
298 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
299 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
300 ; SI-SDAG-NEXT:    v_sub_i32_e32 v2, vcc, 64, v2
301 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
302 ; SI-SDAG-NEXT:    s_endpgm
304 ; SI-GISEL-LABEL: v_test_i32_64_sub_x:
305 ; SI-GISEL:       ; %bb.0:
306 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
307 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
308 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
309 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
310 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
311 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
312 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
313 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
314 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
315 ; SI-GISEL-NEXT:    v_sub_i32_e32 v2, vcc, 64, v2
316 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
317 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
318 ; SI-GISEL-NEXT:    s_endpgm
320 ; VI-SDAG-LABEL: v_test_i32_64_sub_x:
321 ; VI-SDAG:       ; %bb.0:
322 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
323 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
324 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
325 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
326 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
327 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
328 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
329 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
330 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
331 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
332 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
333 ; VI-SDAG-NEXT:    v_sub_u32_e32 v2, vcc, 64, v3
334 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
335 ; VI-SDAG-NEXT:    s_endpgm
337 ; VI-GISEL-LABEL: v_test_i32_64_sub_x:
338 ; VI-GISEL:       ; %bb.0:
339 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
340 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
341 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
342 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
343 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
344 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
345 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
346 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
347 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
348 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
349 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
350 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
351 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
352 ; VI-GISEL-NEXT:    v_sub_u32_e32 v2, vcc, 64, v3
353 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
354 ; VI-GISEL-NEXT:    s_endpgm
356 ; GFX9-LABEL: v_test_i32_64_sub_x:
357 ; GFX9:       ; %bb.0:
358 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
359 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
360 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
361 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
362 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
363 ; GFX9-NEXT:    v_sub_u32_e32 v1, 64, v1
364 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
365 ; GFX9-NEXT:    s_endpgm
367 ; GFX10-LABEL: v_test_i32_64_sub_x:
368 ; GFX10:       ; %bb.0:
369 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
370 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
371 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
372 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
373 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
374 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, 64, v1
375 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
376 ; GFX10-NEXT:    s_endpgm
378 ; GFX11-LABEL: v_test_i32_64_sub_x:
379 ; GFX11:       ; %bb.0:
380 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
381 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
382 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
383 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
384 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
385 ; GFX11-NEXT:    v_sub_nc_u32_e32 v1, 64, v1
386 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
387 ; GFX11-NEXT:    s_nop 0
388 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
389 ; GFX11-NEXT:    s_endpgm
390   %tid = call i32 @llvm.amdgcn.workitem.id.x()
391   %tid.ext = sext i32 %tid to i64
392   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
393   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
394   %x = load i32, ptr addrspace(1) %gep
395   %result = sub i32 64, %x
396   store i32 %result, ptr addrspace(1) %gep.out
397   ret void
400 define amdgpu_kernel void @v_test_i32_x_sub_65(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
401 ; SI-SDAG-LABEL: v_test_i32_x_sub_65:
402 ; SI-SDAG:       ; %bb.0:
403 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
404 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
405 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
406 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
407 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
408 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
409 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
410 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
411 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
412 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
413 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xffffffbf, v2
414 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
415 ; SI-SDAG-NEXT:    s_endpgm
417 ; SI-GISEL-LABEL: v_test_i32_x_sub_65:
418 ; SI-GISEL:       ; %bb.0:
419 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
420 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
421 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
422 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
423 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
424 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
425 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
426 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
427 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
428 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 0x41, v2
429 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
430 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
431 ; SI-GISEL-NEXT:    s_endpgm
433 ; VI-SDAG-LABEL: v_test_i32_x_sub_65:
434 ; VI-SDAG:       ; %bb.0:
435 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
436 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
437 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
438 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
439 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
440 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
441 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
442 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
443 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
444 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
445 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
446 ; VI-SDAG-NEXT:    v_add_u32_e32 v2, vcc, 0xffffffbf, v3
447 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
448 ; VI-SDAG-NEXT:    s_endpgm
450 ; VI-GISEL-LABEL: v_test_i32_x_sub_65:
451 ; VI-GISEL:       ; %bb.0:
452 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
453 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
454 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
455 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
456 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
457 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
458 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
459 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
460 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
461 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
462 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
463 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
464 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
465 ; VI-GISEL-NEXT:    v_subrev_u32_e32 v2, vcc, 0x41, v3
466 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
467 ; VI-GISEL-NEXT:    s_endpgm
469 ; GFX9-SDAG-LABEL: v_test_i32_x_sub_65:
470 ; GFX9-SDAG:       ; %bb.0:
471 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
472 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
473 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
474 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
475 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
476 ; GFX9-SDAG-NEXT:    v_add_u32_e32 v1, 0xffffffbf, v1
477 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
478 ; GFX9-SDAG-NEXT:    s_endpgm
480 ; GFX9-GISEL-LABEL: v_test_i32_x_sub_65:
481 ; GFX9-GISEL:       ; %bb.0:
482 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
483 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
484 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
485 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
486 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
487 ; GFX9-GISEL-NEXT:    v_subrev_u32_e32 v1, 0x41, v1
488 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
489 ; GFX9-GISEL-NEXT:    s_endpgm
491 ; GFX10-SDAG-LABEL: v_test_i32_x_sub_65:
492 ; GFX10-SDAG:       ; %bb.0:
493 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
494 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
495 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
496 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
497 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
498 ; GFX10-SDAG-NEXT:    v_add_nc_u32_e32 v1, 0xffffffbf, v1
499 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
500 ; GFX10-SDAG-NEXT:    s_endpgm
502 ; GFX10-GISEL-LABEL: v_test_i32_x_sub_65:
503 ; GFX10-GISEL:       ; %bb.0:
504 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
505 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
506 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
507 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
508 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
509 ; GFX10-GISEL-NEXT:    v_subrev_nc_u32_e32 v1, 0x41, v1
510 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
511 ; GFX10-GISEL-NEXT:    s_endpgm
513 ; GFX11-SDAG-LABEL: v_test_i32_x_sub_65:
514 ; GFX11-SDAG:       ; %bb.0:
515 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
516 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
517 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
518 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
519 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
520 ; GFX11-SDAG-NEXT:    v_add_nc_u32_e32 v1, 0xffffffbf, v1
521 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
522 ; GFX11-SDAG-NEXT:    s_nop 0
523 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
524 ; GFX11-SDAG-NEXT:    s_endpgm
526 ; GFX11-GISEL-LABEL: v_test_i32_x_sub_65:
527 ; GFX11-GISEL:       ; %bb.0:
528 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
529 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
530 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
531 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
532 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
533 ; GFX11-GISEL-NEXT:    v_subrev_nc_u32_e32 v1, 0x41, v1
534 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
535 ; GFX11-GISEL-NEXT:    s_nop 0
536 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
537 ; GFX11-GISEL-NEXT:    s_endpgm
538   %tid = call i32 @llvm.amdgcn.workitem.id.x()
539   %tid.ext = sext i32 %tid to i64
540   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
541   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
542   %x = load i32, ptr addrspace(1) %gep
543   %result = sub i32 %x, 65
544   store i32 %result, ptr addrspace(1) %gep.out
545   ret void
548 define amdgpu_kernel void @v_test_i32_65_sub_x(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
549 ; SI-SDAG-LABEL: v_test_i32_65_sub_x:
550 ; SI-SDAG:       ; %bb.0:
551 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
552 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
553 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
554 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
555 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
556 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
557 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
558 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
559 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
560 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
561 ; SI-SDAG-NEXT:    v_sub_i32_e32 v2, vcc, 0x41, v2
562 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
563 ; SI-SDAG-NEXT:    s_endpgm
565 ; SI-GISEL-LABEL: v_test_i32_65_sub_x:
566 ; SI-GISEL:       ; %bb.0:
567 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
568 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
569 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
570 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
571 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
572 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
573 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
574 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
575 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
576 ; SI-GISEL-NEXT:    v_sub_i32_e32 v2, vcc, 0x41, v2
577 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
578 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
579 ; SI-GISEL-NEXT:    s_endpgm
581 ; VI-SDAG-LABEL: v_test_i32_65_sub_x:
582 ; VI-SDAG:       ; %bb.0:
583 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
584 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
585 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
586 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
587 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
588 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
589 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
590 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
591 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
592 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
593 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
594 ; VI-SDAG-NEXT:    v_sub_u32_e32 v2, vcc, 0x41, v3
595 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
596 ; VI-SDAG-NEXT:    s_endpgm
598 ; VI-GISEL-LABEL: v_test_i32_65_sub_x:
599 ; VI-GISEL:       ; %bb.0:
600 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
601 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
602 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
603 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
604 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
605 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
606 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
607 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
608 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
609 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
610 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
611 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
612 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
613 ; VI-GISEL-NEXT:    v_sub_u32_e32 v2, vcc, 0x41, v3
614 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
615 ; VI-GISEL-NEXT:    s_endpgm
617 ; GFX9-LABEL: v_test_i32_65_sub_x:
618 ; GFX9:       ; %bb.0:
619 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
620 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
621 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
622 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
623 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
624 ; GFX9-NEXT:    v_sub_u32_e32 v1, 0x41, v1
625 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
626 ; GFX9-NEXT:    s_endpgm
628 ; GFX10-LABEL: v_test_i32_65_sub_x:
629 ; GFX10:       ; %bb.0:
630 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
631 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
632 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
633 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
634 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
635 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, 0x41, v1
636 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
637 ; GFX10-NEXT:    s_endpgm
639 ; GFX11-LABEL: v_test_i32_65_sub_x:
640 ; GFX11:       ; %bb.0:
641 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
642 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
643 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
644 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
645 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
646 ; GFX11-NEXT:    v_sub_nc_u32_e32 v1, 0x41, v1
647 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
648 ; GFX11-NEXT:    s_nop 0
649 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
650 ; GFX11-NEXT:    s_endpgm
651   %tid = call i32 @llvm.amdgcn.workitem.id.x()
652   %tid.ext = sext i32 %tid to i64
653   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
654   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
655   %x = load i32, ptr addrspace(1) %gep
656   %result = sub i32 65, %x
657   store i32 %result, ptr addrspace(1) %gep.out
658   ret void
661 define amdgpu_kernel void @v_test_i32_x_sub_neg16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
662 ; SI-SDAG-LABEL: v_test_i32_x_sub_neg16:
663 ; SI-SDAG:       ; %bb.0:
664 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
665 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
666 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
667 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
668 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
669 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
670 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
671 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
672 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
673 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
674 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 16, v2
675 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
676 ; SI-SDAG-NEXT:    s_endpgm
678 ; SI-GISEL-LABEL: v_test_i32_x_sub_neg16:
679 ; SI-GISEL:       ; %bb.0:
680 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
681 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
682 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
683 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
684 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
685 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
686 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
687 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
688 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
689 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, -16, v2
690 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
691 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
692 ; SI-GISEL-NEXT:    s_endpgm
694 ; VI-SDAG-LABEL: v_test_i32_x_sub_neg16:
695 ; VI-SDAG:       ; %bb.0:
696 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
697 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
698 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
699 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
700 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
701 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
702 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
703 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
704 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
705 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
706 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
707 ; VI-SDAG-NEXT:    v_add_u32_e32 v2, vcc, 16, v3
708 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
709 ; VI-SDAG-NEXT:    s_endpgm
711 ; VI-GISEL-LABEL: v_test_i32_x_sub_neg16:
712 ; VI-GISEL:       ; %bb.0:
713 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
714 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
715 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
716 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
717 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
718 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
719 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
720 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
721 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
722 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
723 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
724 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
725 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
726 ; VI-GISEL-NEXT:    v_subrev_u32_e32 v2, vcc, -16, v3
727 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
728 ; VI-GISEL-NEXT:    s_endpgm
730 ; GFX9-SDAG-LABEL: v_test_i32_x_sub_neg16:
731 ; GFX9-SDAG:       ; %bb.0:
732 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
733 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
734 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
735 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
736 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
737 ; GFX9-SDAG-NEXT:    v_add_u32_e32 v1, 16, v1
738 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
739 ; GFX9-SDAG-NEXT:    s_endpgm
741 ; GFX9-GISEL-LABEL: v_test_i32_x_sub_neg16:
742 ; GFX9-GISEL:       ; %bb.0:
743 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
744 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
745 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
746 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
747 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
748 ; GFX9-GISEL-NEXT:    v_subrev_u32_e32 v1, -16, v1
749 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
750 ; GFX9-GISEL-NEXT:    s_endpgm
752 ; GFX10-SDAG-LABEL: v_test_i32_x_sub_neg16:
753 ; GFX10-SDAG:       ; %bb.0:
754 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
755 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
756 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
757 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
758 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
759 ; GFX10-SDAG-NEXT:    v_add_nc_u32_e32 v1, 16, v1
760 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
761 ; GFX10-SDAG-NEXT:    s_endpgm
763 ; GFX10-GISEL-LABEL: v_test_i32_x_sub_neg16:
764 ; GFX10-GISEL:       ; %bb.0:
765 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
766 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
767 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
768 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
769 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
770 ; GFX10-GISEL-NEXT:    v_subrev_nc_u32_e32 v1, -16, v1
771 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
772 ; GFX10-GISEL-NEXT:    s_endpgm
774 ; GFX11-SDAG-LABEL: v_test_i32_x_sub_neg16:
775 ; GFX11-SDAG:       ; %bb.0:
776 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
777 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
778 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
779 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
780 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
781 ; GFX11-SDAG-NEXT:    v_add_nc_u32_e32 v1, 16, v1
782 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
783 ; GFX11-SDAG-NEXT:    s_nop 0
784 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
785 ; GFX11-SDAG-NEXT:    s_endpgm
787 ; GFX11-GISEL-LABEL: v_test_i32_x_sub_neg16:
788 ; GFX11-GISEL:       ; %bb.0:
789 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
790 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
791 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
792 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
793 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
794 ; GFX11-GISEL-NEXT:    v_subrev_nc_u32_e32 v1, -16, v1
795 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
796 ; GFX11-GISEL-NEXT:    s_nop 0
797 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
798 ; GFX11-GISEL-NEXT:    s_endpgm
799   %tid = call i32 @llvm.amdgcn.workitem.id.x()
800   %tid.ext = sext i32 %tid to i64
801   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
802   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
803   %x = load i32, ptr addrspace(1) %gep
804   %result = sub i32 %x, -16
805   store i32 %result, ptr addrspace(1) %gep.out
806   ret void
809 define amdgpu_kernel void @v_test_i32_neg16_sub_x(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
810 ; SI-SDAG-LABEL: v_test_i32_neg16_sub_x:
811 ; SI-SDAG:       ; %bb.0:
812 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
813 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
814 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
815 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
816 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
817 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
818 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
819 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
820 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
821 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
822 ; SI-SDAG-NEXT:    v_sub_i32_e32 v2, vcc, -16, v2
823 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
824 ; SI-SDAG-NEXT:    s_endpgm
826 ; SI-GISEL-LABEL: v_test_i32_neg16_sub_x:
827 ; SI-GISEL:       ; %bb.0:
828 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
829 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
830 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
831 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
832 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
833 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
834 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
835 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
836 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
837 ; SI-GISEL-NEXT:    v_sub_i32_e32 v2, vcc, -16, v2
838 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
839 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
840 ; SI-GISEL-NEXT:    s_endpgm
842 ; VI-SDAG-LABEL: v_test_i32_neg16_sub_x:
843 ; VI-SDAG:       ; %bb.0:
844 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
845 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
846 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
847 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
848 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
849 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
850 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
851 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
852 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
853 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
854 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
855 ; VI-SDAG-NEXT:    v_sub_u32_e32 v2, vcc, -16, v3
856 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
857 ; VI-SDAG-NEXT:    s_endpgm
859 ; VI-GISEL-LABEL: v_test_i32_neg16_sub_x:
860 ; VI-GISEL:       ; %bb.0:
861 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
862 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
863 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
864 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
865 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
866 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
867 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
868 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
869 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
870 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
871 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
872 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
873 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
874 ; VI-GISEL-NEXT:    v_sub_u32_e32 v2, vcc, -16, v3
875 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
876 ; VI-GISEL-NEXT:    s_endpgm
878 ; GFX9-LABEL: v_test_i32_neg16_sub_x:
879 ; GFX9:       ; %bb.0:
880 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
881 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
882 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
883 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
884 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
885 ; GFX9-NEXT:    v_sub_u32_e32 v1, -16, v1
886 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
887 ; GFX9-NEXT:    s_endpgm
889 ; GFX10-LABEL: v_test_i32_neg16_sub_x:
890 ; GFX10:       ; %bb.0:
891 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
892 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
893 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
894 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
895 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
896 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, -16, v1
897 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
898 ; GFX10-NEXT:    s_endpgm
900 ; GFX11-LABEL: v_test_i32_neg16_sub_x:
901 ; GFX11:       ; %bb.0:
902 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
903 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
904 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
905 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
906 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
907 ; GFX11-NEXT:    v_sub_nc_u32_e32 v1, -16, v1
908 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
909 ; GFX11-NEXT:    s_nop 0
910 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
911 ; GFX11-NEXT:    s_endpgm
912   %tid = call i32 @llvm.amdgcn.workitem.id.x()
913   %tid.ext = sext i32 %tid to i64
914   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
915   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
916   %x = load i32, ptr addrspace(1) %gep
917   %result = sub i32 -16, %x
918   store i32 %result, ptr addrspace(1) %gep.out
919   ret void
922 define amdgpu_kernel void @v_test_i32_x_sub_neg17(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
923 ; SI-SDAG-LABEL: v_test_i32_x_sub_neg17:
924 ; SI-SDAG:       ; %bb.0:
925 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
926 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
927 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
928 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
929 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
930 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
931 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
932 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
933 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
934 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
935 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 17, v2
936 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
937 ; SI-SDAG-NEXT:    s_endpgm
939 ; SI-GISEL-LABEL: v_test_i32_x_sub_neg17:
940 ; SI-GISEL:       ; %bb.0:
941 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
942 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
943 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
944 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
945 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
946 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
947 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
948 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
949 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
950 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 0xffffffef, v2
951 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
952 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
953 ; SI-GISEL-NEXT:    s_endpgm
955 ; VI-SDAG-LABEL: v_test_i32_x_sub_neg17:
956 ; VI-SDAG:       ; %bb.0:
957 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
958 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
959 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
960 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
961 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
962 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
963 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
964 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
965 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
966 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
967 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
968 ; VI-SDAG-NEXT:    v_add_u32_e32 v2, vcc, 17, v3
969 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
970 ; VI-SDAG-NEXT:    s_endpgm
972 ; VI-GISEL-LABEL: v_test_i32_x_sub_neg17:
973 ; VI-GISEL:       ; %bb.0:
974 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
975 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
976 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
977 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
978 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
979 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
980 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
981 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
982 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
983 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
984 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
985 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
986 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
987 ; VI-GISEL-NEXT:    v_subrev_u32_e32 v2, vcc, 0xffffffef, v3
988 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
989 ; VI-GISEL-NEXT:    s_endpgm
991 ; GFX9-SDAG-LABEL: v_test_i32_x_sub_neg17:
992 ; GFX9-SDAG:       ; %bb.0:
993 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
994 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
995 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
996 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
997 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
998 ; GFX9-SDAG-NEXT:    v_add_u32_e32 v1, 17, v1
999 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
1000 ; GFX9-SDAG-NEXT:    s_endpgm
1002 ; GFX9-GISEL-LABEL: v_test_i32_x_sub_neg17:
1003 ; GFX9-GISEL:       ; %bb.0:
1004 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1005 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1006 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1007 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
1008 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
1009 ; GFX9-GISEL-NEXT:    v_subrev_u32_e32 v1, 0xffffffef, v1
1010 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
1011 ; GFX9-GISEL-NEXT:    s_endpgm
1013 ; GFX10-SDAG-LABEL: v_test_i32_x_sub_neg17:
1014 ; GFX10-SDAG:       ; %bb.0:
1015 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1016 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1017 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1018 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
1019 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
1020 ; GFX10-SDAG-NEXT:    v_add_nc_u32_e32 v1, 17, v1
1021 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
1022 ; GFX10-SDAG-NEXT:    s_endpgm
1024 ; GFX10-GISEL-LABEL: v_test_i32_x_sub_neg17:
1025 ; GFX10-GISEL:       ; %bb.0:
1026 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1027 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1028 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1029 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
1030 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
1031 ; GFX10-GISEL-NEXT:    v_subrev_nc_u32_e32 v1, 0xffffffef, v1
1032 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
1033 ; GFX10-GISEL-NEXT:    s_endpgm
1035 ; GFX11-SDAG-LABEL: v_test_i32_x_sub_neg17:
1036 ; GFX11-SDAG:       ; %bb.0:
1037 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1038 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1039 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1040 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
1041 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
1042 ; GFX11-SDAG-NEXT:    v_add_nc_u32_e32 v1, 17, v1
1043 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
1044 ; GFX11-SDAG-NEXT:    s_nop 0
1045 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1046 ; GFX11-SDAG-NEXT:    s_endpgm
1048 ; GFX11-GISEL-LABEL: v_test_i32_x_sub_neg17:
1049 ; GFX11-GISEL:       ; %bb.0:
1050 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1051 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1052 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1053 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
1054 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
1055 ; GFX11-GISEL-NEXT:    v_subrev_nc_u32_e32 v1, 0xffffffef, v1
1056 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
1057 ; GFX11-GISEL-NEXT:    s_nop 0
1058 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1059 ; GFX11-GISEL-NEXT:    s_endpgm
1060   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1061   %tid.ext = sext i32 %tid to i64
1062   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
1063   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
1064   %x = load i32, ptr addrspace(1) %gep
1065   %result = sub i32 %x, -17
1066   store i32 %result, ptr addrspace(1) %gep.out
1067   ret void
1070 define amdgpu_kernel void @v_test_i32_neg17_sub_x(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
1071 ; SI-SDAG-LABEL: v_test_i32_neg17_sub_x:
1072 ; SI-SDAG:       ; %bb.0:
1073 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1074 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
1075 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
1076 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1077 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
1078 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1079 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
1080 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1081 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
1082 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1083 ; SI-SDAG-NEXT:    v_sub_i32_e32 v2, vcc, 0xffffffef, v2
1084 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1085 ; SI-SDAG-NEXT:    s_endpgm
1087 ; SI-GISEL-LABEL: v_test_i32_neg17_sub_x:
1088 ; SI-GISEL:       ; %bb.0:
1089 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1090 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1091 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
1092 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
1093 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
1094 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1095 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
1096 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1097 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1098 ; SI-GISEL-NEXT:    v_sub_i32_e32 v2, vcc, 0xffffffef, v2
1099 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
1100 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1101 ; SI-GISEL-NEXT:    s_endpgm
1103 ; VI-SDAG-LABEL: v_test_i32_neg17_sub_x:
1104 ; VI-SDAG:       ; %bb.0:
1105 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1106 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1107 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1108 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
1109 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1110 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1111 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
1112 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
1113 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1114 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1115 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1116 ; VI-SDAG-NEXT:    v_sub_u32_e32 v2, vcc, 0xffffffef, v3
1117 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
1118 ; VI-SDAG-NEXT:    s_endpgm
1120 ; VI-GISEL-LABEL: v_test_i32_neg17_sub_x:
1121 ; VI-GISEL:       ; %bb.0:
1122 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1123 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1124 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1125 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
1126 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
1127 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1128 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1129 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
1130 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
1131 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
1132 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1133 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1134 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1135 ; VI-GISEL-NEXT:    v_sub_u32_e32 v2, vcc, 0xffffffef, v3
1136 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
1137 ; VI-GISEL-NEXT:    s_endpgm
1139 ; GFX9-LABEL: v_test_i32_neg17_sub_x:
1140 ; GFX9:       ; %bb.0:
1141 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1142 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1143 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1144 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1145 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1146 ; GFX9-NEXT:    v_sub_u32_e32 v1, 0xffffffef, v1
1147 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1148 ; GFX9-NEXT:    s_endpgm
1150 ; GFX10-LABEL: v_test_i32_neg17_sub_x:
1151 ; GFX10:       ; %bb.0:
1152 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1153 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1154 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1155 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
1156 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1157 ; GFX10-NEXT:    v_sub_nc_u32_e32 v1, 0xffffffef, v1
1158 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
1159 ; GFX10-NEXT:    s_endpgm
1161 ; GFX11-LABEL: v_test_i32_neg17_sub_x:
1162 ; GFX11:       ; %bb.0:
1163 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1164 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1165 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1166 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1167 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1168 ; GFX11-NEXT:    v_sub_nc_u32_e32 v1, 0xffffffef, v1
1169 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1170 ; GFX11-NEXT:    s_nop 0
1171 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1172 ; GFX11-NEXT:    s_endpgm
1173   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1174   %tid.ext = sext i32 %tid to i64
1175   %gep = getelementptr inbounds i32, ptr addrspace(1) %in, i64 %tid.ext
1176   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
1177   %x = load i32, ptr addrspace(1) %gep
1178   %result = sub i32 -17, %x
1179   store i32 %result, ptr addrspace(1) %gep.out
1180   ret void
1183 define amdgpu_kernel void @s_test_i32_x_sub_64(i32 %x) #0 {
1184 ; SI-LABEL: s_test_i32_x_sub_64:
1185 ; SI:       ; %bb.0:
1186 ; SI-NEXT:    s_load_dword s0, s[0:1], 0x9
1187 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1188 ; SI-NEXT:    s_sub_i32 s0, s0, 64
1189 ; SI-NEXT:    ;;#ASMSTART
1190 ; SI-NEXT:    ; use s0
1191 ; SI-NEXT:    ;;#ASMEND
1192 ; SI-NEXT:    s_endpgm
1194 ; VI-LABEL: s_test_i32_x_sub_64:
1195 ; VI:       ; %bb.0:
1196 ; VI-NEXT:    s_load_dword s0, s[0:1], 0x24
1197 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1198 ; VI-NEXT:    s_sub_i32 s0, s0, 64
1199 ; VI-NEXT:    ;;#ASMSTART
1200 ; VI-NEXT:    ; use s0
1201 ; VI-NEXT:    ;;#ASMEND
1202 ; VI-NEXT:    s_endpgm
1204 ; GFX9-LABEL: s_test_i32_x_sub_64:
1205 ; GFX9:       ; %bb.0:
1206 ; GFX9-NEXT:    s_load_dword s0, s[0:1], 0x24
1207 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1208 ; GFX9-NEXT:    s_sub_i32 s0, s0, 64
1209 ; GFX9-NEXT:    ;;#ASMSTART
1210 ; GFX9-NEXT:    ; use s0
1211 ; GFX9-NEXT:    ;;#ASMEND
1212 ; GFX9-NEXT:    s_endpgm
1214 ; GFX10-LABEL: s_test_i32_x_sub_64:
1215 ; GFX10:       ; %bb.0:
1216 ; GFX10-NEXT:    s_load_dword s0, s[0:1], 0x24
1217 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1218 ; GFX10-NEXT:    s_sub_i32 s0, s0, 64
1219 ; GFX10-NEXT:    ;;#ASMSTART
1220 ; GFX10-NEXT:    ; use s0
1221 ; GFX10-NEXT:    ;;#ASMEND
1222 ; GFX10-NEXT:    s_endpgm
1224 ; GFX11-LABEL: s_test_i32_x_sub_64:
1225 ; GFX11:       ; %bb.0:
1226 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x24
1227 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1228 ; GFX11-NEXT:    s_sub_i32 s0, s0, 64
1229 ; GFX11-NEXT:    ;;#ASMSTART
1230 ; GFX11-NEXT:    ; use s0
1231 ; GFX11-NEXT:    ;;#ASMEND
1232 ; GFX11-NEXT:    s_endpgm
1233   %result = sub i32 %x, 64
1234   call void asm sideeffect "; use $0", "s"(i32 %result)
1235   ret void
1238 define amdgpu_kernel void @v_test_i16_x_sub_64(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
1239 ; SI-SDAG-LABEL: v_test_i16_x_sub_64:
1240 ; SI-SDAG:       ; %bb.0:
1241 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1242 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
1243 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
1244 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1245 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
1246 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1247 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
1248 ; SI-SDAG-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
1249 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
1250 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1251 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
1252 ; SI-SDAG-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
1253 ; SI-SDAG-NEXT:    s_endpgm
1255 ; SI-GISEL-LABEL: v_test_i16_x_sub_64:
1256 ; SI-GISEL:       ; %bb.0:
1257 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1258 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1259 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
1260 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
1261 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
1262 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1263 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
1264 ; SI-GISEL-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
1265 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1266 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
1267 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
1268 ; SI-GISEL-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
1269 ; SI-GISEL-NEXT:    s_endpgm
1271 ; VI-SDAG-LABEL: v_test_i16_x_sub_64:
1272 ; VI-SDAG:       ; %bb.0:
1273 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1274 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
1275 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1276 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
1277 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1278 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1279 ; VI-SDAG-NEXT:    flat_load_ushort v3, v[0:1]
1280 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
1281 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1282 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1283 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1284 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v2, 64, v3
1285 ; VI-SDAG-NEXT:    flat_store_short v[0:1], v2
1286 ; VI-SDAG-NEXT:    s_endpgm
1288 ; VI-GISEL-LABEL: v_test_i16_x_sub_64:
1289 ; VI-GISEL:       ; %bb.0:
1290 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1291 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
1292 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1293 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
1294 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
1295 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1296 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1297 ; VI-GISEL-NEXT:    flat_load_ushort v3, v[0:1]
1298 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
1299 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
1300 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1301 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1302 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1303 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v2, 64, v3
1304 ; VI-GISEL-NEXT:    flat_store_short v[0:1], v2
1305 ; VI-GISEL-NEXT:    s_endpgm
1307 ; GFX9-LABEL: v_test_i16_x_sub_64:
1308 ; GFX9:       ; %bb.0:
1309 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1310 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1311 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1312 ; GFX9-NEXT:    global_load_ushort v1, v0, s[2:3]
1313 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1314 ; GFX9-NEXT:    v_subrev_u16_e32 v1, 64, v1
1315 ; GFX9-NEXT:    global_store_short v0, v1, s[0:1]
1316 ; GFX9-NEXT:    s_endpgm
1318 ; GFX10-LABEL: v_test_i16_x_sub_64:
1319 ; GFX10:       ; %bb.0:
1320 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1321 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1322 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1323 ; GFX10-NEXT:    global_load_ushort v1, v0, s[2:3]
1324 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1325 ; GFX10-NEXT:    v_sub_nc_u16 v1, v1, 64
1326 ; GFX10-NEXT:    global_store_short v0, v1, s[0:1]
1327 ; GFX10-NEXT:    s_endpgm
1329 ; GFX11-LABEL: v_test_i16_x_sub_64:
1330 ; GFX11:       ; %bb.0:
1331 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1332 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1333 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1334 ; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3]
1335 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1336 ; GFX11-NEXT:    v_sub_nc_u16 v1, v1, 64
1337 ; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1]
1338 ; GFX11-NEXT:    s_nop 0
1339 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1340 ; GFX11-NEXT:    s_endpgm
1341   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1342   %tid.ext = sext i32 %tid to i64
1343   %gep = getelementptr inbounds i16, ptr addrspace(1) %in, i64 %tid.ext
1344   %gep.out = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext
1345   %x = load i16, ptr addrspace(1) %gep
1346   %result = sub i16 %x, 64
1347   store i16 %result, ptr addrspace(1) %gep.out
1348   ret void
1351 define amdgpu_kernel void @v_test_i16_x_sub_64_zext_to_i32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
1352 ; SI-SDAG-LABEL: v_test_i16_x_sub_64_zext_to_i32:
1353 ; SI-SDAG:       ; %bb.0:
1354 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1355 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
1356 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
1357 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v1, 1, v0
1358 ; SI-SDAG-NEXT:    v_mov_b32_e32 v2, 0
1359 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1360 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
1361 ; SI-SDAG-NEXT:    buffer_load_ushort v3, v[1:2], s[4:7], 0 addr64
1362 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
1363 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v1, 2, v0
1364 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1365 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v0, vcc, 64, v3
1366 ; SI-SDAG-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1367 ; SI-SDAG-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
1368 ; SI-SDAG-NEXT:    s_endpgm
1370 ; SI-GISEL-LABEL: v_test_i16_x_sub_64_zext_to_i32:
1371 ; SI-GISEL:       ; %bb.0:
1372 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1373 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v1, 1, v0
1374 ; SI-GISEL-NEXT:    v_mov_b32_e32 v2, 0
1375 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
1376 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
1377 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1378 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
1379 ; SI-GISEL-NEXT:    buffer_load_ushort v3, v[1:2], s[4:7], 0 addr64
1380 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v1, 2, v0
1381 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1382 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v0, vcc, 64, v3
1383 ; SI-GISEL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1384 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
1385 ; SI-GISEL-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
1386 ; SI-GISEL-NEXT:    s_endpgm
1388 ; VI-SDAG-LABEL: v_test_i16_x_sub_64_zext_to_i32:
1389 ; VI-SDAG:       ; %bb.0:
1390 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1391 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v1, 1, v0
1392 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1393 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1394 ; VI-SDAG-NEXT:    v_mov_b32_e32 v2, s3
1395 ; VI-SDAG-NEXT:    v_add_u32_e32 v1, vcc, s2, v1
1396 ; VI-SDAG-NEXT:    v_addc_u32_e32 v2, vcc, 0, v2, vcc
1397 ; VI-SDAG-NEXT:    flat_load_ushort v2, v[1:2]
1398 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
1399 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1400 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1401 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1402 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v2, 64, v2
1403 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
1404 ; VI-SDAG-NEXT:    s_endpgm
1406 ; VI-GISEL-LABEL: v_test_i16_x_sub_64_zext_to_i32:
1407 ; VI-GISEL:       ; %bb.0:
1408 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1409 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 1, v0
1410 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1411 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s2
1412 ; VI-GISEL-NEXT:    v_mov_b32_e32 v2, s3
1413 ; VI-GISEL-NEXT:    v_add_u32_e32 v1, vcc, v1, v3
1414 ; VI-GISEL-NEXT:    v_addc_u32_e32 v2, vcc, 0, v2, vcc
1415 ; VI-GISEL-NEXT:    flat_load_ushort v2, v[1:2]
1416 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 2, v0
1417 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
1418 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
1419 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v3
1420 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1421 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1422 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v2, 64, v2
1423 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
1424 ; VI-GISEL-NEXT:    s_endpgm
1426 ; GFX9-LABEL: v_test_i16_x_sub_64_zext_to_i32:
1427 ; GFX9:       ; %bb.0:
1428 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1429 ; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 1, v0
1430 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1431 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1432 ; GFX9-NEXT:    global_load_ushort v1, v1, s[2:3]
1433 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1434 ; GFX9-NEXT:    v_subrev_u16_e32 v1, 64, v1
1435 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1436 ; GFX9-NEXT:    s_endpgm
1438 ; GFX10-LABEL: v_test_i16_x_sub_64_zext_to_i32:
1439 ; GFX10:       ; %bb.0:
1440 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1441 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 1, v0
1442 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1443 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1444 ; GFX10-NEXT:    global_load_ushort v1, v1, s[2:3]
1445 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1446 ; GFX10-NEXT:    v_sub_nc_u16 v1, v1, 64
1447 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1448 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
1449 ; GFX10-NEXT:    s_endpgm
1451 ; GFX11-LABEL: v_test_i16_x_sub_64_zext_to_i32:
1452 ; GFX11:       ; %bb.0:
1453 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1454 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 1, v0
1455 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1456 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1457 ; GFX11-NEXT:    global_load_u16 v1, v1, s[2:3]
1458 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1459 ; GFX11-NEXT:    v_sub_nc_u16 v1, v1, 64
1460 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1461 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1462 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1463 ; GFX11-NEXT:    s_nop 0
1464 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1465 ; GFX11-NEXT:    s_endpgm
1466   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1467   %tid.ext = sext i32 %tid to i64
1468   %gep = getelementptr inbounds i16, ptr addrspace(1) %in, i64 %tid.ext
1469   %gep.out = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %tid.ext
1470   %x = load i16, ptr addrspace(1) %gep
1471   %result = sub i16 %x, 64
1472   %zext = zext i16 %result to i32
1473   store i32 %zext, ptr addrspace(1) %gep.out
1474   ret void
1477 define amdgpu_kernel void @v_test_i16_x_sub_64_multi_use(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
1478 ; SI-SDAG-LABEL: v_test_i16_x_sub_64_multi_use:
1479 ; SI-SDAG:       ; %bb.0:
1480 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1481 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
1482 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
1483 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1484 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
1485 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1486 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
1487 ; SI-SDAG-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64 glc
1488 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1489 ; SI-SDAG-NEXT:    buffer_load_ushort v3, v[0:1], s[4:7], 0 addr64 glc
1490 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1491 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
1492 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
1493 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v3
1494 ; SI-SDAG-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
1495 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1496 ; SI-SDAG-NEXT:    buffer_store_short v3, v[0:1], s[0:3], 0 addr64
1497 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1498 ; SI-SDAG-NEXT:    s_endpgm
1500 ; SI-GISEL-LABEL: v_test_i16_x_sub_64_multi_use:
1501 ; SI-GISEL:       ; %bb.0:
1502 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1503 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1504 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
1505 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
1506 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
1507 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1508 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
1509 ; SI-GISEL-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64 glc
1510 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1511 ; SI-GISEL-NEXT:    buffer_load_ushort v3, v[0:1], s[4:7], 0 addr64 glc
1512 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1513 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
1514 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
1515 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v3
1516 ; SI-GISEL-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
1517 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1518 ; SI-GISEL-NEXT:    buffer_store_short v3, v[0:1], s[0:3], 0 addr64
1519 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1520 ; SI-GISEL-NEXT:    s_endpgm
1522 ; VI-SDAG-LABEL: v_test_i16_x_sub_64_multi_use:
1523 ; VI-SDAG:       ; %bb.0:
1524 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1525 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
1526 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1527 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
1528 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1529 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1530 ; VI-SDAG-NEXT:    flat_load_ushort v3, v[0:1] glc
1531 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1532 ; VI-SDAG-NEXT:    flat_load_ushort v4, v[0:1] glc
1533 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1534 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
1535 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1536 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1537 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v2, 64, v3
1538 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v3, 64, v4
1539 ; VI-SDAG-NEXT:    flat_store_short v[0:1], v2
1540 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1541 ; VI-SDAG-NEXT:    flat_store_short v[0:1], v3
1542 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1543 ; VI-SDAG-NEXT:    s_endpgm
1545 ; VI-GISEL-LABEL: v_test_i16_x_sub_64_multi_use:
1546 ; VI-GISEL:       ; %bb.0:
1547 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1548 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
1549 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1550 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
1551 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
1552 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1553 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1554 ; VI-GISEL-NEXT:    flat_load_ushort v3, v[0:1] glc
1555 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1556 ; VI-GISEL-NEXT:    flat_load_ushort v4, v[0:1] glc
1557 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1558 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
1559 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
1560 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1561 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1562 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v2, 64, v3
1563 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v3, 64, v4
1564 ; VI-GISEL-NEXT:    flat_store_short v[0:1], v2
1565 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1566 ; VI-GISEL-NEXT:    flat_store_short v[0:1], v3
1567 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1568 ; VI-GISEL-NEXT:    s_endpgm
1570 ; GFX9-LABEL: v_test_i16_x_sub_64_multi_use:
1571 ; GFX9:       ; %bb.0:
1572 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1573 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1574 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1575 ; GFX9-NEXT:    global_load_ushort v1, v0, s[2:3] glc
1576 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1577 ; GFX9-NEXT:    global_load_ushort v2, v0, s[2:3] glc
1578 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1579 ; GFX9-NEXT:    v_subrev_u16_e32 v1, 64, v1
1580 ; GFX9-NEXT:    v_subrev_u16_e32 v2, 64, v2
1581 ; GFX9-NEXT:    global_store_short v0, v1, s[0:1]
1582 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1583 ; GFX9-NEXT:    global_store_short v0, v2, s[0:1]
1584 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1585 ; GFX9-NEXT:    s_endpgm
1587 ; GFX10-LABEL: v_test_i16_x_sub_64_multi_use:
1588 ; GFX10:       ; %bb.0:
1589 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1590 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1591 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1592 ; GFX10-NEXT:    global_load_ushort v1, v0, s[2:3] glc dlc
1593 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1594 ; GFX10-NEXT:    global_load_ushort v2, v0, s[2:3] glc dlc
1595 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1596 ; GFX10-NEXT:    v_sub_nc_u16 v1, v1, 64
1597 ; GFX10-NEXT:    v_sub_nc_u16 v2, v2, 64
1598 ; GFX10-NEXT:    global_store_short v0, v1, s[0:1]
1599 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1600 ; GFX10-NEXT:    global_store_short v0, v2, s[0:1]
1601 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1602 ; GFX10-NEXT:    s_endpgm
1604 ; GFX11-LABEL: v_test_i16_x_sub_64_multi_use:
1605 ; GFX11:       ; %bb.0:
1606 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1607 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
1608 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1609 ; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3] glc dlc
1610 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1611 ; GFX11-NEXT:    global_load_u16 v2, v0, s[2:3] glc dlc
1612 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1613 ; GFX11-NEXT:    v_sub_nc_u16 v1, v1, 64
1614 ; GFX11-NEXT:    v_sub_nc_u16 v2, v2, 64
1615 ; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1] dlc
1616 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1617 ; GFX11-NEXT:    global_store_b16 v0, v2, s[0:1] dlc
1618 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1619 ; GFX11-NEXT:    s_nop 0
1620 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1621 ; GFX11-NEXT:    s_endpgm
1622   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1623   %tid.ext = sext i32 %tid to i64
1624   %gep = getelementptr inbounds i16, ptr addrspace(1) %in, i64 %tid.ext
1625   %gep.out = getelementptr inbounds i16, ptr addrspace(1) %out, i64 %tid.ext
1626   %x = load volatile i16, ptr addrspace(1) %gep
1627   %y = load volatile i16, ptr addrspace(1) %gep
1628   %result0 = sub i16 %x, 64
1629   %result1 = sub i16 %y, 64
1630   store volatile i16 %result0, ptr addrspace(1) %gep.out
1631   store volatile i16 %result1, ptr addrspace(1) %gep.out
1632   ret void
1635 define amdgpu_kernel void @v_test_v2i16_x_sub_64_64(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
1636 ; SI-SDAG-LABEL: v_test_v2i16_x_sub_64_64:
1637 ; SI-SDAG:       ; %bb.0:
1638 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1639 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
1640 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
1641 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1642 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
1643 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1644 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
1645 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1646 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
1647 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1648 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v2
1649 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
1650 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
1651 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xffc00000, v2
1652 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1653 ; SI-SDAG-NEXT:    s_endpgm
1655 ; SI-GISEL-LABEL: v_test_v2i16_x_sub_64_64:
1656 ; SI-GISEL:       ; %bb.0:
1657 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1658 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1659 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
1660 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
1661 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
1662 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1663 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
1664 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1665 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1666 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
1667 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
1668 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v3
1669 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1670 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1671 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
1672 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
1673 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
1674 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1675 ; SI-GISEL-NEXT:    s_endpgm
1677 ; VI-SDAG-LABEL: v_test_v2i16_x_sub_64_64:
1678 ; VI-SDAG:       ; %bb.0:
1679 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1680 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1681 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 64
1682 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1683 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
1684 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1685 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1686 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
1687 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
1688 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1689 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1690 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1691 ; VI-SDAG-NEXT:    v_sub_u16_sdwa v2, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1692 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v3, 64, v3
1693 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v3, v2
1694 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
1695 ; VI-SDAG-NEXT:    s_endpgm
1697 ; VI-GISEL-LABEL: v_test_v2i16_x_sub_64_64:
1698 ; VI-GISEL:       ; %bb.0:
1699 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1700 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1701 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 64
1702 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1703 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
1704 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
1705 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1706 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1707 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
1708 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
1709 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
1710 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1711 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1712 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1713 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v2, 64, v3
1714 ; VI-GISEL-NEXT:    v_sub_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1715 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
1716 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
1717 ; VI-GISEL-NEXT:    s_endpgm
1719 ; GFX9-LABEL: v_test_v2i16_x_sub_64_64:
1720 ; GFX9:       ; %bb.0:
1721 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1722 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1723 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1724 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1725 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1726 ; GFX9-NEXT:    v_pk_sub_i16 v1, v1, 64 op_sel_hi:[1,0]
1727 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1728 ; GFX9-NEXT:    s_endpgm
1730 ; GFX10-LABEL: v_test_v2i16_x_sub_64_64:
1731 ; GFX10:       ; %bb.0:
1732 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1733 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1734 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1735 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
1736 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1737 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, 64 op_sel_hi:[1,0]
1738 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
1739 ; GFX10-NEXT:    s_endpgm
1741 ; GFX11-LABEL: v_test_v2i16_x_sub_64_64:
1742 ; GFX11:       ; %bb.0:
1743 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1744 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1745 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1746 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1747 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1748 ; GFX11-NEXT:    v_pk_sub_i16 v1, v1, 64 op_sel_hi:[1,0]
1749 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1750 ; GFX11-NEXT:    s_nop 0
1751 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1752 ; GFX11-NEXT:    s_endpgm
1753   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1754   %tid.ext = sext i32 %tid to i64
1755   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
1756   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
1757   %x = load <2 x i16>, ptr addrspace(1) %gep
1758   %result = sub <2 x i16> %x, <i16 64, i16 64>
1759   store <2 x i16> %result, ptr addrspace(1) %gep.out
1760   ret void
1763 define amdgpu_kernel void @v_test_v2i16_x_sub_7_64(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
1764 ; SI-SDAG-LABEL: v_test_v2i16_x_sub_7_64:
1765 ; SI-SDAG:       ; %bb.0:
1766 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1767 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
1768 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
1769 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1770 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
1771 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1772 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
1773 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1774 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
1775 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1776 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, -7, v2
1777 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
1778 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
1779 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xffc00000, v2
1780 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1781 ; SI-SDAG-NEXT:    s_endpgm
1783 ; SI-GISEL-LABEL: v_test_v2i16_x_sub_7_64:
1784 ; SI-GISEL:       ; %bb.0:
1785 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1786 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1787 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
1788 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
1789 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
1790 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1791 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
1792 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1793 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1794 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
1795 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 7, v2
1796 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v3
1797 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1798 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1799 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
1800 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
1801 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
1802 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1803 ; SI-GISEL-NEXT:    s_endpgm
1805 ; VI-SDAG-LABEL: v_test_v2i16_x_sub_7_64:
1806 ; VI-SDAG:       ; %bb.0:
1807 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1808 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1809 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 64
1810 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1811 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
1812 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1813 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1814 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
1815 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
1816 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1817 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1818 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1819 ; VI-SDAG-NEXT:    v_add_u16_e32 v2, -7, v3
1820 ; VI-SDAG-NEXT:    v_sub_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1821 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v2, v3
1822 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
1823 ; VI-SDAG-NEXT:    s_endpgm
1825 ; VI-GISEL-LABEL: v_test_v2i16_x_sub_7_64:
1826 ; VI-GISEL:       ; %bb.0:
1827 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1828 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1829 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 64
1830 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1831 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
1832 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
1833 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1834 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1835 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
1836 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
1837 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
1838 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1839 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1840 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1841 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v2, 7, v3
1842 ; VI-GISEL-NEXT:    v_sub_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1843 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
1844 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
1845 ; VI-GISEL-NEXT:    s_endpgm
1847 ; GFX9-SDAG-LABEL: v_test_v2i16_x_sub_7_64:
1848 ; GFX9-SDAG:       ; %bb.0:
1849 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1850 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1851 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1852 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
1853 ; GFX9-SDAG-NEXT:    s_mov_b32 s2, 0x400007
1854 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
1855 ; GFX9-SDAG-NEXT:    v_pk_sub_i16 v1, v1, s2
1856 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
1857 ; GFX9-SDAG-NEXT:    s_endpgm
1859 ; GFX9-GISEL-LABEL: v_test_v2i16_x_sub_7_64:
1860 ; GFX9-GISEL:       ; %bb.0:
1861 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1862 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1863 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0x400007
1864 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1865 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
1866 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
1867 ; GFX9-GISEL-NEXT:    v_pk_sub_i16 v1, v1, v2
1868 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
1869 ; GFX9-GISEL-NEXT:    s_endpgm
1871 ; GFX10-LABEL: v_test_v2i16_x_sub_7_64:
1872 ; GFX10:       ; %bb.0:
1873 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1874 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1875 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1876 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
1877 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1878 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, 0x400007
1879 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
1880 ; GFX10-NEXT:    s_endpgm
1882 ; GFX11-LABEL: v_test_v2i16_x_sub_7_64:
1883 ; GFX11:       ; %bb.0:
1884 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1885 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1886 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1887 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1888 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1889 ; GFX11-NEXT:    v_pk_sub_i16 v1, v1, 0x400007
1890 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1891 ; GFX11-NEXT:    s_nop 0
1892 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1893 ; GFX11-NEXT:    s_endpgm
1894   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1895   %tid.ext = sext i32 %tid to i64
1896   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
1897   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
1898   %x = load <2 x i16>, ptr addrspace(1) %gep
1899   %result = sub <2 x i16> %x, <i16 7, i16 64>
1900   store <2 x i16> %result, ptr addrspace(1) %gep.out
1901   ret void
1904 define amdgpu_kernel void @v_test_v2i16_x_sub_64_123(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
1905 ; SI-SDAG-LABEL: v_test_v2i16_x_sub_64_123:
1906 ; SI-SDAG:       ; %bb.0:
1907 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1908 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
1909 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
1910 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1911 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
1912 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1913 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
1914 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1915 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
1916 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1917 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v3, vcc, 64, v2
1918 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
1919 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
1920 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xff850000, v2
1921 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1922 ; SI-SDAG-NEXT:    s_endpgm
1924 ; SI-GISEL-LABEL: v_test_v2i16_x_sub_64_123:
1925 ; SI-GISEL:       ; %bb.0:
1926 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1927 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1928 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
1929 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
1930 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
1931 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1932 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
1933 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1934 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1935 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
1936 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 64, v2
1937 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 0x7b, v3
1938 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1939 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1940 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
1941 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
1942 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
1943 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1944 ; SI-GISEL-NEXT:    s_endpgm
1946 ; VI-SDAG-LABEL: v_test_v2i16_x_sub_64_123:
1947 ; VI-SDAG:       ; %bb.0:
1948 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1949 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1950 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 0xffffff85
1951 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1952 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
1953 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1954 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1955 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
1956 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
1957 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1958 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1959 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
1960 ; VI-SDAG-NEXT:    v_add_u16_sdwa v2, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1961 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v3, 64, v3
1962 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v3, v2
1963 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
1964 ; VI-SDAG-NEXT:    s_endpgm
1966 ; VI-GISEL-LABEL: v_test_v2i16_x_sub_64_123:
1967 ; VI-GISEL:       ; %bb.0:
1968 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1969 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1970 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 0x7b
1971 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1972 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
1973 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
1974 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1975 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1976 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
1977 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
1978 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
1979 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
1980 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1981 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
1982 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v2, 64, v3
1983 ; VI-GISEL-NEXT:    v_sub_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1984 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
1985 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
1986 ; VI-GISEL-NEXT:    s_endpgm
1988 ; GFX9-SDAG-LABEL: v_test_v2i16_x_sub_64_123:
1989 ; GFX9-SDAG:       ; %bb.0:
1990 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1991 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1992 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1993 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
1994 ; GFX9-SDAG-NEXT:    s_mov_b32 s2, 0x7b0040
1995 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
1996 ; GFX9-SDAG-NEXT:    v_pk_sub_i16 v1, v1, s2
1997 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
1998 ; GFX9-SDAG-NEXT:    s_endpgm
2000 ; GFX9-GISEL-LABEL: v_test_v2i16_x_sub_64_123:
2001 ; GFX9-GISEL:       ; %bb.0:
2002 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2003 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2004 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0x7b0040
2005 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2006 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2007 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
2008 ; GFX9-GISEL-NEXT:    v_pk_sub_i16 v1, v1, v2
2009 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2010 ; GFX9-GISEL-NEXT:    s_endpgm
2012 ; GFX10-LABEL: v_test_v2i16_x_sub_64_123:
2013 ; GFX10:       ; %bb.0:
2014 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2015 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2016 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2017 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
2018 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2019 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, 0x7b0040
2020 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
2021 ; GFX10-NEXT:    s_endpgm
2023 ; GFX11-LABEL: v_test_v2i16_x_sub_64_123:
2024 ; GFX11:       ; %bb.0:
2025 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2026 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2027 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2028 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2029 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2030 ; GFX11-NEXT:    v_pk_sub_i16 v1, v1, 0x7b0040
2031 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2032 ; GFX11-NEXT:    s_nop 0
2033 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2034 ; GFX11-NEXT:    s_endpgm
2035   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2036   %tid.ext = sext i32 %tid to i64
2037   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
2038   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
2039   %x = load <2 x i16>, ptr addrspace(1) %gep
2040   %result = sub <2 x i16> %x, <i16 64, i16 123>
2041   store <2 x i16> %result, ptr addrspace(1) %gep.out
2042   ret void
2045 ; Can fold 0 and inline immediate in other half.
2046 define amdgpu_kernel void @v_test_v2i16_x_sub_7_0(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2047 ; SI-SDAG-LABEL: v_test_v2i16_x_sub_7_0:
2048 ; SI-SDAG:       ; %bb.0:
2049 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2050 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
2051 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
2052 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2053 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
2054 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2055 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
2056 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2057 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
2058 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2059 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, -7, v2
2060 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff
2061 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v3, v2
2062 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2063 ; SI-SDAG-NEXT:    s_endpgm
2065 ; SI-GISEL-LABEL: v_test_v2i16_x_sub_7_0:
2066 ; SI-GISEL:       ; %bb.0:
2067 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2068 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2069 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
2070 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
2071 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
2072 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2073 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
2074 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2075 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2076 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2077 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v2, vcc, 7, v2
2078 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2079 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2080 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2081 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
2082 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2083 ; SI-GISEL-NEXT:    s_endpgm
2085 ; VI-SDAG-LABEL: v_test_v2i16_x_sub_7_0:
2086 ; VI-SDAG:       ; %bb.0:
2087 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2088 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2089 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2090 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
2091 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2092 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2093 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
2094 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
2095 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2096 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2097 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2098 ; VI-SDAG-NEXT:    v_and_b32_e32 v2, 0xffff0000, v3
2099 ; VI-SDAG-NEXT:    v_add_u16_e32 v3, -7, v3
2100 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v3, v2
2101 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
2102 ; VI-SDAG-NEXT:    s_endpgm
2104 ; VI-GISEL-LABEL: v_test_v2i16_x_sub_7_0:
2105 ; VI-GISEL:       ; %bb.0:
2106 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2107 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2108 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2109 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
2110 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
2111 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2112 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2113 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
2114 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
2115 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2116 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
2117 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2118 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2119 ; VI-GISEL-NEXT:    v_lshrrev_b32_e32 v2, 16, v3
2120 ; VI-GISEL-NEXT:    v_subrev_u16_e32 v3, 7, v3
2121 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2122 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v3, v2
2123 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
2124 ; VI-GISEL-NEXT:    s_endpgm
2126 ; GFX9-LABEL: v_test_v2i16_x_sub_7_0:
2127 ; GFX9:       ; %bb.0:
2128 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2129 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2130 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2131 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2132 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2133 ; GFX9-NEXT:    v_pk_sub_i16 v1, v1, 7
2134 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2135 ; GFX9-NEXT:    s_endpgm
2137 ; GFX10-LABEL: v_test_v2i16_x_sub_7_0:
2138 ; GFX10:       ; %bb.0:
2139 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2140 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2141 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2142 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
2143 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2144 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, 7
2145 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
2146 ; GFX10-NEXT:    s_endpgm
2148 ; GFX11-LABEL: v_test_v2i16_x_sub_7_0:
2149 ; GFX11:       ; %bb.0:
2150 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2151 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2152 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2153 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2154 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2155 ; GFX11-NEXT:    v_pk_sub_i16 v1, v1, 7
2156 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2157 ; GFX11-NEXT:    s_nop 0
2158 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2159 ; GFX11-NEXT:    s_endpgm
2160   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2161   %tid.ext = sext i32 %tid to i64
2162   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
2163   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
2164   %x = load <2 x i16>, ptr addrspace(1) %gep
2165   %result = sub <2 x i16> %x, <i16 7, i16 0>
2166   store <2 x i16> %result, ptr addrspace(1) %gep.out
2167   ret void
2170 ; Can fold 0 and inline immediate in other half.
2171 define amdgpu_kernel void @v_test_v2i16_x_sub_0_16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2172 ; SI-SDAG-LABEL: v_test_v2i16_x_sub_0_16:
2173 ; SI-SDAG:       ; %bb.0:
2174 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2175 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
2176 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
2177 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2178 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
2179 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2180 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
2181 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2182 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
2183 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2184 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xfff00000, v2
2185 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2186 ; SI-SDAG-NEXT:    s_endpgm
2188 ; SI-GISEL-LABEL: v_test_v2i16_x_sub_0_16:
2189 ; SI-GISEL:       ; %bb.0:
2190 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2191 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2192 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
2193 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
2194 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
2195 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2196 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
2197 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2198 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2199 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2200 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 16, v3
2201 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2202 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
2203 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2204 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2205 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
2206 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2207 ; SI-GISEL-NEXT:    s_endpgm
2209 ; VI-SDAG-LABEL: v_test_v2i16_x_sub_0_16:
2210 ; VI-SDAG:       ; %bb.0:
2211 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2212 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2213 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2214 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
2215 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2216 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2217 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
2218 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2219 ; VI-SDAG-NEXT:    v_mov_b32_e32 v2, -16
2220 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
2221 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2222 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2223 ; VI-SDAG-NEXT:    v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2224 ; VI-SDAG-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2225 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
2226 ; VI-SDAG-NEXT:    s_endpgm
2228 ; VI-GISEL-LABEL: v_test_v2i16_x_sub_0_16:
2229 ; VI-GISEL:       ; %bb.0:
2230 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2231 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2232 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2233 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
2234 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
2235 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2236 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2237 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
2238 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
2239 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2240 ; VI-GISEL-NEXT:    v_mov_b32_e32 v2, 16
2241 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
2242 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2243 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2244 ; VI-GISEL-NEXT:    v_sub_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2245 ; VI-GISEL-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2246 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
2247 ; VI-GISEL-NEXT:    s_endpgm
2249 ; GFX9-LABEL: v_test_v2i16_x_sub_0_16:
2250 ; GFX9:       ; %bb.0:
2251 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2252 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2253 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2254 ; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2255 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2256 ; GFX9-NEXT:    v_pk_sub_i16 v1, v1, 16 op_sel:[0,1] op_sel_hi:[1,0]
2257 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2258 ; GFX9-NEXT:    s_endpgm
2260 ; GFX10-LABEL: v_test_v2i16_x_sub_0_16:
2261 ; GFX10:       ; %bb.0:
2262 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2263 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2264 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2265 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
2266 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2267 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, 16 op_sel:[0,1] op_sel_hi:[1,0]
2268 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
2269 ; GFX10-NEXT:    s_endpgm
2271 ; GFX11-LABEL: v_test_v2i16_x_sub_0_16:
2272 ; GFX11:       ; %bb.0:
2273 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2274 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2275 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2276 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2277 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2278 ; GFX11-NEXT:    v_pk_sub_i16 v1, v1, 16 op_sel:[0,1] op_sel_hi:[1,0]
2279 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2280 ; GFX11-NEXT:    s_nop 0
2281 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2282 ; GFX11-NEXT:    s_endpgm
2283   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2284   %tid.ext = sext i32 %tid to i64
2285   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
2286   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
2287   %x = load <2 x i16>, ptr addrspace(1) %gep
2288   %result = sub <2 x i16> %x, <i16 0, i16 16>
2289   store <2 x i16> %result, ptr addrspace(1) %gep.out
2290   ret void
2293 define amdgpu_kernel void @v_test_v2i16_x_sub_0_1_0(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2294 ; SI-SDAG-LABEL: v_test_v2i16_x_sub_0_1_0:
2295 ; SI-SDAG:       ; %bb.0:
2296 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2297 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
2298 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
2299 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2300 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
2301 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2302 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
2303 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2304 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
2305 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2306 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0x3c000000, v2
2307 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2308 ; SI-SDAG-NEXT:    s_endpgm
2310 ; SI-GISEL-LABEL: v_test_v2i16_x_sub_0_1_0:
2311 ; SI-GISEL:       ; %bb.0:
2312 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2313 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2314 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
2315 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
2316 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
2317 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2318 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
2319 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2320 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2321 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2322 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 0xffffc400, v3
2323 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2324 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
2325 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2326 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2327 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
2328 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2329 ; SI-GISEL-NEXT:    s_endpgm
2331 ; VI-SDAG-LABEL: v_test_v2i16_x_sub_0_1_0:
2332 ; VI-SDAG:       ; %bb.0:
2333 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2334 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2335 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2336 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
2337 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2338 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2339 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
2340 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2341 ; VI-SDAG-NEXT:    v_mov_b32_e32 v2, 0x3c00
2342 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
2343 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2344 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2345 ; VI-SDAG-NEXT:    v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2346 ; VI-SDAG-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2347 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
2348 ; VI-SDAG-NEXT:    s_endpgm
2350 ; VI-GISEL-LABEL: v_test_v2i16_x_sub_0_1_0:
2351 ; VI-GISEL:       ; %bb.0:
2352 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2353 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2354 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2355 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
2356 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
2357 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2358 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2359 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
2360 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
2361 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2362 ; VI-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffffc400
2363 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
2364 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2365 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2366 ; VI-GISEL-NEXT:    v_sub_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2367 ; VI-GISEL-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2368 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
2369 ; VI-GISEL-NEXT:    s_endpgm
2371 ; GFX9-SDAG-LABEL: v_test_v2i16_x_sub_0_1_0:
2372 ; GFX9-SDAG:       ; %bb.0:
2373 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2374 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2375 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2376 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2377 ; GFX9-SDAG-NEXT:    s_brev_b32 s2, 35
2378 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
2379 ; GFX9-SDAG-NEXT:    v_pk_sub_i16 v1, v1, s2
2380 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2381 ; GFX9-SDAG-NEXT:    s_endpgm
2383 ; GFX9-GISEL-LABEL: v_test_v2i16_x_sub_0_1_0:
2384 ; GFX9-GISEL:       ; %bb.0:
2385 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2386 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2387 ; GFX9-GISEL-NEXT:    v_bfrev_b32_e32 v2, 35
2388 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2389 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2390 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
2391 ; GFX9-GISEL-NEXT:    v_pk_sub_i16 v1, v1, v2
2392 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2393 ; GFX9-GISEL-NEXT:    s_endpgm
2395 ; GFX10-LABEL: v_test_v2i16_x_sub_0_1_0:
2396 ; GFX10:       ; %bb.0:
2397 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2398 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2399 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2400 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
2401 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2402 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, 0xc400 op_sel:[0,1] op_sel_hi:[1,0]
2403 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
2404 ; GFX10-NEXT:    s_endpgm
2406 ; GFX11-LABEL: v_test_v2i16_x_sub_0_1_0:
2407 ; GFX11:       ; %bb.0:
2408 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2409 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2410 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2411 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2412 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2413 ; GFX11-NEXT:    v_pk_sub_i16 v1, v1, 0xc400 op_sel:[0,1] op_sel_hi:[1,0]
2414 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2415 ; GFX11-NEXT:    s_nop 0
2416 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2417 ; GFX11-NEXT:    s_endpgm
2418   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2419   %tid.ext = sext i32 %tid to i64
2420   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
2421   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
2422   %x = load <2 x i16>, ptr addrspace(1) %gep
2423   %result = sub <2 x i16> %x, <i16 0, i16 -15360>
2424   store <2 x i16> %result, ptr addrspace(1) %gep.out
2425   ret void
2428 define amdgpu_kernel void @v_test_v2i16_x_sub_0_neg1_0(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2429 ; SI-SDAG-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2430 ; SI-SDAG:       ; %bb.0:
2431 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2432 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
2433 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
2434 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2435 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
2436 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2437 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
2438 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2439 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
2440 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2441 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xbc000000, v2
2442 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2443 ; SI-SDAG-NEXT:    s_endpgm
2445 ; SI-GISEL-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2446 ; SI-GISEL:       ; %bb.0:
2447 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2448 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2449 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
2450 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
2451 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
2452 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2453 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
2454 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2455 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2456 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2457 ; SI-GISEL-NEXT:    v_subrev_i32_e32 v3, vcc, 0x4400, v3
2458 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2459 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
2460 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2461 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2462 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
2463 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2464 ; SI-GISEL-NEXT:    s_endpgm
2466 ; VI-SDAG-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2467 ; VI-SDAG:       ; %bb.0:
2468 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2469 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2470 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2471 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
2472 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2473 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2474 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
2475 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2476 ; VI-SDAG-NEXT:    v_mov_b32_e32 v2, 0xffffbc00
2477 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
2478 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2479 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2480 ; VI-SDAG-NEXT:    v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2481 ; VI-SDAG-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2482 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
2483 ; VI-SDAG-NEXT:    s_endpgm
2485 ; VI-GISEL-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2486 ; VI-GISEL:       ; %bb.0:
2487 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2488 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2489 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2490 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
2491 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
2492 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2493 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2494 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
2495 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
2496 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2497 ; VI-GISEL-NEXT:    v_mov_b32_e32 v2, 0x4400
2498 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
2499 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2500 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2501 ; VI-GISEL-NEXT:    v_sub_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2502 ; VI-GISEL-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2503 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
2504 ; VI-GISEL-NEXT:    s_endpgm
2506 ; GFX9-SDAG-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2507 ; GFX9-SDAG:       ; %bb.0:
2508 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2509 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2510 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2511 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2512 ; GFX9-SDAG-NEXT:    s_brev_b32 s2, 34
2513 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
2514 ; GFX9-SDAG-NEXT:    v_pk_sub_i16 v1, v1, s2
2515 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2516 ; GFX9-SDAG-NEXT:    s_endpgm
2518 ; GFX9-GISEL-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2519 ; GFX9-GISEL:       ; %bb.0:
2520 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2521 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2522 ; GFX9-GISEL-NEXT:    v_bfrev_b32_e32 v2, 34
2523 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2524 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2525 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
2526 ; GFX9-GISEL-NEXT:    v_pk_sub_i16 v1, v1, v2
2527 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2528 ; GFX9-GISEL-NEXT:    s_endpgm
2530 ; GFX10-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2531 ; GFX10:       ; %bb.0:
2532 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2533 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2534 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2535 ; GFX10-NEXT:    global_load_dword v1, v0, s[2:3]
2536 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2537 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, 0x4400 op_sel:[0,1] op_sel_hi:[1,0]
2538 ; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]
2539 ; GFX10-NEXT:    s_endpgm
2541 ; GFX11-LABEL: v_test_v2i16_x_sub_0_neg1_0:
2542 ; GFX11:       ; %bb.0:
2543 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2544 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2545 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2546 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2547 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2548 ; GFX11-NEXT:    v_pk_sub_i16 v1, v1, 0x4400 op_sel:[0,1] op_sel_hi:[1,0]
2549 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2550 ; GFX11-NEXT:    s_nop 0
2551 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2552 ; GFX11-NEXT:    s_endpgm
2553   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2554   %tid.ext = sext i32 %tid to i64
2555   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
2556   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
2557   %x = load <2 x i16>, ptr addrspace(1) %gep
2558   %result = sub <2 x i16> %x, <i16 0, i16 17408>
2559   store <2 x i16> %result, ptr addrspace(1) %gep.out
2560   ret void
2563 ; -32 isn't an inline immediate, but 32 is
2564 define amdgpu_kernel void @v_test_v2i16_x_add_neg32_neg32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2565 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg32_neg32:
2566 ; SI-SDAG:       ; %bb.0:
2567 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2568 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
2569 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
2570 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2571 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
2572 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2573 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
2574 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2575 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
2576 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2577 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v3, vcc, 32, v2
2578 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
2579 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
2580 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xffe00000, v2
2581 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2582 ; SI-SDAG-NEXT:    s_endpgm
2584 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg32_neg32:
2585 ; SI-GISEL:       ; %bb.0:
2586 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2587 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2588 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
2589 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
2590 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
2591 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2592 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
2593 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2594 ; SI-GISEL-NEXT:    s_movk_i32 s2, 0xffe0
2595 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2596 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2597 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, s2, v2
2598 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, s2, v3
2599 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2600 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
2601 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2602 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2603 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
2604 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2605 ; SI-GISEL-NEXT:    s_endpgm
2607 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg32_neg32:
2608 ; VI-SDAG:       ; %bb.0:
2609 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2610 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2611 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 32
2612 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2613 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
2614 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2615 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2616 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
2617 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
2618 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2619 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2620 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2621 ; VI-SDAG-NEXT:    v_sub_u16_sdwa v2, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2622 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v3, 32, v3
2623 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v3, v2
2624 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
2625 ; VI-SDAG-NEXT:    s_endpgm
2627 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg32_neg32:
2628 ; VI-GISEL:       ; %bb.0:
2629 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2630 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2631 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 0xffffffe0
2632 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2633 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
2634 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
2635 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2636 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2637 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
2638 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
2639 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
2640 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2641 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2642 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2643 ; VI-GISEL-NEXT:    v_add_u16_e32 v2, 0xffe0, v3
2644 ; VI-GISEL-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2645 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2646 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
2647 ; VI-GISEL-NEXT:    s_endpgm
2649 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg32_neg32:
2650 ; GFX9-SDAG:       ; %bb.0:
2651 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2652 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2653 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2654 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2655 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
2656 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel_hi:[1,0]
2657 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2658 ; GFX9-SDAG-NEXT:    s_endpgm
2660 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg32_neg32:
2661 ; GFX9-GISEL:       ; %bb.0:
2662 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2663 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2664 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffe0ffe0
2665 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2666 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2667 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
2668 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
2669 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2670 ; GFX9-GISEL-NEXT:    s_endpgm
2672 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg32_neg32:
2673 ; GFX10-SDAG:       ; %bb.0:
2674 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2675 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2676 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2677 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2678 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
2679 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel_hi:[1,0]
2680 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2681 ; GFX10-SDAG-NEXT:    s_endpgm
2683 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg32_neg32:
2684 ; GFX10-GISEL:       ; %bb.0:
2685 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2686 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2687 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2688 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2689 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
2690 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1 op_sel_hi:[0,1]
2691 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2692 ; GFX10-GISEL-NEXT:    s_endpgm
2694 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg32_neg32:
2695 ; GFX11-SDAG:       ; %bb.0:
2696 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2697 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2698 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2699 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
2700 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
2701 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel_hi:[1,0]
2702 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
2703 ; GFX11-SDAG-NEXT:    s_nop 0
2704 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2705 ; GFX11-SDAG-NEXT:    s_endpgm
2707 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg32_neg32:
2708 ; GFX11-GISEL:       ; %bb.0:
2709 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2710 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2711 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2712 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
2713 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
2714 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1 op_sel_hi:[0,1]
2715 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
2716 ; GFX11-GISEL-NEXT:    s_nop 0
2717 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2718 ; GFX11-GISEL-NEXT:    s_endpgm
2719   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2720   %tid.ext = sext i32 %tid to i64
2721   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
2722   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
2723   %x = load <2 x i16>, ptr addrspace(1) %gep
2724   %result = add <2 x i16> %x, <i16 -32, i16 -32>
2725   store <2 x i16> %result, ptr addrspace(1) %gep.out
2726   ret void
2729 define amdgpu_kernel void @v_test_v2i16_x_add_0_neg32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2730 ; SI-SDAG-LABEL: v_test_v2i16_x_add_0_neg32:
2731 ; SI-SDAG:       ; %bb.0:
2732 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2733 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
2734 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
2735 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2736 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
2737 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2738 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
2739 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2740 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
2741 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2742 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xffe00000, v2
2743 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2744 ; SI-SDAG-NEXT:    s_endpgm
2746 ; SI-GISEL-LABEL: v_test_v2i16_x_add_0_neg32:
2747 ; SI-GISEL:       ; %bb.0:
2748 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2749 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2750 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
2751 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
2752 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
2753 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2754 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
2755 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2756 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2757 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2758 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, 0xffffffe0, v3
2759 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2760 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
2761 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2762 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2763 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
2764 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2765 ; SI-GISEL-NEXT:    s_endpgm
2767 ; VI-SDAG-LABEL: v_test_v2i16_x_add_0_neg32:
2768 ; VI-SDAG:       ; %bb.0:
2769 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2770 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2771 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2772 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
2773 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2774 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2775 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
2776 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2777 ; VI-SDAG-NEXT:    v_mov_b32_e32 v2, 32
2778 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
2779 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2780 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2781 ; VI-SDAG-NEXT:    v_sub_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2782 ; VI-SDAG-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2783 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
2784 ; VI-SDAG-NEXT:    s_endpgm
2786 ; VI-GISEL-LABEL: v_test_v2i16_x_add_0_neg32:
2787 ; VI-GISEL:       ; %bb.0:
2788 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2789 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2790 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2791 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
2792 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
2793 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2794 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2795 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
2796 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
2797 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2798 ; VI-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffffffe0
2799 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
2800 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2801 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2802 ; VI-GISEL-NEXT:    v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2803 ; VI-GISEL-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
2804 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
2805 ; VI-GISEL-NEXT:    s_endpgm
2807 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_0_neg32:
2808 ; GFX9-SDAG:       ; %bb.0:
2809 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2810 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2811 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2812 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2813 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
2814 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel:[0,1] op_sel_hi:[1,0]
2815 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2816 ; GFX9-SDAG-NEXT:    s_endpgm
2818 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_0_neg32:
2819 ; GFX9-GISEL:       ; %bb.0:
2820 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2821 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2822 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffe00000
2823 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2824 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2825 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
2826 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
2827 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2828 ; GFX9-GISEL-NEXT:    s_endpgm
2830 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_0_neg32:
2831 ; GFX10-SDAG:       ; %bb.0:
2832 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2833 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2834 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2835 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2836 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
2837 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel:[0,1] op_sel_hi:[1,0]
2838 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2839 ; GFX10-SDAG-NEXT:    s_endpgm
2841 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_0_neg32:
2842 ; GFX10-GISEL:       ; %bb.0:
2843 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2844 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2845 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2846 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2847 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
2848 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1 op_sel:[1,0] op_sel_hi:[0,1]
2849 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2850 ; GFX10-GISEL-NEXT:    s_endpgm
2852 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_0_neg32:
2853 ; GFX11-SDAG:       ; %bb.0:
2854 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2855 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2856 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2857 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
2858 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
2859 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel:[0,1] op_sel_hi:[1,0]
2860 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
2861 ; GFX11-SDAG-NEXT:    s_nop 0
2862 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2863 ; GFX11-SDAG-NEXT:    s_endpgm
2865 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_0_neg32:
2866 ; GFX11-GISEL:       ; %bb.0:
2867 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2868 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2869 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2870 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
2871 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
2872 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1 op_sel:[1,0] op_sel_hi:[0,1]
2873 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
2874 ; GFX11-GISEL-NEXT:    s_nop 0
2875 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2876 ; GFX11-GISEL-NEXT:    s_endpgm
2877   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2878   %tid.ext = sext i32 %tid to i64
2879   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
2880   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
2881   %x = load <2 x i16>, ptr addrspace(1) %gep
2882   %result = add <2 x i16> %x, <i16 0, i16 -32>
2883   store <2 x i16> %result, ptr addrspace(1) %gep.out
2884   ret void
2887 define amdgpu_kernel void @v_test_v2i16_x_add_neg32_0(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2888 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg32_0:
2889 ; SI-SDAG:       ; %bb.0:
2890 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2891 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
2892 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
2893 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2894 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
2895 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2896 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
2897 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2898 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
2899 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2900 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v3, vcc, 32, v2
2901 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff
2902 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v3, v2
2903 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2904 ; SI-SDAG-NEXT:    s_endpgm
2906 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg32_0:
2907 ; SI-GISEL:       ; %bb.0:
2908 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2909 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2910 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
2911 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
2912 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
2913 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2914 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
2915 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2916 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2917 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2918 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, 0xffffffe0, v2
2919 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2920 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2921 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
2922 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
2923 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2924 ; SI-GISEL-NEXT:    s_endpgm
2926 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg32_0:
2927 ; VI-SDAG:       ; %bb.0:
2928 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2929 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2930 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2931 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
2932 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2933 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2934 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
2935 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
2936 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2937 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2938 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
2939 ; VI-SDAG-NEXT:    v_and_b32_e32 v2, 0xffff0000, v3
2940 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v3, 32, v3
2941 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v3, v2
2942 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
2943 ; VI-SDAG-NEXT:    s_endpgm
2945 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg32_0:
2946 ; VI-GISEL:       ; %bb.0:
2947 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2948 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2949 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2950 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
2951 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
2952 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2953 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2954 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
2955 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
2956 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
2957 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
2958 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2959 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
2960 ; VI-GISEL-NEXT:    v_lshrrev_b32_e32 v2, 16, v3
2961 ; VI-GISEL-NEXT:    v_add_u16_e32 v3, 0xffe0, v3
2962 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2963 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v3, v2
2964 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
2965 ; VI-GISEL-NEXT:    s_endpgm
2967 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg32_0:
2968 ; GFX9-SDAG:       ; %bb.0:
2969 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2970 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2971 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2972 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2973 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
2974 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32
2975 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2976 ; GFX9-SDAG-NEXT:    s_endpgm
2978 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg32_0:
2979 ; GFX9-GISEL:       ; %bb.0:
2980 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2981 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2982 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffe0
2983 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
2984 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
2985 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
2986 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
2987 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
2988 ; GFX9-GISEL-NEXT:    s_endpgm
2990 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg32_0:
2991 ; GFX10-SDAG:       ; %bb.0:
2992 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2993 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2994 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
2995 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
2996 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
2997 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32
2998 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
2999 ; GFX10-SDAG-NEXT:    s_endpgm
3001 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg32_0:
3002 ; GFX10-GISEL:       ; %bb.0:
3003 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3004 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3005 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3006 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3007 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
3008 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1
3009 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3010 ; GFX10-GISEL-NEXT:    s_endpgm
3012 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg32_0:
3013 ; GFX11-SDAG:       ; %bb.0:
3014 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3015 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3016 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3017 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
3018 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
3019 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32
3020 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
3021 ; GFX11-SDAG-NEXT:    s_nop 0
3022 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3023 ; GFX11-SDAG-NEXT:    s_endpgm
3025 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg32_0:
3026 ; GFX11-GISEL:       ; %bb.0:
3027 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3028 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3029 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3030 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
3031 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
3032 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1
3033 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
3034 ; GFX11-GISEL-NEXT:    s_nop 0
3035 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3036 ; GFX11-GISEL-NEXT:    s_endpgm
3037   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3038   %tid.ext = sext i32 %tid to i64
3039   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
3040   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
3041   %x = load <2 x i16>, ptr addrspace(1) %gep
3042   %result = add <2 x i16> %x, <i16 -32, i16 0>
3043   store <2 x i16> %result, ptr addrspace(1) %gep.out
3044   ret void
3047 ; 16 and -16 are both inline immediates
3048 define amdgpu_kernel void @v_test_v2i16_x_add_neg16_neg16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
3049 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg16_neg16:
3050 ; SI-SDAG:       ; %bb.0:
3051 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3052 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
3053 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
3054 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3055 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
3056 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3057 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
3058 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3059 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
3060 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3061 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, -16, v2
3062 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
3063 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
3064 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xfff00000, v2
3065 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3066 ; SI-SDAG-NEXT:    s_endpgm
3068 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg16_neg16:
3069 ; SI-GISEL:       ; %bb.0:
3070 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3071 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3072 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
3073 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
3074 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
3075 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3076 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
3077 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3078 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3079 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3080 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, -16, v2
3081 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, -16, v3
3082 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3083 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
3084 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3085 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3086 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
3087 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3088 ; SI-GISEL-NEXT:    s_endpgm
3090 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg16_neg16:
3091 ; VI-SDAG:       ; %bb.0:
3092 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3093 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3094 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, -16
3095 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3096 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
3097 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3098 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3099 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
3100 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
3101 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3102 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3103 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3104 ; VI-SDAG-NEXT:    v_add_u16_e32 v2, -16, v3
3105 ; VI-SDAG-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3106 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v2, v3
3107 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
3108 ; VI-SDAG-NEXT:    s_endpgm
3110 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg16_neg16:
3111 ; VI-GISEL:       ; %bb.0:
3112 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3113 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3114 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, -16
3115 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3116 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
3117 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
3118 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3119 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3120 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
3121 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
3122 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
3123 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3124 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3125 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3126 ; VI-GISEL-NEXT:    v_add_u16_e32 v2, -16, v3
3127 ; VI-GISEL-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3128 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3129 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
3130 ; VI-GISEL-NEXT:    s_endpgm
3132 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg16_neg16:
3133 ; GFX9-SDAG:       ; %bb.0:
3134 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3135 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3136 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3137 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3138 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
3139 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16 op_sel_hi:[1,0]
3140 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3141 ; GFX9-SDAG-NEXT:    s_endpgm
3143 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg16_neg16:
3144 ; GFX9-GISEL:       ; %bb.0:
3145 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3146 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3147 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3148 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3149 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
3150 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16 op_sel_hi:[1,0]
3151 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3152 ; GFX9-GISEL-NEXT:    s_endpgm
3154 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg16_neg16:
3155 ; GFX10-SDAG:       ; %bb.0:
3156 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3157 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3158 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3159 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3160 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
3161 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16 op_sel_hi:[1,0]
3162 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3163 ; GFX10-SDAG-NEXT:    s_endpgm
3165 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg16_neg16:
3166 ; GFX10-GISEL:       ; %bb.0:
3167 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3168 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3169 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3170 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3171 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
3172 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16 op_sel_hi:[1,0]
3173 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3174 ; GFX10-GISEL-NEXT:    s_endpgm
3176 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg16_neg16:
3177 ; GFX11-SDAG:       ; %bb.0:
3178 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3179 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3180 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3181 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
3182 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
3183 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16 op_sel_hi:[1,0]
3184 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
3185 ; GFX11-SDAG-NEXT:    s_nop 0
3186 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3187 ; GFX11-SDAG-NEXT:    s_endpgm
3189 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg16_neg16:
3190 ; GFX11-GISEL:       ; %bb.0:
3191 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3192 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3193 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3194 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
3195 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
3196 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16 op_sel_hi:[1,0]
3197 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
3198 ; GFX11-GISEL-NEXT:    s_nop 0
3199 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3200 ; GFX11-GISEL-NEXT:    s_endpgm
3201   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3202   %tid.ext = sext i32 %tid to i64
3203   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
3204   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
3205   %x = load <2 x i16>, ptr addrspace(1) %gep
3206   %result = add <2 x i16> %x, <i16 -16, i16 -16>
3207   store <2 x i16> %result, ptr addrspace(1) %gep.out
3208   ret void
3211 define amdgpu_kernel void @v_test_v2i16_x_add_0_neg16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
3212 ; SI-SDAG-LABEL: v_test_v2i16_x_add_0_neg16:
3213 ; SI-SDAG:       ; %bb.0:
3214 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3215 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
3216 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
3217 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3218 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
3219 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3220 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
3221 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3222 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
3223 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3224 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xfff00000, v2
3225 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3226 ; SI-SDAG-NEXT:    s_endpgm
3228 ; SI-GISEL-LABEL: v_test_v2i16_x_add_0_neg16:
3229 ; SI-GISEL:       ; %bb.0:
3230 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3231 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3232 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
3233 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
3234 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
3235 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3236 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
3237 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3238 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3239 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3240 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, -16, v3
3241 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3242 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
3243 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3244 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3245 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
3246 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3247 ; SI-GISEL-NEXT:    s_endpgm
3249 ; VI-SDAG-LABEL: v_test_v2i16_x_add_0_neg16:
3250 ; VI-SDAG:       ; %bb.0:
3251 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3252 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3253 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3254 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
3255 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3256 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3257 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
3258 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3259 ; VI-SDAG-NEXT:    v_mov_b32_e32 v2, -16
3260 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
3261 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3262 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3263 ; VI-SDAG-NEXT:    v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3264 ; VI-SDAG-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
3265 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
3266 ; VI-SDAG-NEXT:    s_endpgm
3268 ; VI-GISEL-LABEL: v_test_v2i16_x_add_0_neg16:
3269 ; VI-GISEL:       ; %bb.0:
3270 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3271 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3272 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3273 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
3274 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
3275 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3276 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3277 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
3278 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
3279 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3280 ; VI-GISEL-NEXT:    v_mov_b32_e32 v2, -16
3281 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
3282 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3283 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3284 ; VI-GISEL-NEXT:    v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3285 ; VI-GISEL-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
3286 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
3287 ; VI-GISEL-NEXT:    s_endpgm
3289 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_0_neg16:
3290 ; GFX9-SDAG:       ; %bb.0:
3291 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3292 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3293 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3294 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3295 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
3296 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16 op_sel:[0,1] op_sel_hi:[1,0]
3297 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3298 ; GFX9-SDAG-NEXT:    s_endpgm
3300 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_0_neg16:
3301 ; GFX9-GISEL:       ; %bb.0:
3302 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3303 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3304 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3305 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3306 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
3307 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16 op_sel:[0,1] op_sel_hi:[1,0]
3308 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3309 ; GFX9-GISEL-NEXT:    s_endpgm
3311 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_0_neg16:
3312 ; GFX10-SDAG:       ; %bb.0:
3313 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3314 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3315 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3316 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3317 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
3318 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16 op_sel:[0,1] op_sel_hi:[1,0]
3319 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3320 ; GFX10-SDAG-NEXT:    s_endpgm
3322 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_0_neg16:
3323 ; GFX10-GISEL:       ; %bb.0:
3324 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3325 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3326 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3327 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3328 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
3329 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16 op_sel:[0,1] op_sel_hi:[1,0]
3330 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3331 ; GFX10-GISEL-NEXT:    s_endpgm
3333 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_0_neg16:
3334 ; GFX11-SDAG:       ; %bb.0:
3335 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3336 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3337 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3338 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
3339 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
3340 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16 op_sel:[0,1] op_sel_hi:[1,0]
3341 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
3342 ; GFX11-SDAG-NEXT:    s_nop 0
3343 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3344 ; GFX11-SDAG-NEXT:    s_endpgm
3346 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_0_neg16:
3347 ; GFX11-GISEL:       ; %bb.0:
3348 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3349 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3350 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3351 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
3352 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
3353 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16 op_sel:[0,1] op_sel_hi:[1,0]
3354 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
3355 ; GFX11-GISEL-NEXT:    s_nop 0
3356 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3357 ; GFX11-GISEL-NEXT:    s_endpgm
3358   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3359   %tid.ext = sext i32 %tid to i64
3360   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
3361   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
3362   %x = load <2 x i16>, ptr addrspace(1) %gep
3363   %result = add <2 x i16> %x, <i16 0, i16 -16>
3364   store <2 x i16> %result, ptr addrspace(1) %gep.out
3365   ret void
3368 define amdgpu_kernel void @v_test_v2i16_x_add_neg16_0(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
3369 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg16_0:
3370 ; SI-SDAG:       ; %bb.0:
3371 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3372 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
3373 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
3374 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3375 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
3376 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3377 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
3378 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3379 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
3380 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3381 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, -16, v2
3382 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff
3383 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v3, v2
3384 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3385 ; SI-SDAG-NEXT:    s_endpgm
3387 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg16_0:
3388 ; SI-GISEL:       ; %bb.0:
3389 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3390 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3391 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
3392 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
3393 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
3394 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3395 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
3396 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3397 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3398 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3399 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, -16, v2
3400 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3401 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3402 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3403 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
3404 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3405 ; SI-GISEL-NEXT:    s_endpgm
3407 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg16_0:
3408 ; VI-SDAG:       ; %bb.0:
3409 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3410 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3411 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3412 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
3413 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3414 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3415 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
3416 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
3417 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3418 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3419 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3420 ; VI-SDAG-NEXT:    v_and_b32_e32 v2, 0xffff0000, v3
3421 ; VI-SDAG-NEXT:    v_add_u16_e32 v3, -16, v3
3422 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v3, v2
3423 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
3424 ; VI-SDAG-NEXT:    s_endpgm
3426 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg16_0:
3427 ; VI-GISEL:       ; %bb.0:
3428 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3429 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3430 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3431 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
3432 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
3433 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3434 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3435 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
3436 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
3437 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3438 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
3439 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3440 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3441 ; VI-GISEL-NEXT:    v_lshrrev_b32_e32 v2, 16, v3
3442 ; VI-GISEL-NEXT:    v_add_u16_e32 v3, -16, v3
3443 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3444 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v3, v2
3445 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
3446 ; VI-GISEL-NEXT:    s_endpgm
3448 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg16_0:
3449 ; GFX9-SDAG:       ; %bb.0:
3450 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3451 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3452 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3453 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3454 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
3455 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16
3456 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3457 ; GFX9-SDAG-NEXT:    s_endpgm
3459 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg16_0:
3460 ; GFX9-GISEL:       ; %bb.0:
3461 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3462 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3463 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3464 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3465 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
3466 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16
3467 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3468 ; GFX9-GISEL-NEXT:    s_endpgm
3470 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg16_0:
3471 ; GFX10-SDAG:       ; %bb.0:
3472 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3473 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3474 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3475 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3476 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
3477 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16
3478 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3479 ; GFX10-SDAG-NEXT:    s_endpgm
3481 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg16_0:
3482 ; GFX10-GISEL:       ; %bb.0:
3483 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3484 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3485 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3486 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3487 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
3488 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16
3489 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3490 ; GFX10-GISEL-NEXT:    s_endpgm
3492 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg16_0:
3493 ; GFX11-SDAG:       ; %bb.0:
3494 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3495 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3496 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3497 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
3498 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
3499 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 16
3500 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
3501 ; GFX11-SDAG-NEXT:    s_nop 0
3502 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3503 ; GFX11-SDAG-NEXT:    s_endpgm
3505 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg16_0:
3506 ; GFX11-GISEL:       ; %bb.0:
3507 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3508 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3509 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3510 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
3511 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
3512 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, v1, -16
3513 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
3514 ; GFX11-GISEL-NEXT:    s_nop 0
3515 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3516 ; GFX11-GISEL-NEXT:    s_endpgm
3517   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3518   %tid.ext = sext i32 %tid to i64
3519   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
3520   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
3521   %x = load <2 x i16>, ptr addrspace(1) %gep
3522   %result = add <2 x i16> %x, <i16 -16, i16 0>
3523   store <2 x i16> %result, ptr addrspace(1) %gep.out
3524   ret void
3527 define amdgpu_kernel void @v_test_v2i16_x_add_neg_fpone(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
3528 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg_fpone:
3529 ; SI-SDAG:       ; %bb.0:
3530 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3531 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
3532 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
3533 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3534 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
3535 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3536 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
3537 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3538 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
3539 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3540 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, 0xffffc400, v2
3541 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
3542 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
3543 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xc4000000, v2
3544 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3545 ; SI-SDAG-NEXT:    s_endpgm
3547 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg_fpone:
3548 ; SI-GISEL:       ; %bb.0:
3549 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3550 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3551 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
3552 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
3553 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
3554 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3555 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
3556 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3557 ; SI-GISEL-NEXT:    s_movk_i32 s2, 0xc400
3558 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3559 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3560 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, s2, v2
3561 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, s2, v3
3562 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3563 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
3564 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3565 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3566 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
3567 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3568 ; SI-GISEL-NEXT:    s_endpgm
3570 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg_fpone:
3571 ; VI-SDAG:       ; %bb.0:
3572 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3573 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3574 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 0xffffc400
3575 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3576 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
3577 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3578 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3579 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
3580 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
3581 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3582 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3583 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3584 ; VI-SDAG-NEXT:    v_add_u16_e32 v2, 0xc400, v3
3585 ; VI-SDAG-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3586 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v2, v3
3587 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
3588 ; VI-SDAG-NEXT:    s_endpgm
3590 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg_fpone:
3591 ; VI-GISEL:       ; %bb.0:
3592 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3593 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3594 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 0xffffc400
3595 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3596 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
3597 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
3598 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3599 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3600 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
3601 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
3602 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
3603 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3604 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3605 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3606 ; VI-GISEL-NEXT:    v_add_u16_e32 v2, 0xc400, v3
3607 ; VI-GISEL-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3608 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3609 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
3610 ; VI-GISEL-NEXT:    s_endpgm
3612 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg_fpone:
3613 ; GFX9-SDAG:       ; %bb.0:
3614 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3615 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3616 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3617 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3618 ; GFX9-SDAG-NEXT:    s_mov_b32 s2, 0x3c003c00
3619 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
3620 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, s2
3621 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3622 ; GFX9-SDAG-NEXT:    s_endpgm
3624 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg_fpone:
3625 ; GFX9-GISEL:       ; %bb.0:
3626 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3627 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3628 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xc400c400
3629 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3630 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3631 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
3632 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
3633 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3634 ; GFX9-GISEL-NEXT:    s_endpgm
3636 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg_fpone:
3637 ; GFX10-SDAG:       ; %bb.0:
3638 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3639 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3640 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3641 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3642 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
3643 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0x3c00 op_sel_hi:[1,0]
3644 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3645 ; GFX10-SDAG-NEXT:    s_endpgm
3647 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg_fpone:
3648 ; GFX10-GISEL:       ; %bb.0:
3649 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3650 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3651 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3652 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3653 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
3654 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0xc400, v1 op_sel_hi:[0,1]
3655 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3656 ; GFX10-GISEL-NEXT:    s_endpgm
3658 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg_fpone:
3659 ; GFX11-SDAG:       ; %bb.0:
3660 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3661 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3662 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3663 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
3664 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
3665 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0x3c00 op_sel_hi:[1,0]
3666 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
3667 ; GFX11-SDAG-NEXT:    s_nop 0
3668 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3669 ; GFX11-SDAG-NEXT:    s_endpgm
3671 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg_fpone:
3672 ; GFX11-GISEL:       ; %bb.0:
3673 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3674 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3675 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3676 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
3677 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
3678 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0xc400, v1 op_sel_hi:[0,1]
3679 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
3680 ; GFX11-GISEL-NEXT:    s_nop 0
3681 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3682 ; GFX11-GISEL-NEXT:    s_endpgm
3683   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3684   %tid.ext = sext i32 %tid to i64
3685   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
3686   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
3687   %x = load <2 x i16>, ptr addrspace(1) %gep
3688   %result = add <2 x i16> %x, <i16 -15360, i16 -15360>
3689   store <2 x i16> %result, ptr addrspace(1) %gep.out
3690   ret void
3693 define amdgpu_kernel void @v_test_v2i16_x_add_neg_negfpone(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
3694 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg_negfpone:
3695 ; SI-SDAG:       ; %bb.0:
3696 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3697 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
3698 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
3699 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3700 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
3701 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3702 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
3703 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3704 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
3705 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3706 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, 0x4400, v2
3707 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
3708 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
3709 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0x44000000, v2
3710 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3711 ; SI-SDAG-NEXT:    s_endpgm
3713 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg_negfpone:
3714 ; SI-GISEL:       ; %bb.0:
3715 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3716 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3717 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
3718 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
3719 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
3720 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3721 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
3722 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3723 ; SI-GISEL-NEXT:    s_movk_i32 s2, 0x4400
3724 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3725 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3726 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, s2, v2
3727 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, s2, v3
3728 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3729 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
3730 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3731 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3732 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
3733 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3734 ; SI-GISEL-NEXT:    s_endpgm
3736 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg_negfpone:
3737 ; VI-SDAG:       ; %bb.0:
3738 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3739 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3740 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 0x4400
3741 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3742 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
3743 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3744 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3745 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
3746 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
3747 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3748 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3749 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3750 ; VI-SDAG-NEXT:    v_add_u16_e32 v2, 0x4400, v3
3751 ; VI-SDAG-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3752 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v2, v3
3753 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
3754 ; VI-SDAG-NEXT:    s_endpgm
3756 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg_negfpone:
3757 ; VI-GISEL:       ; %bb.0:
3758 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3759 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3760 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 0x4400
3761 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3762 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
3763 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
3764 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3765 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3766 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
3767 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
3768 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
3769 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3770 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3771 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3772 ; VI-GISEL-NEXT:    v_add_u16_e32 v2, 0x4400, v3
3773 ; VI-GISEL-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3774 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3775 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
3776 ; VI-GISEL-NEXT:    s_endpgm
3778 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg_negfpone:
3779 ; GFX9-SDAG:       ; %bb.0:
3780 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3781 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3782 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3783 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3784 ; GFX9-SDAG-NEXT:    s_mov_b32 s2, 0xbc00bc00
3785 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
3786 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, s2
3787 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3788 ; GFX9-SDAG-NEXT:    s_endpgm
3790 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg_negfpone:
3791 ; GFX9-GISEL:       ; %bb.0:
3792 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3793 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3794 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0x44004400
3795 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3796 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3797 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
3798 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
3799 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3800 ; GFX9-GISEL-NEXT:    s_endpgm
3802 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg_negfpone:
3803 ; GFX10-SDAG:       ; %bb.0:
3804 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3805 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3806 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3807 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3808 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
3809 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0xbc00 op_sel_hi:[1,0]
3810 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3811 ; GFX10-SDAG-NEXT:    s_endpgm
3813 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg_negfpone:
3814 ; GFX10-GISEL:       ; %bb.0:
3815 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3816 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3817 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3818 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3819 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
3820 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0x4400, v1 op_sel_hi:[0,1]
3821 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3822 ; GFX10-GISEL-NEXT:    s_endpgm
3824 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg_negfpone:
3825 ; GFX11-SDAG:       ; %bb.0:
3826 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3827 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3828 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3829 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
3830 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
3831 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0xbc00 op_sel_hi:[1,0]
3832 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
3833 ; GFX11-SDAG-NEXT:    s_nop 0
3834 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3835 ; GFX11-SDAG-NEXT:    s_endpgm
3837 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg_negfpone:
3838 ; GFX11-GISEL:       ; %bb.0:
3839 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3840 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3841 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3842 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
3843 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
3844 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0x4400, v1 op_sel_hi:[0,1]
3845 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
3846 ; GFX11-GISEL-NEXT:    s_nop 0
3847 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3848 ; GFX11-GISEL-NEXT:    s_endpgm
3849   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3850   %tid.ext = sext i32 %tid to i64
3851   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
3852   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
3853   %x = load <2 x i16>, ptr addrspace(1) %gep
3854   %result = add <2 x i16> %x, <i16 17408, i16 17408>
3855   store <2 x i16> %result, ptr addrspace(1) %gep.out
3856   ret void
3859 define amdgpu_kernel void @v_test_v2i16_x_add_neg_fptwo(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
3860 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg_fptwo:
3861 ; SI-SDAG:       ; %bb.0:
3862 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3863 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
3864 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
3865 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3866 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
3867 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3868 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
3869 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3870 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
3871 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3872 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, 0x4000, v2
3873 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
3874 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
3875 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 2.0, v2
3876 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3877 ; SI-SDAG-NEXT:    s_endpgm
3879 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg_fptwo:
3880 ; SI-GISEL:       ; %bb.0:
3881 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3882 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3883 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
3884 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
3885 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
3886 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3887 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
3888 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3889 ; SI-GISEL-NEXT:    s_movk_i32 s2, 0x4000
3890 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3891 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3892 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, s2, v2
3893 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, s2, v3
3894 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3895 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
3896 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3897 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3898 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
3899 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3900 ; SI-GISEL-NEXT:    s_endpgm
3902 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg_fptwo:
3903 ; VI-SDAG:       ; %bb.0:
3904 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3905 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3906 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 0x4000
3907 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3908 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
3909 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3910 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3911 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
3912 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
3913 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3914 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3915 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
3916 ; VI-SDAG-NEXT:    v_add_u16_e32 v2, 0x4000, v3
3917 ; VI-SDAG-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3918 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v2, v3
3919 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
3920 ; VI-SDAG-NEXT:    s_endpgm
3922 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg_fptwo:
3923 ; VI-GISEL:       ; %bb.0:
3924 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3925 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3926 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 0x4000
3927 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3928 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
3929 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
3930 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3931 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3932 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
3933 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
3934 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
3935 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
3936 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3937 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
3938 ; VI-GISEL-NEXT:    v_add_u16_e32 v2, 0x4000, v3
3939 ; VI-GISEL-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3940 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
3941 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
3942 ; VI-GISEL-NEXT:    s_endpgm
3944 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg_fptwo:
3945 ; GFX9-SDAG:       ; %bb.0:
3946 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3947 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3948 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3949 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3950 ; GFX9-SDAG-NEXT:    s_mov_b32 s2, 0xc000c000
3951 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
3952 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, s2
3953 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3954 ; GFX9-SDAG-NEXT:    s_endpgm
3956 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg_fptwo:
3957 ; GFX9-GISEL:       ; %bb.0:
3958 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3959 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3960 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0x40004000
3961 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3962 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3963 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
3964 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
3965 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3966 ; GFX9-GISEL-NEXT:    s_endpgm
3968 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg_fptwo:
3969 ; GFX10-SDAG:       ; %bb.0:
3970 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3971 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3972 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3973 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
3974 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
3975 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0xc000 op_sel_hi:[1,0]
3976 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
3977 ; GFX10-SDAG-NEXT:    s_endpgm
3979 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg_fptwo:
3980 ; GFX10-GISEL:       ; %bb.0:
3981 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3982 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3983 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
3984 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
3985 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
3986 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0x4000, v1 op_sel_hi:[0,1]
3987 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
3988 ; GFX10-GISEL-NEXT:    s_endpgm
3990 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg_fptwo:
3991 ; GFX11-SDAG:       ; %bb.0:
3992 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3993 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3994 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
3995 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
3996 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
3997 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0xc000 op_sel_hi:[1,0]
3998 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
3999 ; GFX11-SDAG-NEXT:    s_nop 0
4000 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4001 ; GFX11-SDAG-NEXT:    s_endpgm
4003 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg_fptwo:
4004 ; GFX11-GISEL:       ; %bb.0:
4005 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
4006 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4007 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4008 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
4009 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
4010 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0x4000, v1 op_sel_hi:[0,1]
4011 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
4012 ; GFX11-GISEL-NEXT:    s_nop 0
4013 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4014 ; GFX11-GISEL-NEXT:    s_endpgm
4015   %tid = call i32 @llvm.amdgcn.workitem.id.x()
4016   %tid.ext = sext i32 %tid to i64
4017   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
4018   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
4019   %x = load <2 x i16>, ptr addrspace(1) %gep
4020   %result = add <2 x i16> %x, <i16 16384, i16 16384>
4021   store <2 x i16> %result, ptr addrspace(1) %gep.out
4022   ret void
4025 define amdgpu_kernel void @v_test_v2i16_x_add_neg_negfptwo(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
4026 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4027 ; SI-SDAG:       ; %bb.0:
4028 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4029 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
4030 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
4031 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4032 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
4033 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4034 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
4035 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
4036 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
4037 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
4038 ; SI-SDAG-NEXT:    v_add_i32_e32 v3, vcc, 0xffffc000, v2
4039 ; SI-SDAG-NEXT:    s_mov_b32 s4, 0xffff0000
4040 ; SI-SDAG-NEXT:    v_bfi_b32 v2, s4, v2, v3
4041 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, -2.0, v2
4042 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
4043 ; SI-SDAG-NEXT:    s_endpgm
4045 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4046 ; SI-GISEL:       ; %bb.0:
4047 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4048 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4049 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
4050 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
4051 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
4052 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4053 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
4054 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
4055 ; SI-GISEL-NEXT:    s_movk_i32 s2, 0xc000
4056 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
4057 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
4058 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, s2, v2
4059 ; SI-GISEL-NEXT:    v_add_i32_e32 v3, vcc, s2, v3
4060 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
4061 ; SI-GISEL-NEXT:    v_and_b32_e32 v3, 0xffff, v3
4062 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
4063 ; SI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
4064 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
4065 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
4066 ; SI-GISEL-NEXT:    s_endpgm
4068 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4069 ; VI-SDAG:       ; %bb.0:
4070 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4071 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
4072 ; VI-SDAG-NEXT:    v_mov_b32_e32 v4, 0xffffc000
4073 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4074 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
4075 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
4076 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4077 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
4078 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
4079 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
4080 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4081 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
4082 ; VI-SDAG-NEXT:    v_add_u16_e32 v2, 0xc000, v3
4083 ; VI-SDAG-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4084 ; VI-SDAG-NEXT:    v_or_b32_e32 v2, v2, v3
4085 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
4086 ; VI-SDAG-NEXT:    s_endpgm
4088 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4089 ; VI-GISEL:       ; %bb.0:
4090 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4091 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
4092 ; VI-GISEL-NEXT:    v_mov_b32_e32 v4, 0xffffc000
4093 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4094 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
4095 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
4096 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
4097 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4098 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
4099 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
4100 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
4101 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
4102 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4103 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
4104 ; VI-GISEL-NEXT:    v_add_u16_e32 v2, 0xc000, v3
4105 ; VI-GISEL-NEXT:    v_add_u16_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4106 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, v2, v3
4107 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
4108 ; VI-GISEL-NEXT:    s_endpgm
4110 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4111 ; GFX9-SDAG:       ; %bb.0:
4112 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4113 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4114 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4115 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
4116 ; GFX9-SDAG-NEXT:    s_mov_b32 s2, 0x40004000
4117 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
4118 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, s2
4119 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
4120 ; GFX9-SDAG-NEXT:    s_endpgm
4122 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4123 ; GFX9-GISEL:       ; %bb.0:
4124 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4125 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4126 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xc000c000
4127 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4128 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
4129 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
4130 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
4131 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
4132 ; GFX9-GISEL-NEXT:    s_endpgm
4134 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4135 ; GFX10-SDAG:       ; %bb.0:
4136 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4137 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4138 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4139 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
4140 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
4141 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0x4000 op_sel_hi:[1,0]
4142 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
4143 ; GFX10-SDAG-NEXT:    s_endpgm
4145 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4146 ; GFX10-GISEL:       ; %bb.0:
4147 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4148 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4149 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4150 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
4151 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
4152 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0xc000, v1 op_sel_hi:[0,1]
4153 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
4154 ; GFX10-GISEL-NEXT:    s_endpgm
4156 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4157 ; GFX11-SDAG:       ; %bb.0:
4158 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
4159 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4160 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4161 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
4162 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
4163 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 0x4000 op_sel_hi:[1,0]
4164 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
4165 ; GFX11-SDAG-NEXT:    s_nop 0
4166 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4167 ; GFX11-SDAG-NEXT:    s_endpgm
4169 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg_negfptwo:
4170 ; GFX11-GISEL:       ; %bb.0:
4171 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
4172 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4173 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4174 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
4175 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
4176 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0xc000, v1 op_sel_hi:[0,1]
4177 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
4178 ; GFX11-GISEL-NEXT:    s_nop 0
4179 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4180 ; GFX11-GISEL-NEXT:    s_endpgm
4181   %tid = call i32 @llvm.amdgcn.workitem.id.x()
4182   %tid.ext = sext i32 %tid to i64
4183   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
4184   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
4185   %x = load <2 x i16>, ptr addrspace(1) %gep
4186   %result = add <2 x i16> %x, <i16 -16384, i16 -16384>
4187   store <2 x i16> %result, ptr addrspace(1) %gep.out
4188   ret void
4191 define amdgpu_kernel void @v_test_v2i16_x_add_undef_neg32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
4192 ; SI-SDAG-LABEL: v_test_v2i16_x_add_undef_neg32:
4193 ; SI-SDAG:       ; %bb.0:
4194 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4195 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
4196 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
4197 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4198 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
4199 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4200 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
4201 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
4202 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
4203 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
4204 ; SI-SDAG-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
4205 ; SI-SDAG-NEXT:    v_add_i32_e32 v2, vcc, 0xffe00000, v2
4206 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
4207 ; SI-SDAG-NEXT:    s_endpgm
4209 ; SI-GISEL-LABEL: v_test_v2i16_x_add_undef_neg32:
4210 ; SI-GISEL:       ; %bb.0:
4211 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4212 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4213 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
4214 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
4215 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
4216 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4217 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
4218 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
4219 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
4220 ; SI-GISEL-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4221 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, 0xffffffe0, v2
4222 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
4223 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
4224 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
4225 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
4226 ; SI-GISEL-NEXT:    s_endpgm
4228 ; VI-SDAG-LABEL: v_test_v2i16_x_add_undef_neg32:
4229 ; VI-SDAG:       ; %bb.0:
4230 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4231 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
4232 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4233 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
4234 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
4235 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4236 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
4237 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
4238 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
4239 ; VI-SDAG-NEXT:    v_mov_b32_e32 v2, 32
4240 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4241 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
4242 ; VI-SDAG-NEXT:    v_sub_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4243 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
4244 ; VI-SDAG-NEXT:    s_endpgm
4246 ; VI-GISEL-LABEL: v_test_v2i16_x_add_undef_neg32:
4247 ; VI-GISEL:       ; %bb.0:
4248 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4249 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
4250 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4251 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
4252 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
4253 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
4254 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4255 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
4256 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
4257 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
4258 ; VI-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffffffe0
4259 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
4260 ; VI-GISEL-NEXT:    s_and_b32 s0, 0xffff, s0
4261 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4262 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
4263 ; VI-GISEL-NEXT:    v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4264 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, s0, v2
4265 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
4266 ; VI-GISEL-NEXT:    s_endpgm
4268 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_undef_neg32:
4269 ; GFX9-SDAG:       ; %bb.0:
4270 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4271 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4272 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4273 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
4274 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
4275 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel:[0,1] op_sel_hi:[1,0]
4276 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
4277 ; GFX9-SDAG-NEXT:    s_endpgm
4279 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_undef_neg32:
4280 ; GFX9-GISEL:       ; %bb.0:
4281 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4282 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4283 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4284 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
4285 ; GFX9-GISEL-NEXT:    s_mov_b32 s2, 0xffe00000
4286 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
4287 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, s2
4288 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
4289 ; GFX9-GISEL-NEXT:    s_endpgm
4291 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_undef_neg32:
4292 ; GFX10-SDAG:       ; %bb.0:
4293 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4294 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4295 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4296 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
4297 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
4298 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel:[0,1] op_sel_hi:[1,0]
4299 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
4300 ; GFX10-SDAG-NEXT:    s_endpgm
4302 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_undef_neg32:
4303 ; GFX10-GISEL:       ; %bb.0:
4304 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4305 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4306 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4307 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
4308 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
4309 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, v1, 0xffe0 op_sel:[0,1] op_sel_hi:[1,0]
4310 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
4311 ; GFX10-GISEL-NEXT:    s_endpgm
4313 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_undef_neg32:
4314 ; GFX11-SDAG:       ; %bb.0:
4315 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
4316 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4317 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4318 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
4319 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
4320 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32 op_sel:[0,1] op_sel_hi:[1,0]
4321 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
4322 ; GFX11-SDAG-NEXT:    s_nop 0
4323 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4324 ; GFX11-SDAG-NEXT:    s_endpgm
4326 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_undef_neg32:
4327 ; GFX11-GISEL:       ; %bb.0:
4328 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
4329 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4330 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4331 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
4332 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
4333 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, v1, 0xffe0 op_sel:[0,1] op_sel_hi:[1,0]
4334 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
4335 ; GFX11-GISEL-NEXT:    s_nop 0
4336 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4337 ; GFX11-GISEL-NEXT:    s_endpgm
4338   %tid = call i32 @llvm.amdgcn.workitem.id.x()
4339   %tid.ext = sext i32 %tid to i64
4340   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
4341   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
4342   %x = load <2 x i16>, ptr addrspace(1) %gep
4343   %result = add <2 x i16> %x, <i16 undef, i16 -32>
4344   store <2 x i16> %result, ptr addrspace(1) %gep.out
4345   ret void
4348 define amdgpu_kernel void @v_test_v2i16_x_add_neg32_undef(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
4349 ; SI-SDAG-LABEL: v_test_v2i16_x_add_neg32_undef:
4350 ; SI-SDAG:       ; %bb.0:
4351 ; SI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4352 ; SI-SDAG-NEXT:    s_mov_b32 s7, 0xf000
4353 ; SI-SDAG-NEXT:    s_mov_b32 s6, 0
4354 ; SI-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4355 ; SI-SDAG-NEXT:    v_mov_b32_e32 v1, 0
4356 ; SI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4357 ; SI-SDAG-NEXT:    s_mov_b64 s[4:5], s[2:3]
4358 ; SI-SDAG-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
4359 ; SI-SDAG-NEXT:    s_mov_b64 s[2:3], s[6:7]
4360 ; SI-SDAG-NEXT:    s_waitcnt vmcnt(0)
4361 ; SI-SDAG-NEXT:    v_subrev_i32_e32 v2, vcc, 32, v2
4362 ; SI-SDAG-NEXT:    v_and_b32_e32 v2, 0xffff, v2
4363 ; SI-SDAG-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
4364 ; SI-SDAG-NEXT:    s_endpgm
4366 ; SI-GISEL-LABEL: v_test_v2i16_x_add_neg32_undef:
4367 ; SI-GISEL:       ; %bb.0:
4368 ; SI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4369 ; SI-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4370 ; SI-GISEL-NEXT:    v_mov_b32_e32 v1, 0
4371 ; SI-GISEL-NEXT:    s_mov_b32 s6, 0
4372 ; SI-GISEL-NEXT:    s_mov_b32 s7, 0xf000
4373 ; SI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4374 ; SI-GISEL-NEXT:    s_mov_b64 s[4:5], s[2:3]
4375 ; SI-GISEL-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
4376 ; SI-GISEL-NEXT:    s_waitcnt vmcnt(0)
4377 ; SI-GISEL-NEXT:    v_add_i32_e32 v2, vcc, 0xffffffe0, v2
4378 ; SI-GISEL-NEXT:    v_and_b32_e32 v2, 0xffff, v2
4379 ; SI-GISEL-NEXT:    s_mov_b64 s[2:3], s[6:7]
4380 ; SI-GISEL-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
4381 ; SI-GISEL-NEXT:    s_endpgm
4383 ; VI-SDAG-LABEL: v_test_v2i16_x_add_neg32_undef:
4384 ; VI-SDAG:       ; %bb.0:
4385 ; VI-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4386 ; VI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
4387 ; VI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4388 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s3
4389 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
4390 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4391 ; VI-SDAG-NEXT:    flat_load_dword v3, v[0:1]
4392 ; VI-SDAG-NEXT:    v_mov_b32_e32 v1, s1
4393 ; VI-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
4394 ; VI-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4395 ; VI-SDAG-NEXT:    s_waitcnt vmcnt(0)
4396 ; VI-SDAG-NEXT:    v_subrev_u16_e32 v2, 32, v3
4397 ; VI-SDAG-NEXT:    flat_store_dword v[0:1], v2
4398 ; VI-SDAG-NEXT:    s_endpgm
4400 ; VI-GISEL-LABEL: v_test_v2i16_x_add_neg32_undef:
4401 ; VI-GISEL:       ; %bb.0:
4402 ; VI-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4403 ; VI-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
4404 ; VI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4405 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s2
4406 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s3
4407 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
4408 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4409 ; VI-GISEL-NEXT:    flat_load_dword v3, v[0:1]
4410 ; VI-GISEL-NEXT:    s_and_b32 s2, 0xffff, s0
4411 ; VI-GISEL-NEXT:    v_mov_b32_e32 v0, s0
4412 ; VI-GISEL-NEXT:    v_mov_b32_e32 v1, s1
4413 ; VI-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
4414 ; VI-GISEL-NEXT:    s_lshl_b32 s0, s2, 16
4415 ; VI-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4416 ; VI-GISEL-NEXT:    s_waitcnt vmcnt(0)
4417 ; VI-GISEL-NEXT:    v_add_u16_e32 v2, 0xffe0, v3
4418 ; VI-GISEL-NEXT:    v_or_b32_e32 v2, s0, v2
4419 ; VI-GISEL-NEXT:    flat_store_dword v[0:1], v2
4420 ; VI-GISEL-NEXT:    s_endpgm
4422 ; GFX9-SDAG-LABEL: v_test_v2i16_x_add_neg32_undef:
4423 ; GFX9-SDAG:       ; %bb.0:
4424 ; GFX9-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4425 ; GFX9-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4426 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4427 ; GFX9-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
4428 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
4429 ; GFX9-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32
4430 ; GFX9-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
4431 ; GFX9-SDAG-NEXT:    s_endpgm
4433 ; GFX9-GISEL-LABEL: v_test_v2i16_x_add_neg32_undef:
4434 ; GFX9-GISEL:       ; %bb.0:
4435 ; GFX9-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4436 ; GFX9-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4437 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffffffe0
4438 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4439 ; GFX9-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
4440 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
4441 ; GFX9-GISEL-NEXT:    v_pk_add_u16 v1, v1, v2
4442 ; GFX9-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
4443 ; GFX9-GISEL-NEXT:    s_endpgm
4445 ; GFX10-SDAG-LABEL: v_test_v2i16_x_add_neg32_undef:
4446 ; GFX10-SDAG:       ; %bb.0:
4447 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4448 ; GFX10-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4449 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4450 ; GFX10-SDAG-NEXT:    global_load_dword v1, v0, s[2:3]
4451 ; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0)
4452 ; GFX10-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32
4453 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
4454 ; GFX10-SDAG-NEXT:    s_endpgm
4456 ; GFX10-GISEL-LABEL: v_test_v2i16_x_add_neg32_undef:
4457 ; GFX10-GISEL:       ; %bb.0:
4458 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4459 ; GFX10-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4460 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4461 ; GFX10-GISEL-NEXT:    global_load_dword v1, v0, s[2:3]
4462 ; GFX10-GISEL-NEXT:    s_waitcnt vmcnt(0)
4463 ; GFX10-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1 op_sel_hi:[0,1]
4464 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[0:1]
4465 ; GFX10-GISEL-NEXT:    s_endpgm
4467 ; GFX11-SDAG-LABEL: v_test_v2i16_x_add_neg32_undef:
4468 ; GFX11-SDAG:       ; %bb.0:
4469 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
4470 ; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4471 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
4472 ; GFX11-SDAG-NEXT:    global_load_b32 v1, v0, s[2:3]
4473 ; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0)
4474 ; GFX11-SDAG-NEXT:    v_pk_sub_u16 v1, v1, 32
4475 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
4476 ; GFX11-SDAG-NEXT:    s_nop 0
4477 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4478 ; GFX11-SDAG-NEXT:    s_endpgm
4480 ; GFX11-GISEL-LABEL: v_test_v2i16_x_add_neg32_undef:
4481 ; GFX11-GISEL:       ; %bb.0:
4482 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
4483 ; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4484 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
4485 ; GFX11-GISEL-NEXT:    global_load_b32 v1, v0, s[2:3]
4486 ; GFX11-GISEL-NEXT:    s_waitcnt vmcnt(0)
4487 ; GFX11-GISEL-NEXT:    v_pk_add_u16 v1, 0xffe0, v1 op_sel_hi:[0,1]
4488 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
4489 ; GFX11-GISEL-NEXT:    s_nop 0
4490 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4491 ; GFX11-GISEL-NEXT:    s_endpgm
4492   %tid = call i32 @llvm.amdgcn.workitem.id.x()
4493   %tid.ext = sext i32 %tid to i64
4494   %gep = getelementptr inbounds <2 x i16>, ptr addrspace(1) %in, i64 %tid.ext
4495   %gep.out = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 %tid.ext
4496   %x = load <2 x i16>, ptr addrspace(1) %gep
4497   %result = add <2 x i16> %x, <i16 -32, i16 undef>
4498   store <2 x i16> %result, ptr addrspace(1) %gep.out
4499   ret void
4502 declare i32 @llvm.amdgcn.workitem.id.x() #1
4504 attributes #0 = { nounwind }
4505 attributes #1 = { nounwind readnone }