[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / idot4s.ll
blob698a620965affdeee5a5e96ef68dbcb5cc4e1fa8
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn -mcpu=gfx700 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX7 %s
3 ; RUN: llc -mtriple=amdgcn -mcpu=gfx803 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX8 %s
4 ; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9-NODL %s
5 ; RUN: llc -mtriple=amdgcn -mcpu=gfx906 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9-DL %s
6 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1011 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10-DL %s
7 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1012 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10-DL %s
9 define amdgpu_kernel void @idot4_acc32(<4 x i8> addrspace(1)* %src1,
10 ; GFX7-LABEL: idot4_acc32:
11 ; GFX7:       ; %bb.0: ; %entry
12 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
13 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
14 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
15 ; GFX7-NEXT:    s_mov_b32 s2, -1
16 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
17 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
18 ; GFX7-NEXT:    s_load_dword s5, s[6:7], 0x0
19 ; GFX7-NEXT:    s_load_dword s6, s[0:1], 0x0
20 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
21 ; GFX7-NEXT:    s_sext_i32_i8 s7, s4
22 ; GFX7-NEXT:    s_sext_i32_i8 s8, s5
23 ; GFX7-NEXT:    s_bfe_i32 s10, s5, 0x80008
24 ; GFX7-NEXT:    v_mov_b32_e32 v0, s8
25 ; GFX7-NEXT:    v_mov_b32_e32 v1, s6
26 ; GFX7-NEXT:    s_bfe_i32 s12, s5, 0x80010
27 ; GFX7-NEXT:    v_mad_i32_i24 v0, s7, v0, v1
28 ; GFX7-NEXT:    s_bfe_i32 s9, s4, 0x80008
29 ; GFX7-NEXT:    v_mov_b32_e32 v1, s10
30 ; GFX7-NEXT:    s_bfe_i32 s11, s4, 0x80010
31 ; GFX7-NEXT:    v_mad_i32_i24 v0, s9, v1, v0
32 ; GFX7-NEXT:    v_mov_b32_e32 v1, s12
33 ; GFX7-NEXT:    s_ashr_i32 s5, s5, 24
34 ; GFX7-NEXT:    v_mad_i32_i24 v0, s11, v1, v0
35 ; GFX7-NEXT:    s_ashr_i32 s4, s4, 24
36 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
37 ; GFX7-NEXT:    v_mad_i32_i24 v0, s4, v1, v0
38 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
39 ; GFX7-NEXT:    s_endpgm
41 ; GFX8-LABEL: idot4_acc32:
42 ; GFX8:       ; %bb.0: ; %entry
43 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
44 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
45 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
46 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
47 ; GFX8-NEXT:    s_load_dword s3, s[6:7], 0x0
48 ; GFX8-NEXT:    s_load_dword s4, s[0:1], 0x0
49 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
50 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
51 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
52 ; GFX8-NEXT:    s_sext_i32_i8 s0, s2
53 ; GFX8-NEXT:    s_sext_i32_i8 s1, s3
54 ; GFX8-NEXT:    s_bfe_i32 s6, s3, 0x80008
55 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
56 ; GFX8-NEXT:    v_mov_b32_e32 v3, s4
57 ; GFX8-NEXT:    s_bfe_i32 s8, s3, 0x80010
58 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
59 ; GFX8-NEXT:    s_bfe_i32 s5, s2, 0x80008
60 ; GFX8-NEXT:    v_mov_b32_e32 v3, s6
61 ; GFX8-NEXT:    s_bfe_i32 s7, s2, 0x80010
62 ; GFX8-NEXT:    v_mad_i32_i24 v2, s5, v3, v2
63 ; GFX8-NEXT:    v_mov_b32_e32 v3, s8
64 ; GFX8-NEXT:    s_ashr_i32 s3, s3, 24
65 ; GFX8-NEXT:    v_mad_i32_i24 v2, s7, v3, v2
66 ; GFX8-NEXT:    s_ashr_i32 s2, s2, 24
67 ; GFX8-NEXT:    v_mov_b32_e32 v3, s3
68 ; GFX8-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
69 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
70 ; GFX8-NEXT:    s_endpgm
72 ; GFX9-NODL-LABEL: idot4_acc32:
73 ; GFX9-NODL:       ; %bb.0: ; %entry
74 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
75 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
76 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
77 ; GFX9-NODL-NEXT:    s_load_dword s2, s[4:5], 0x0
78 ; GFX9-NODL-NEXT:    s_load_dword s3, s[6:7], 0x0
79 ; GFX9-NODL-NEXT:    s_load_dword s4, s[0:1], 0x0
80 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, s0
81 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v1, s1
82 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
83 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s0, s2
84 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s1, s3
85 ; GFX9-NODL-NEXT:    s_bfe_i32 s6, s3, 0x80008
86 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v2, s1
87 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s4
88 ; GFX9-NODL-NEXT:    s_bfe_i32 s8, s3, 0x80010
89 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
90 ; GFX9-NODL-NEXT:    s_bfe_i32 s5, s2, 0x80008
91 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s6
92 ; GFX9-NODL-NEXT:    s_bfe_i32 s7, s2, 0x80010
93 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s5, v3, v2
94 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s8
95 ; GFX9-NODL-NEXT:    s_ashr_i32 s3, s3, 24
96 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s7, v3, v2
97 ; GFX9-NODL-NEXT:    s_ashr_i32 s2, s2, 24
98 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s3
99 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
100 ; GFX9-NODL-NEXT:    global_store_dword v[0:1], v2, off
101 ; GFX9-NODL-NEXT:    s_endpgm
103 ; GFX9-DL-LABEL: idot4_acc32:
104 ; GFX9-DL:       ; %bb.0: ; %entry
105 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
106 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
107 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
108 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
109 ; GFX9-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
110 ; GFX9-DL-NEXT:    s_load_dword s4, s[0:1], 0x0
111 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
112 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
113 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
114 ; GFX9-DL-NEXT:    v_mov_b32_e32 v2, s3
115 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s4
116 ; GFX9-DL-NEXT:    v_dot4_i32_i8 v2, s2, v2, v3
117 ; GFX9-DL-NEXT:    global_store_dword v[0:1], v2, off
118 ; GFX9-DL-NEXT:    s_endpgm
120 ; GFX10-DL-LABEL: idot4_acc32:
121 ; GFX10-DL:       ; %bb.0: ; %entry
122 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
123 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
124 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
125 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
126 ; GFX10-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
127 ; GFX10-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
128 ; GFX10-DL-NEXT:    s_load_dword s4, s[0:1], 0x0
129 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
130 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
131 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
132 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, s4
133 ; GFX10-DL-NEXT:    v_dot4_i32_i8 v2, s2, s3, v2
134 ; GFX10-DL-NEXT:    global_store_dword v[0:1], v2, off
135 ; GFX10-DL-NEXT:    s_endpgm
136                                        <4 x i8> addrspace(1)* %src2,
137                                        i32 addrspace(1)* nocapture %dst) {
138 entry:
139   %vec1 = load <4 x i8>, <4 x i8> addrspace(1)* %src1
140   %vec2 = load <4 x i8>, <4 x i8> addrspace(1)* %src2
142   %v1e0 = extractelement <4 x i8> %vec1, i64 0
143   %cv1e0 = sext i8 %v1e0 to i32
144   %v2e0 = extractelement <4 x i8> %vec2, i64 0
145   %cv2e0 = sext i8 %v2e0 to i32
146   %mul1 = mul nuw nsw i32 %cv1e0, %cv2e0
148   %v1e1 = extractelement <4 x i8> %vec1, i64 1
149   %cv1e1 = sext i8 %v1e1 to i32
150   %v2e1 = extractelement <4 x i8> %vec2, i64 1
151   %cv2e1 = sext i8 %v2e1 to i32
152   %mul2 = mul nuw nsw i32 %cv1e1, %cv2e1
154   %v1e2 = extractelement <4 x i8> %vec1, i64 2
155   %cv1e2 = sext i8 %v1e2 to i32
156   %v2e2 = extractelement <4 x i8> %vec2, i64 2
157   %cv2e2 = sext i8 %v2e2 to i32
158   %mul3 = mul nuw nsw i32 %cv1e2, %cv2e2
160   %v1e3 = extractelement <4 x i8> %vec1, i64 3
161   %cv1e3 = sext i8 %v1e3 to i32
162   %v2e3 = extractelement <4 x i8> %vec2, i64 3
163   %cv2e3 = sext i8 %v2e3 to i32
164   %mul4 = mul nuw nsw i32 %cv1e3, %cv2e3
166   %acc = load i32, i32 addrspace(1)* %dst, align 4
167   %add1 = add i32 %mul1, %acc
168   %add2 = add i32 %add1, %mul2
169   %add3 = add i32 %add2, %mul3
170   %add4 = add i32 %add3, %mul4
171   store i32 %add4, i32 addrspace(1)* %dst, align 4
172   ret void
175 ; TODO: Currently, vector elements{0 and 3} get zero_extended from i16 to i32 which should
176 ; be sign_extended directly to i32; prevents the pattern recognizer to recognize this pattern.
177 define amdgpu_kernel void @idot4_acc16(<4 x i8> addrspace(1)* %src1,
178 ; GFX7-LABEL: idot4_acc16:
179 ; GFX7:       ; %bb.0: ; %entry
180 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
181 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
182 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
183 ; GFX7-NEXT:    s_mov_b32 s2, -1
184 ; GFX7-NEXT:    s_mov_b32 s8, 0xffff
185 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
186 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
187 ; GFX7-NEXT:    buffer_load_ushort v0, off, s[0:3], 0
188 ; GFX7-NEXT:    s_load_dword s5, s[6:7], 0x0
189 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
190 ; GFX7-NEXT:    s_sext_i32_i8 s6, s4
191 ; GFX7-NEXT:    s_bfe_i32 s9, s4, 0x80008
192 ; GFX7-NEXT:    s_sext_i32_i8 s7, s5
193 ; GFX7-NEXT:    s_bfe_i32 s10, s5, 0x80008
194 ; GFX7-NEXT:    s_and_b32 s7, s7, s8
195 ; GFX7-NEXT:    s_bfe_i32 s12, s5, 0x80010
196 ; GFX7-NEXT:    s_and_b32 s10, s10, s8
197 ; GFX7-NEXT:    s_and_b32 s6, s6, s8
198 ; GFX7-NEXT:    v_mov_b32_e32 v1, s7
199 ; GFX7-NEXT:    s_bfe_i32 s11, s4, 0x80010
200 ; GFX7-NEXT:    s_ashr_i32 s5, s5, 24
201 ; GFX7-NEXT:    s_and_b32 s12, s12, s8
202 ; GFX7-NEXT:    s_and_b32 s9, s9, s8
203 ; GFX7-NEXT:    v_mov_b32_e32 v2, s10
204 ; GFX7-NEXT:    s_ashr_i32 s4, s4, 24
205 ; GFX7-NEXT:    s_and_b32 s11, s11, s8
206 ; GFX7-NEXT:    s_and_b32 s5, s5, s8
207 ; GFX7-NEXT:    v_mov_b32_e32 v3, s12
208 ; GFX7-NEXT:    s_and_b32 s4, s4, s8
209 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
210 ; GFX7-NEXT:    v_mad_u32_u24 v0, s6, v1, v0
211 ; GFX7-NEXT:    v_mad_u32_u24 v0, s9, v2, v0
212 ; GFX7-NEXT:    v_mad_u32_u24 v0, s11, v3, v0
213 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
214 ; GFX7-NEXT:    v_mad_u32_u24 v0, s4, v1, v0
215 ; GFX7-NEXT:    buffer_store_short v0, off, s[0:3], 0
216 ; GFX7-NEXT:    s_endpgm
218 ; GFX8-LABEL: idot4_acc16:
219 ; GFX8:       ; %bb.0: ; %entry
220 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
221 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
222 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
223 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
224 ; GFX8-NEXT:    s_load_dword s3, s[6:7], 0x0
225 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
226 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
227 ; GFX8-NEXT:    flat_load_ushort v2, v[0:1]
228 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
229 ; GFX8-NEXT:    s_sext_i32_i8 s0, s2
230 ; GFX8-NEXT:    s_sext_i32_i8 s1, s3
231 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
232 ; GFX8-NEXT:    s_bfe_i32 s4, s3, 0x80008
233 ; GFX8-NEXT:    s_bfe_i32 s5, s3, 0x80010
234 ; GFX8-NEXT:    v_mov_b32_e32 v4, s4
235 ; GFX8-NEXT:    s_bfe_i32 s1, s2, 0x80008
236 ; GFX8-NEXT:    s_bfe_i32 s4, s2, 0x80010
237 ; GFX8-NEXT:    s_ashr_i32 s3, s3, 24
238 ; GFX8-NEXT:    v_mov_b32_e32 v5, s5
239 ; GFX8-NEXT:    s_ashr_i32 s2, s2, 24
240 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
241 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
242 ; GFX8-NEXT:    v_mad_i32_i24 v2, s1, v4, v2
243 ; GFX8-NEXT:    v_mad_i32_i24 v2, s4, v5, v2
244 ; GFX8-NEXT:    v_mov_b32_e32 v3, s3
245 ; GFX8-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
246 ; GFX8-NEXT:    flat_store_short v[0:1], v2
247 ; GFX8-NEXT:    s_endpgm
249 ; GFX9-NODL-LABEL: idot4_acc16:
250 ; GFX9-NODL:       ; %bb.0: ; %entry
251 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
252 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
253 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
254 ; GFX9-NODL-NEXT:    s_load_dword s2, s[4:5], 0x0
255 ; GFX9-NODL-NEXT:    s_load_dword s3, s[6:7], 0x0
256 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, s0
257 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v1, s1
258 ; GFX9-NODL-NEXT:    global_load_ushort v2, v[0:1], off
259 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
260 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s0, s2
261 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s1, s3
262 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s1
263 ; GFX9-NODL-NEXT:    s_bfe_i32 s4, s3, 0x80008
264 ; GFX9-NODL-NEXT:    s_bfe_i32 s5, s3, 0x80010
265 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v4, s4
266 ; GFX9-NODL-NEXT:    s_bfe_i32 s1, s2, 0x80008
267 ; GFX9-NODL-NEXT:    s_bfe_i32 s4, s2, 0x80010
268 ; GFX9-NODL-NEXT:    s_ashr_i32 s3, s3, 24
269 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v5, s5
270 ; GFX9-NODL-NEXT:    s_ashr_i32 s2, s2, 24
271 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
272 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
273 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s1, v4, v2
274 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s4, v5, v2
275 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s3
276 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
277 ; GFX9-NODL-NEXT:    global_store_short v[0:1], v2, off
278 ; GFX9-NODL-NEXT:    s_endpgm
280 ; GFX9-DL-LABEL: idot4_acc16:
281 ; GFX9-DL:       ; %bb.0: ; %entry
282 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
283 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
284 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
285 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
286 ; GFX9-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
287 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
288 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
289 ; GFX9-DL-NEXT:    global_load_ushort v2, v[0:1], off
290 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
291 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s3
292 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
293 ; GFX9-DL-NEXT:    v_dot4_i32_i8 v2, s2, v3, v2
294 ; GFX9-DL-NEXT:    global_store_short v[0:1], v2, off
295 ; GFX9-DL-NEXT:    s_endpgm
297 ; GFX10-DL-LABEL: idot4_acc16:
298 ; GFX10-DL:       ; %bb.0: ; %entry
299 ; GFX10-DL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
300 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
301 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
302 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s2
303 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s3
304 ; GFX10-DL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
305 ; GFX10-DL-NEXT:    global_load_ushort v2, v[0:1], off
306 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
307 ; GFX10-DL-NEXT:    s_load_dword s0, s[0:1], 0x0
308 ; GFX10-DL-NEXT:    s_load_dword s1, s[2:3], 0x0
309 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
310 ; GFX10-DL-NEXT:    v_dot4_i32_i8 v2, s0, s1, v2
311 ; GFX10-DL-NEXT:    global_store_short v[0:1], v2, off
312 ; GFX10-DL-NEXT:    s_endpgm
313                                        <4 x i8> addrspace(1)* %src2,
314                                        i16 addrspace(1)* nocapture %dst) {
315 entry:
316   %vec1 = load <4 x i8>, <4 x i8> addrspace(1)* %src1
317   %vec2 = load <4 x i8>, <4 x i8> addrspace(1)* %src2
319   %v1e0 = extractelement <4 x i8> %vec1, i64 0
320   %cv1e0 = sext i8 %v1e0 to i16
321   %v2e0 = extractelement <4 x i8> %vec2, i64 0
322   %cv2e0 = sext i8 %v2e0 to i16
323   %mul1 = mul nsw i16 %cv1e0, %cv2e0
325   %v1e1 = extractelement <4 x i8> %vec1, i64 1
326   %cv1e1 = sext i8 %v1e1 to i16
327   %v2e1 = extractelement <4 x i8> %vec2, i64 1
328   %cv2e1 = sext i8 %v2e1 to i16
329   %mul2 = mul nsw i16 %cv1e1, %cv2e1
331   %v1e2 = extractelement <4 x i8> %vec1, i64 2
332   %cv1e2 = sext i8 %v1e2 to i16
333   %v2e2 = extractelement <4 x i8> %vec2, i64 2
334   %cv2e2 = sext i8 %v2e2 to i16
335   %mul3 = mul nsw i16 %cv1e2, %cv2e2
337   %v1e3 = extractelement <4 x i8> %vec1, i64 3
338   %cv1e3 = sext i8 %v1e3 to i16
339   %v2e3 = extractelement <4 x i8> %vec2, i64 3
340   %cv2e3 = sext i8 %v2e3 to i16
341   %mul4 = mul nsw i16 %cv1e3, %cv2e3
343   %acc = load i16, i16 addrspace(1)* %dst, align 2
344   %add1 = add i16 %mul1, %acc
345   %add2 = add i16 %add1, %mul2
346   %add3 = add i16 %add2, %mul3
347   %add4 = add i16 %add3, %mul4
348   store i16 %add4, i16 addrspace(1)* %dst, align 2
349   ret void
352 define amdgpu_kernel void @idot4_acc8(<4 x i8> addrspace(1)* %src1,
353 ; GFX7-LABEL: idot4_acc8:
354 ; GFX7:       ; %bb.0: ; %entry
355 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
356 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
357 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
358 ; GFX7-NEXT:    s_mov_b32 s2, -1
359 ; GFX7-NEXT:    s_movk_i32 s8, 0xff
360 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
361 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
362 ; GFX7-NEXT:    buffer_load_ubyte v0, off, s[0:3], 0
363 ; GFX7-NEXT:    s_load_dword s5, s[6:7], 0x0
364 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
365 ; GFX7-NEXT:    s_and_b32 s7, s4, s8
366 ; GFX7-NEXT:    s_bfe_u32 s9, s4, 0x80008
367 ; GFX7-NEXT:    s_and_b32 s6, s5, s8
368 ; GFX7-NEXT:    s_bfe_u32 s8, s5, 0x80008
369 ; GFX7-NEXT:    v_mov_b32_e32 v1, s6
370 ; GFX7-NEXT:    s_bfe_u32 s10, s5, 0x80010
371 ; GFX7-NEXT:    v_mov_b32_e32 v2, s8
372 ; GFX7-NEXT:    s_bfe_u32 s11, s4, 0x80010
373 ; GFX7-NEXT:    s_lshr_b32 s5, s5, 24
374 ; GFX7-NEXT:    v_mov_b32_e32 v3, s10
375 ; GFX7-NEXT:    s_lshr_b32 s4, s4, 24
376 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
377 ; GFX7-NEXT:    v_mad_u32_u24 v0, s7, v1, v0
378 ; GFX7-NEXT:    v_mad_u32_u24 v0, s9, v2, v0
379 ; GFX7-NEXT:    v_mad_u32_u24 v0, s11, v3, v0
380 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
381 ; GFX7-NEXT:    v_mad_u32_u24 v0, s4, v1, v0
382 ; GFX7-NEXT:    buffer_store_byte v0, off, s[0:3], 0
383 ; GFX7-NEXT:    s_endpgm
385 ; GFX8-LABEL: idot4_acc8:
386 ; GFX8:       ; %bb.0: ; %entry
387 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
388 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
389 ; GFX8-NEXT:    s_movk_i32 s2, 0xff
390 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
391 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
392 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
393 ; GFX8-NEXT:    flat_load_ubyte v2, v[0:1]
394 ; GFX8-NEXT:    s_load_dword s0, s[4:5], 0x0
395 ; GFX8-NEXT:    s_load_dword s1, s[6:7], 0x0
396 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
397 ; GFX8-NEXT:    s_bfe_u32 s5, s0, 0x80008
398 ; GFX8-NEXT:    s_and_b32 s3, s1, s2
399 ; GFX8-NEXT:    s_bfe_u32 s4, s1, 0x80008
400 ; GFX8-NEXT:    s_and_b32 s2, s0, s2
401 ; GFX8-NEXT:    v_mov_b32_e32 v3, s3
402 ; GFX8-NEXT:    s_bfe_u32 s6, s1, 0x80010
403 ; GFX8-NEXT:    v_mov_b32_e32 v4, s4
404 ; GFX8-NEXT:    s_bfe_u32 s7, s0, 0x80010
405 ; GFX8-NEXT:    s_lshr_b32 s1, s1, 24
406 ; GFX8-NEXT:    v_mov_b32_e32 v5, s6
407 ; GFX8-NEXT:    s_lshr_b32 s0, s0, 24
408 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
409 ; GFX8-NEXT:    v_mad_u32_u24 v2, s2, v3, v2
410 ; GFX8-NEXT:    v_mad_u32_u24 v2, s5, v4, v2
411 ; GFX8-NEXT:    v_mad_u32_u24 v2, s7, v5, v2
412 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
413 ; GFX8-NEXT:    v_mad_u32_u24 v2, s0, v3, v2
414 ; GFX8-NEXT:    flat_store_byte v[0:1], v2
415 ; GFX8-NEXT:    s_endpgm
417 ; GFX9-NODL-LABEL: idot4_acc8:
418 ; GFX9-NODL:       ; %bb.0: ; %entry
419 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
420 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
421 ; GFX9-NODL-NEXT:    s_movk_i32 s2, 0xff
422 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
423 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, s0
424 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v1, s1
425 ; GFX9-NODL-NEXT:    global_load_ubyte v2, v[0:1], off
426 ; GFX9-NODL-NEXT:    s_load_dword s0, s[4:5], 0x0
427 ; GFX9-NODL-NEXT:    s_load_dword s1, s[6:7], 0x0
428 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
429 ; GFX9-NODL-NEXT:    s_bfe_u32 s5, s0, 0x80008
430 ; GFX9-NODL-NEXT:    s_and_b32 s3, s1, s2
431 ; GFX9-NODL-NEXT:    s_bfe_u32 s4, s1, 0x80008
432 ; GFX9-NODL-NEXT:    s_and_b32 s2, s0, s2
433 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s3
434 ; GFX9-NODL-NEXT:    s_bfe_u32 s6, s1, 0x80010
435 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v4, s4
436 ; GFX9-NODL-NEXT:    s_bfe_u32 s7, s0, 0x80010
437 ; GFX9-NODL-NEXT:    s_lshr_b32 s1, s1, 24
438 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v5, s6
439 ; GFX9-NODL-NEXT:    s_lshr_b32 s0, s0, 24
440 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
441 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v2, s2, v3, v2
442 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v2, s5, v4, v2
443 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v2, s7, v5, v2
444 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s1
445 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v2, s0, v3, v2
446 ; GFX9-NODL-NEXT:    global_store_byte v[0:1], v2, off
447 ; GFX9-NODL-NEXT:    s_endpgm
449 ; GFX9-DL-LABEL: idot4_acc8:
450 ; GFX9-DL:       ; %bb.0: ; %entry
451 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
452 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
453 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
454 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
455 ; GFX9-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
456 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
457 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
458 ; GFX9-DL-NEXT:    global_load_ubyte v2, v[0:1], off
459 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
460 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s3
461 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
462 ; GFX9-DL-NEXT:    v_dot4_u32_u8 v2, s2, v3, v2
463 ; GFX9-DL-NEXT:    global_store_byte v[0:1], v2, off
464 ; GFX9-DL-NEXT:    s_endpgm
466 ; GFX10-DL-LABEL: idot4_acc8:
467 ; GFX10-DL:       ; %bb.0: ; %entry
468 ; GFX10-DL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
469 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
470 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
471 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s2
472 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s3
473 ; GFX10-DL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
474 ; GFX10-DL-NEXT:    global_load_ubyte v2, v[0:1], off
475 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
476 ; GFX10-DL-NEXT:    s_load_dword s0, s[0:1], 0x0
477 ; GFX10-DL-NEXT:    s_load_dword s1, s[2:3], 0x0
478 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
479 ; GFX10-DL-NEXT:    v_dot4_u32_u8 v2, s0, s1, v2
480 ; GFX10-DL-NEXT:    global_store_byte v[0:1], v2, off
481 ; GFX10-DL-NEXT:    s_endpgm
482                                       <4 x i8> addrspace(1)* %src2,
483                                       i8 addrspace(1)* nocapture %dst) {
484 entry:
485   %vec1 = load <4 x i8>, <4 x i8> addrspace(1)* %src1
486   %vec2 = load <4 x i8>, <4 x i8> addrspace(1)* %src2
488   %v1e0 = extractelement <4 x i8> %vec1, i64 0
489   %v2e0 = extractelement <4 x i8> %vec2, i64 0
490   %mul1 = mul i8 %v1e0, %v2e0
492   %v1e1 = extractelement <4 x i8> %vec1, i64 1
493   %v2e1 = extractelement <4 x i8> %vec2, i64 1
494   %mul2 = mul i8 %v1e1, %v2e1
496   %v1e2 = extractelement <4 x i8> %vec1, i64 2
497   %v2e2 = extractelement <4 x i8> %vec2, i64 2
498   %mul3 = mul i8 %v1e2, %v2e2
500   %v1e3 = extractelement <4 x i8> %vec1, i64 3
501   %v2e3 = extractelement <4 x i8> %vec2, i64 3
502   %mul4 = mul i8 %v1e3, %v2e3
504   %acc = load i8, i8 addrspace(1)* %dst, align 2
505   %add1 = add i8 %mul1, %acc
506   %add2 = add i8 %add1, %mul2
507   %add3 = add i8 %add2, %mul3
508   %add4 = add nsw i8 %add3, %mul4
509   store i8 %add4, i8 addrspace(1)* %dst, align 2
510   ret void
513 define amdgpu_kernel void @idot4_multiuse_mul1(<4 x i8> addrspace(1)* %src1,
514 ; GFX7-LABEL: idot4_multiuse_mul1:
515 ; GFX7:       ; %bb.0: ; %entry
516 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
517 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
518 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
519 ; GFX7-NEXT:    s_mov_b32 s2, -1
520 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
521 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
522 ; GFX7-NEXT:    s_load_dword s5, s[6:7], 0x0
523 ; GFX7-NEXT:    s_load_dword s6, s[0:1], 0x0
524 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
525 ; GFX7-NEXT:    s_sext_i32_i8 s7, s4
526 ; GFX7-NEXT:    s_sext_i32_i8 s8, s5
527 ; GFX7-NEXT:    s_bfe_i32 s10, s5, 0x80008
528 ; GFX7-NEXT:    v_mov_b32_e32 v0, s8
529 ; GFX7-NEXT:    v_mov_b32_e32 v1, s6
530 ; GFX7-NEXT:    s_bfe_i32 s9, s4, 0x80008
531 ; GFX7-NEXT:    v_mad_i32_i24 v1, s7, v0, v1
532 ; GFX7-NEXT:    v_mov_b32_e32 v2, s10
533 ; GFX7-NEXT:    s_bfe_i32 s12, s5, 0x80010
534 ; GFX7-NEXT:    v_mad_i32_i24 v1, s9, v2, v1
535 ; GFX7-NEXT:    s_bfe_i32 s11, s4, 0x80010
536 ; GFX7-NEXT:    v_mad_i32_i24 v0, s7, v0, v1
537 ; GFX7-NEXT:    v_mov_b32_e32 v1, s12
538 ; GFX7-NEXT:    s_ashr_i32 s5, s5, 24
539 ; GFX7-NEXT:    v_mad_i32_i24 v0, s11, v1, v0
540 ; GFX7-NEXT:    s_ashr_i32 s4, s4, 24
541 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
542 ; GFX7-NEXT:    v_mad_i32_i24 v0, s4, v1, v0
543 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
544 ; GFX7-NEXT:    s_endpgm
546 ; GFX8-LABEL: idot4_multiuse_mul1:
547 ; GFX8:       ; %bb.0: ; %entry
548 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
549 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
550 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
551 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
552 ; GFX8-NEXT:    s_load_dword s3, s[6:7], 0x0
553 ; GFX8-NEXT:    s_load_dword s4, s[0:1], 0x0
554 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
555 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
556 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
557 ; GFX8-NEXT:    s_sext_i32_i8 s0, s2
558 ; GFX8-NEXT:    s_sext_i32_i8 s1, s3
559 ; GFX8-NEXT:    s_bfe_i32 s6, s3, 0x80008
560 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
561 ; GFX8-NEXT:    v_mov_b32_e32 v3, s4
562 ; GFX8-NEXT:    s_bfe_i32 s5, s2, 0x80008
563 ; GFX8-NEXT:    v_mad_i32_i24 v3, s0, v2, v3
564 ; GFX8-NEXT:    v_mov_b32_e32 v4, s6
565 ; GFX8-NEXT:    s_bfe_i32 s8, s3, 0x80010
566 ; GFX8-NEXT:    v_mad_i32_i24 v3, s5, v4, v3
567 ; GFX8-NEXT:    s_bfe_i32 s7, s2, 0x80010
568 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
569 ; GFX8-NEXT:    v_mov_b32_e32 v3, s8
570 ; GFX8-NEXT:    s_ashr_i32 s3, s3, 24
571 ; GFX8-NEXT:    v_mad_i32_i24 v2, s7, v3, v2
572 ; GFX8-NEXT:    s_ashr_i32 s2, s2, 24
573 ; GFX8-NEXT:    v_mov_b32_e32 v3, s3
574 ; GFX8-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
575 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
576 ; GFX8-NEXT:    s_endpgm
578 ; GFX9-NODL-LABEL: idot4_multiuse_mul1:
579 ; GFX9-NODL:       ; %bb.0: ; %entry
580 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
581 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
582 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
583 ; GFX9-NODL-NEXT:    s_load_dword s2, s[4:5], 0x0
584 ; GFX9-NODL-NEXT:    s_load_dword s3, s[6:7], 0x0
585 ; GFX9-NODL-NEXT:    s_load_dword s4, s[0:1], 0x0
586 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, s0
587 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v1, s1
588 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
589 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s0, s2
590 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s1, s3
591 ; GFX9-NODL-NEXT:    s_bfe_i32 s6, s3, 0x80008
592 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v2, s1
593 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s4
594 ; GFX9-NODL-NEXT:    s_bfe_i32 s5, s2, 0x80008
595 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v3, s0, v2, v3
596 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v4, s6
597 ; GFX9-NODL-NEXT:    s_bfe_i32 s8, s3, 0x80010
598 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v3, s5, v4, v3
599 ; GFX9-NODL-NEXT:    s_bfe_i32 s7, s2, 0x80010
600 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
601 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s8
602 ; GFX9-NODL-NEXT:    s_ashr_i32 s3, s3, 24
603 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s7, v3, v2
604 ; GFX9-NODL-NEXT:    s_ashr_i32 s2, s2, 24
605 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s3
606 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
607 ; GFX9-NODL-NEXT:    global_store_dword v[0:1], v2, off
608 ; GFX9-NODL-NEXT:    s_endpgm
610 ; GFX9-DL-LABEL: idot4_multiuse_mul1:
611 ; GFX9-DL:       ; %bb.0: ; %entry
612 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
613 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
614 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
616 ; GFX9-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
617 ; GFX9-DL-NEXT:    s_load_dword s4, s[0:1], 0x0
618 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
619 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
620 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
621 ; GFX9-DL-NEXT:    s_sext_i32_i8 s0, s2
622 ; GFX9-DL-NEXT:    s_sext_i32_i8 s1, s3
623 ; GFX9-DL-NEXT:    s_bfe_i32 s6, s3, 0x80008
624 ; GFX9-DL-NEXT:    v_mov_b32_e32 v2, s1
625 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s4
626 ; GFX9-DL-NEXT:    s_bfe_i32 s5, s2, 0x80008
627 ; GFX9-DL-NEXT:    v_mad_i32_i24 v3, s0, v2, v3
628 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s6
629 ; GFX9-DL-NEXT:    s_bfe_i32 s8, s3, 0x80010
630 ; GFX9-DL-NEXT:    v_mad_i32_i24 v3, s5, v4, v3
631 ; GFX9-DL-NEXT:    s_bfe_i32 s7, s2, 0x80010
632 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
633 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s8
634 ; GFX9-DL-NEXT:    s_ashr_i32 s3, s3, 24
635 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s7, v3, v2
636 ; GFX9-DL-NEXT:    s_ashr_i32 s2, s2, 24
637 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s3
638 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
639 ; GFX9-DL-NEXT:    global_store_dword v[0:1], v2, off
640 ; GFX9-DL-NEXT:    s_endpgm
642 ; GFX10-DL-LABEL: idot4_multiuse_mul1:
643 ; GFX10-DL:       ; %bb.0: ; %entry
644 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
645 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
646 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
647 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
648 ; GFX10-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
649 ; GFX10-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
650 ; GFX10-DL-NEXT:    s_load_dword s4, s[0:1], 0x0
651 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
652 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
653 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
654 ; GFX10-DL-NEXT:    s_sext_i32_i8 s0, s2
655 ; GFX10-DL-NEXT:    s_sext_i32_i8 s1, s3
656 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, s4
657 ; GFX10-DL-NEXT:    s_bfe_i32 s4, s2, 0x80008
658 ; GFX10-DL-NEXT:    s_bfe_i32 s5, s3, 0x80008
659 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s1, v2
660 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s4, s5, v2
661 ; GFX10-DL-NEXT:    s_bfe_i32 s4, s2, 0x80010
662 ; GFX10-DL-NEXT:    s_bfe_i32 s5, s3, 0x80010
663 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s1, v2
664 ; GFX10-DL-NEXT:    s_ashr_i32 s0, s2, 24
665 ; GFX10-DL-NEXT:    s_ashr_i32 s1, s3, 24
666 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s4, s5, v2
667 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s1, v2
668 ; GFX10-DL-NEXT:    global_store_dword v[0:1], v2, off
669 ; GFX10-DL-NEXT:    s_endpgm
670                                                <4 x i8> addrspace(1)* %src2,
671                                                i32 addrspace(1)* nocapture %dst) {
672 entry:
673   %vec1 = load <4 x i8>, <4 x i8> addrspace(1)* %src1
674   %vec2 = load <4 x i8>, <4 x i8> addrspace(1)* %src2
676   %v1e0 = extractelement <4 x i8> %vec1, i64 0
677   %cv1e0 = sext i8 %v1e0 to i32
678   %v2e0 = extractelement <4 x i8> %vec2, i64 0
679   %cv2e0 = sext i8 %v2e0 to i32
680   %mul1 = mul nuw nsw i32 %cv1e0, %cv2e0
682   %v1e1 = extractelement <4 x i8> %vec1, i64 1
683   %cv1e1 = sext i8 %v1e1 to i32
684   %v2e1 = extractelement <4 x i8> %vec2, i64 1
685   %cv2e1 = sext i8 %v2e1 to i32
686   %mul2 = mul nuw nsw i32 %cv1e1, %cv2e1
688   %v1e2 = extractelement <4 x i8> %vec1, i64 2
689   %cv1e2 = sext i8 %v1e2 to i32
690   %v2e2 = extractelement <4 x i8> %vec2, i64 2
691   %cv2e2 = sext i8 %v2e2 to i32
692   %mul3 = mul nuw nsw i32 %cv1e2, %cv2e2
694   %v1e3 = extractelement <4 x i8> %vec1, i64 3
695   %cv1e3 = sext i8 %v1e3 to i32
696   %v2e3 = extractelement <4 x i8> %vec2, i64 3
697   %cv2e3 = sext i8 %v2e3 to i32
698   %mul4 = mul nuw nsw i32 %cv1e3, %cv2e3
700   %acc = load i32, i32 addrspace(1)* %dst, align 4
701   %add = add i32 %mul1, %acc
702   %add1 = add i32 %mul2, %add
703   %add2 = add i32 %add1, %mul1
704   %add3 = add i32 %add2, %mul3
705   %add4 = add i32 %add3, %mul4
707   store i32 %add4, i32 addrspace(1)* %dst, align 4
708   ret void
711 ; TODO: Support this pattern.
712 define amdgpu_kernel void @idot4_acc32_vecMul(<4 x i8> addrspace(1)* %src1,
713 ; GFX7-LABEL: idot4_acc32_vecMul:
714 ; GFX7:       ; %bb.0: ; %entry
715 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
716 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
717 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
718 ; GFX7-NEXT:    s_mov_b32 s2, -1
719 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
720 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
721 ; GFX7-NEXT:    s_load_dword s5, s[6:7], 0x0
722 ; GFX7-NEXT:    s_load_dword s6, s[0:1], 0x0
723 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
724 ; GFX7-NEXT:    s_ashr_i32 s7, s4, 24
725 ; GFX7-NEXT:    s_ashr_i32 s10, s5, 24
726 ; GFX7-NEXT:    s_bfe_i32 s11, s5, 0x80010
727 ; GFX7-NEXT:    s_bfe_i32 s12, s5, 0x80008
728 ; GFX7-NEXT:    s_sext_i32_i8 s5, s5
729 ; GFX7-NEXT:    s_bfe_i32 s8, s4, 0x80010
730 ; GFX7-NEXT:    s_bfe_i32 s9, s4, 0x80008
731 ; GFX7-NEXT:    s_sext_i32_i8 s4, s4
732 ; GFX7-NEXT:    v_mov_b32_e32 v0, s5
733 ; GFX7-NEXT:    v_mov_b32_e32 v1, s6
734 ; GFX7-NEXT:    v_mad_i32_i24 v0, s4, v0, v1
735 ; GFX7-NEXT:    v_mov_b32_e32 v1, s12
736 ; GFX7-NEXT:    v_mad_i32_i24 v0, s9, v1, v0
737 ; GFX7-NEXT:    v_mov_b32_e32 v1, s11
738 ; GFX7-NEXT:    v_mad_i32_i24 v0, s8, v1, v0
739 ; GFX7-NEXT:    v_mov_b32_e32 v1, s10
740 ; GFX7-NEXT:    v_mad_i32_i24 v0, s7, v1, v0
741 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
742 ; GFX7-NEXT:    s_endpgm
744 ; GFX8-LABEL: idot4_acc32_vecMul:
745 ; GFX8:       ; %bb.0: ; %entry
746 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
747 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
748 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
749 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
750 ; GFX8-NEXT:    s_load_dword s3, s[6:7], 0x0
751 ; GFX8-NEXT:    s_load_dword s4, s[0:1], 0x0
752 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
753 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
754 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
755 ; GFX8-NEXT:    v_lshrrev_b16_e64 v2, 8, s2
756 ; GFX8-NEXT:    v_lshrrev_b16_e64 v3, 8, s3
757 ; GFX8-NEXT:    s_ashr_i32 s5, s3, 24
758 ; GFX8-NEXT:    s_bfe_i32 s6, s3, 0x80010
759 ; GFX8-NEXT:    s_sext_i32_i8 s3, s3
760 ; GFX8-NEXT:    s_ashr_i32 s0, s2, 24
761 ; GFX8-NEXT:    s_bfe_i32 s1, s2, 0x80010
762 ; GFX8-NEXT:    s_sext_i32_i8 s2, s2
763 ; GFX8-NEXT:    v_mov_b32_e32 v4, s3
764 ; GFX8-NEXT:    v_mov_b32_e32 v5, s4
765 ; GFX8-NEXT:    v_bfe_i32 v2, v2, 0, 8
766 ; GFX8-NEXT:    v_bfe_i32 v3, v3, 0, 8
767 ; GFX8-NEXT:    v_mad_i32_i24 v4, s2, v4, v5
768 ; GFX8-NEXT:    v_mad_i32_i24 v2, v2, v3, v4
769 ; GFX8-NEXT:    v_mov_b32_e32 v3, s6
770 ; GFX8-NEXT:    v_mad_i32_i24 v2, s1, v3, v2
771 ; GFX8-NEXT:    v_mov_b32_e32 v3, s5
772 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
773 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
774 ; GFX8-NEXT:    s_endpgm
776 ; GFX9-NODL-LABEL: idot4_acc32_vecMul:
777 ; GFX9-NODL:       ; %bb.0: ; %entry
778 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
779 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
780 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
781 ; GFX9-NODL-NEXT:    s_load_dword s2, s[4:5], 0x0
782 ; GFX9-NODL-NEXT:    s_load_dword s3, s[6:7], 0x0
783 ; GFX9-NODL-NEXT:    s_load_dword s4, s[0:1], 0x0
784 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, s0
785 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v1, s1
786 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
787 ; GFX9-NODL-NEXT:    v_lshrrev_b16_e64 v2, 8, s2
788 ; GFX9-NODL-NEXT:    v_lshrrev_b16_e64 v3, 8, s3
789 ; GFX9-NODL-NEXT:    s_ashr_i32 s5, s3, 24
790 ; GFX9-NODL-NEXT:    s_bfe_i32 s6, s3, 0x80010
791 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s3, s3
792 ; GFX9-NODL-NEXT:    s_ashr_i32 s0, s2, 24
793 ; GFX9-NODL-NEXT:    s_bfe_i32 s1, s2, 0x80010
794 ; GFX9-NODL-NEXT:    s_sext_i32_i8 s2, s2
795 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v4, s3
796 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v5, s4
797 ; GFX9-NODL-NEXT:    v_bfe_i32 v2, v2, 0, 8
798 ; GFX9-NODL-NEXT:    v_bfe_i32 v3, v3, 0, 8
799 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v4, s2, v4, v5
800 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, v2, v3, v4
801 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s6
802 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s1, v3, v2
803 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v3, s5
804 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
805 ; GFX9-NODL-NEXT:    global_store_dword v[0:1], v2, off
806 ; GFX9-NODL-NEXT:    s_endpgm
808 ; GFX9-DL-LABEL: idot4_acc32_vecMul:
809 ; GFX9-DL:       ; %bb.0: ; %entry
810 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
811 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
812 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
813 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
814 ; GFX9-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
815 ; GFX9-DL-NEXT:    s_load_dword s4, s[0:1], 0x0
816 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
817 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
818 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
819 ; GFX9-DL-NEXT:    v_lshrrev_b16_e64 v2, 8, s2
820 ; GFX9-DL-NEXT:    v_lshrrev_b16_e64 v3, 8, s3
821 ; GFX9-DL-NEXT:    s_ashr_i32 s5, s3, 24
822 ; GFX9-DL-NEXT:    s_bfe_i32 s6, s3, 0x80010
823 ; GFX9-DL-NEXT:    s_sext_i32_i8 s3, s3
824 ; GFX9-DL-NEXT:    s_ashr_i32 s0, s2, 24
825 ; GFX9-DL-NEXT:    s_bfe_i32 s1, s2, 0x80010
826 ; GFX9-DL-NEXT:    s_sext_i32_i8 s2, s2
827 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s3
828 ; GFX9-DL-NEXT:    v_mov_b32_e32 v5, s4
829 ; GFX9-DL-NEXT:    v_bfe_i32 v2, v2, 0, 8
830 ; GFX9-DL-NEXT:    v_bfe_i32 v3, v3, 0, 8
831 ; GFX9-DL-NEXT:    v_mad_i32_i24 v4, s2, v4, v5
832 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, v2, v3, v4
833 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s6
834 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s1, v3, v2
835 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s5
836 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
837 ; GFX9-DL-NEXT:    global_store_dword v[0:1], v2, off
838 ; GFX9-DL-NEXT:    s_endpgm
840 ; GFX10-DL-LABEL: idot4_acc32_vecMul:
841 ; GFX10-DL:       ; %bb.0: ; %entry
842 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
843 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
844 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
845 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
846 ; GFX10-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
847 ; GFX10-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
848 ; GFX10-DL-NEXT:    s_load_dword s4, s[0:1], 0x0
849 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
850 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
851 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
852 ; GFX10-DL-NEXT:    v_lshrrev_b16_e64 v2, 8, s2
853 ; GFX10-DL-NEXT:    v_lshrrev_b16_e64 v3, 8, s3
854 ; GFX10-DL-NEXT:    v_mov_b32_e32 v4, s4
855 ; GFX10-DL-NEXT:    s_sext_i32_i8 s0, s2
856 ; GFX10-DL-NEXT:    s_sext_i32_i8 s1, s3
857 ; GFX10-DL-NEXT:    v_bfe_i32 v2, v2, 0, 8
858 ; GFX10-DL-NEXT:    v_bfe_i32 v3, v3, 0, 8
859 ; GFX10-DL-NEXT:    s_bfe_i32 s4, s2, 0x80010
860 ; GFX10-DL-NEXT:    s_bfe_i32 s5, s3, 0x80010
861 ; GFX10-DL-NEXT:    v_mad_i32_i24 v4, s0, s1, v4
862 ; GFX10-DL-NEXT:    s_ashr_i32 s0, s2, 24
863 ; GFX10-DL-NEXT:    s_ashr_i32 s1, s3, 24
864 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, v2, v3, v4
865 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s4, s5, v2
866 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s1, v2
867 ; GFX10-DL-NEXT:    global_store_dword v[0:1], v2, off
868 ; GFX10-DL-NEXT:    s_endpgm
869                                               <4 x i8> addrspace(1)* %src2,
870                                               i32 addrspace(1)* nocapture %dst) {
871 entry:
872   %vec1 = load <4 x i8>, <4 x i8> addrspace(1)* %src1
873   %vec2 = load <4 x i8>, <4 x i8> addrspace(1)* %src2
875   %cvec1 = sext <4 x i8> %vec1 to <4 x i32>
876   %cvec2 = sext <4 x i8> %vec2 to <4 x i32>
878   %mul = mul <4 x i32> %cvec1, %cvec2
879   %mul0 = extractelement <4 x i32> %mul, i64 0
880   %mul1 = extractelement <4 x i32> %mul, i64 1
881   %mul2 = extractelement <4 x i32> %mul, i64 2
882   %mul3 = extractelement <4 x i32> %mul, i64 3
884   %acc = load i32, i32 addrspace(1)* %dst, align 4
885   %add1 = add i32 %mul0, %acc
886   %add2 = add i32 %add1, %mul1
887   %add3 = add i32 %add2, %mul2
888   %add4 = add i32 %add3, %mul3
890   store i32 %add4, i32 addrspace(1)* %dst, align 4
891   ret void
894 define amdgpu_kernel void @idot4_acc16_vecMul(<4 x i8> addrspace(1)* %src1,
895 ; GFX7-LABEL: idot4_acc16_vecMul:
896 ; GFX7:       ; %bb.0: ; %entry
897 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
898 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
899 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
900 ; GFX7-NEXT:    s_mov_b32 s2, -1
901 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
902 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
903 ; GFX7-NEXT:    buffer_load_ushort v0, off, s[0:3], 0
904 ; GFX7-NEXT:    s_load_dword s5, s[6:7], 0x0
905 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
906 ; GFX7-NEXT:    s_ashr_i32 s6, s4, 24
907 ; GFX7-NEXT:    s_bfe_i32 s7, s4, 0x80010
908 ; GFX7-NEXT:    s_bfe_i32 s10, s5, 0x80010
909 ; GFX7-NEXT:    s_bfe_i32 s11, s5, 0x80008
910 ; GFX7-NEXT:    s_ashr_i32 s9, s5, 24
911 ; GFX7-NEXT:    s_sext_i32_i8 s5, s5
912 ; GFX7-NEXT:    s_bfe_i32 s8, s4, 0x80008
913 ; GFX7-NEXT:    s_sext_i32_i8 s4, s4
914 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
915 ; GFX7-NEXT:    v_mov_b32_e32 v2, s11
916 ; GFX7-NEXT:    v_mov_b32_e32 v3, s10
917 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
918 ; GFX7-NEXT:    v_mad_i32_i24 v0, s4, v1, v0
919 ; GFX7-NEXT:    v_mad_i32_i24 v0, s8, v2, v0
920 ; GFX7-NEXT:    v_mad_i32_i24 v0, s7, v3, v0
921 ; GFX7-NEXT:    v_mov_b32_e32 v1, s9
922 ; GFX7-NEXT:    v_mad_i32_i24 v0, s6, v1, v0
923 ; GFX7-NEXT:    buffer_store_short v0, off, s[0:3], 0
924 ; GFX7-NEXT:    s_endpgm
926 ; GFX8-LABEL: idot4_acc16_vecMul:
927 ; GFX8:       ; %bb.0: ; %entry
928 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
929 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
930 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
931 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
932 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
933 ; GFX8-NEXT:    flat_load_ushort v2, v[0:1]
934 ; GFX8-NEXT:    s_load_dword s1, s[4:5], 0x0
935 ; GFX8-NEXT:    s_load_dword s2, s[6:7], 0x0
936 ; GFX8-NEXT:    s_mov_b32 s0, 0xffff
937 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
938 ; GFX8-NEXT:    s_lshr_b32 s3, s1, 16
939 ; GFX8-NEXT:    s_bfe_i32 s6, s2, 0x80000
940 ; GFX8-NEXT:    s_lshr_b32 s4, s2, 16
941 ; GFX8-NEXT:    s_bfe_i32 s5, s1, 0x80000
942 ; GFX8-NEXT:    v_ashrrev_i16_e64 v4, 8, s1
943 ; GFX8-NEXT:    s_bfe_i32 s1, s3, 0x80000
944 ; GFX8-NEXT:    v_ashrrev_i16_e64 v6, 8, s3
945 ; GFX8-NEXT:    s_and_b32 s3, s0, s6
946 ; GFX8-NEXT:    v_ashrrev_i16_e64 v3, 8, s2
947 ; GFX8-NEXT:    s_bfe_i32 s2, s4, 0x80000
948 ; GFX8-NEXT:    v_ashrrev_i16_e64 v5, 8, s4
949 ; GFX8-NEXT:    s_and_b32 s4, s0, s5
950 ; GFX8-NEXT:    v_mov_b32_e32 v7, s3
951 ; GFX8-NEXT:    s_and_b32 s2, s0, s2
952 ; GFX8-NEXT:    s_and_b32 s0, s0, s1
953 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
954 ; GFX8-NEXT:    v_mad_u32_u24 v2, s4, v7, v2
955 ; GFX8-NEXT:    v_mad_u32_u24 v2, v4, v3, v2
956 ; GFX8-NEXT:    v_mov_b32_e32 v3, s2
957 ; GFX8-NEXT:    v_mad_u32_u24 v2, s0, v3, v2
958 ; GFX8-NEXT:    v_mad_u32_u24 v2, v6, v5, v2
959 ; GFX8-NEXT:    flat_store_short v[0:1], v2
960 ; GFX8-NEXT:    s_endpgm
962 ; GFX9-NODL-LABEL: idot4_acc16_vecMul:
963 ; GFX9-NODL:       ; %bb.0: ; %entry
964 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
965 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
966 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v4, 0xffff
967 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
968 ; GFX9-NODL-NEXT:    s_load_dword s2, s[4:5], 0x0
969 ; GFX9-NODL-NEXT:    s_load_dword s3, s[6:7], 0x0
970 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
971 ; GFX9-NODL-NEXT:    s_lshr_b32 s4, s2, 16
972 ; GFX9-NODL-NEXT:    s_lshr_b32 s5, s3, 16
973 ; GFX9-NODL-NEXT:    v_ashrrev_i16_e64 v3, 8, s5
974 ; GFX9-NODL-NEXT:    s_bfe_i32 s5, s5, 0x80000
975 ; GFX9-NODL-NEXT:    v_ashrrev_i16_e64 v2, 8, s4
976 ; GFX9-NODL-NEXT:    v_and_b32_e32 v5, s5, v4
977 ; GFX9-NODL-NEXT:    s_bfe_i32 s4, s4, 0x80000
978 ; GFX9-NODL-NEXT:    v_lshl_or_b32 v3, v3, 16, v5
979 ; GFX9-NODL-NEXT:    v_and_b32_e32 v5, s4, v4
980 ; GFX9-NODL-NEXT:    v_lshl_or_b32 v2, v2, 16, v5
981 ; GFX9-NODL-NEXT:    v_ashrrev_i16_e64 v1, 8, s3
982 ; GFX9-NODL-NEXT:    s_bfe_i32 s3, s3, 0x80000
983 ; GFX9-NODL-NEXT:    v_ashrrev_i16_e64 v0, 8, s2
984 ; GFX9-NODL-NEXT:    v_pk_mul_lo_u16 v2, v2, v3
985 ; GFX9-NODL-NEXT:    v_and_b32_e32 v3, s3, v4
986 ; GFX9-NODL-NEXT:    s_bfe_i32 s2, s2, 0x80000
987 ; GFX9-NODL-NEXT:    v_lshl_or_b32 v1, v1, 16, v3
988 ; GFX9-NODL-NEXT:    v_and_b32_e32 v3, s2, v4
989 ; GFX9-NODL-NEXT:    v_lshl_or_b32 v0, v0, 16, v3
990 ; GFX9-NODL-NEXT:    v_pk_mul_lo_u16 v3, v0, v1
991 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, s0
992 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v1, s1
993 ; GFX9-NODL-NEXT:    global_load_ushort v4, v[0:1], off
994 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
995 ; GFX9-NODL-NEXT:    v_add_u32_e32 v4, v3, v4
996 ; GFX9-NODL-NEXT:    v_add_u32_sdwa v3, v4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
997 ; GFX9-NODL-NEXT:    v_add_u32_e32 v3, v3, v2
998 ; GFX9-NODL-NEXT:    v_add_u32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
999 ; GFX9-NODL-NEXT:    global_store_short v[0:1], v2, off
1000 ; GFX9-NODL-NEXT:    s_endpgm
1002 ; GFX9-DL-LABEL: idot4_acc16_vecMul:
1003 ; GFX9-DL:       ; %bb.0: ; %entry
1004 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1005 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1006 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, 0xffff
1007 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1008 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
1009 ; GFX9-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
1010 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1011 ; GFX9-DL-NEXT:    s_lshr_b32 s4, s2, 16
1012 ; GFX9-DL-NEXT:    s_lshr_b32 s5, s3, 16
1013 ; GFX9-DL-NEXT:    v_ashrrev_i16_e64 v3, 8, s5
1014 ; GFX9-DL-NEXT:    s_bfe_i32 s5, s5, 0x80000
1015 ; GFX9-DL-NEXT:    v_ashrrev_i16_e64 v2, 8, s4
1016 ; GFX9-DL-NEXT:    v_and_b32_e32 v5, s5, v4
1017 ; GFX9-DL-NEXT:    s_bfe_i32 s4, s4, 0x80000
1018 ; GFX9-DL-NEXT:    v_lshl_or_b32 v3, v3, 16, v5
1019 ; GFX9-DL-NEXT:    v_and_b32_e32 v5, s4, v4
1020 ; GFX9-DL-NEXT:    v_lshl_or_b32 v2, v2, 16, v5
1021 ; GFX9-DL-NEXT:    v_ashrrev_i16_e64 v1, 8, s3
1022 ; GFX9-DL-NEXT:    s_bfe_i32 s3, s3, 0x80000
1023 ; GFX9-DL-NEXT:    v_ashrrev_i16_e64 v0, 8, s2
1024 ; GFX9-DL-NEXT:    v_pk_mul_lo_u16 v2, v2, v3
1025 ; GFX9-DL-NEXT:    v_and_b32_e32 v3, s3, v4
1026 ; GFX9-DL-NEXT:    s_bfe_i32 s2, s2, 0x80000
1027 ; GFX9-DL-NEXT:    v_lshl_or_b32 v1, v1, 16, v3
1028 ; GFX9-DL-NEXT:    v_and_b32_e32 v3, s2, v4
1029 ; GFX9-DL-NEXT:    v_lshl_or_b32 v0, v0, 16, v3
1030 ; GFX9-DL-NEXT:    v_pk_mul_lo_u16 v3, v0, v1
1031 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
1032 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
1033 ; GFX9-DL-NEXT:    global_load_ushort v4, v[0:1], off
1034 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
1035 ; GFX9-DL-NEXT:    v_add_u32_e32 v4, v3, v4
1036 ; GFX9-DL-NEXT:    v_add_u32_sdwa v3, v4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1037 ; GFX9-DL-NEXT:    v_add_u32_e32 v3, v3, v2
1038 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1039 ; GFX9-DL-NEXT:    global_store_short v[0:1], v2, off
1040 ; GFX9-DL-NEXT:    s_endpgm
1042 ; GFX10-DL-LABEL: idot4_acc16_vecMul:
1043 ; GFX10-DL:       ; %bb.0: ; %entry
1044 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1045 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1046 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0xffff
1047 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
1048 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1049 ; GFX10-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
1050 ; GFX10-DL-NEXT:    s_load_dword s3, s[6:7], 0x0
1051 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
1052 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
1053 ; GFX10-DL-NEXT:    global_load_ushort v3, v[0:1], off
1054 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1055 ; GFX10-DL-NEXT:    s_bfe_i32 s0, s2, 0x80000
1056 ; GFX10-DL-NEXT:    s_bfe_i32 s1, s3, 0x80000
1057 ; GFX10-DL-NEXT:    s_lshr_b32 s4, s2, 16
1058 ; GFX10-DL-NEXT:    s_lshr_b32 s5, s3, 16
1059 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v4, 8, s2
1060 ; GFX10-DL-NEXT:    v_and_b32_e32 v7, s0, v2
1061 ; GFX10-DL-NEXT:    v_and_b32_e32 v6, s1, v2
1062 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v5, 8, s3
1063 ; GFX10-DL-NEXT:    s_bfe_i32 s0, s4, 0x80000
1064 ; GFX10-DL-NEXT:    s_bfe_i32 s1, s5, 0x80000
1065 ; GFX10-DL-NEXT:    v_lshl_or_b32 v4, v4, 16, v7
1066 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v8, 8, s4
1067 ; GFX10-DL-NEXT:    v_lshl_or_b32 v5, v5, 16, v6
1068 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v6, 8, s5
1069 ; GFX10-DL-NEXT:    v_and_b32_e32 v7, s1, v2
1070 ; GFX10-DL-NEXT:    v_and_b32_e32 v2, s0, v2
1071 ; GFX10-DL-NEXT:    v_pk_mul_lo_u16 v4, v4, v5
1072 ; GFX10-DL-NEXT:    v_lshl_or_b32 v5, v6, 16, v7
1073 ; GFX10-DL-NEXT:    v_lshl_or_b32 v2, v8, 16, v2
1074 ; GFX10-DL-NEXT:    v_pk_mul_lo_u16 v2, v2, v5
1075 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
1076 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v3, v4, v3
1077 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v3, v3, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1078 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v3, v3, v2
1079 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1080 ; GFX10-DL-NEXT:    global_store_short v[0:1], v2, off
1081 ; GFX10-DL-NEXT:    s_endpgm
1082                                               <4 x i8> addrspace(1)* %src2,
1083                                               i16 addrspace(1)* nocapture %dst) {
1084 entry:
1085   %vec1 = load <4 x i8>, <4 x i8> addrspace(1)* %src1
1086   %vec2 = load <4 x i8>, <4 x i8> addrspace(1)* %src2
1088   %cvec1 = sext <4 x i8> %vec1 to <4 x i16>
1089   %cvec2 = sext <4 x i8> %vec2 to <4 x i16>
1091   %mul = mul <4 x i16> %cvec1, %cvec2
1092   %mul0 = extractelement <4 x i16> %mul, i64 0
1093   %mul1 = extractelement <4 x i16> %mul, i64 1
1094   %mul2 = extractelement <4 x i16> %mul, i64 2
1095   %mul3 = extractelement <4 x i16> %mul, i64 3
1097   %acc = load i16, i16 addrspace(1)* %dst, align 4
1098   %add1 = add i16 %mul0, %acc
1099   %add2 = add i16 %add1, %mul1
1100   %add3 = add i16 %add2, %mul2
1101   %add4 = add i16 %add3, %mul3
1103   store i16 %add4, i16 addrspace(1)* %dst, align 4
1104   ret void