[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / idot8s.ll
blobe41f5fe6b6a3bdabb312f56b5e4d96dbc514a3f2
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 %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 @idot8_acc32(<8 x i4> addrspace(1)* %src1,
10 ; GFX7-LABEL: idot8_acc32:
11 ; GFX7:       ; %bb.0: ; %entry
12 ; GFX7-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
13 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
14 ; GFX7-NEXT:    s_mov_b32 s7, 0xf000
15 ; GFX7-NEXT:    s_mov_b32 s6, -1
16 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
17 ; GFX7-NEXT:    s_load_dword s0, s[8:9], 0x0
18 ; GFX7-NEXT:    s_load_dword s1, s[10:11], 0x0
19 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
20 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
21 ; GFX7-NEXT:    s_bfe_i32 s8, s0, 0x40000
22 ; GFX7-NEXT:    s_bfe_i32 s9, s1, 0x40000
23 ; GFX7-NEXT:    s_bfe_i32 s11, s1, 0x40004
24 ; GFX7-NEXT:    v_mov_b32_e32 v0, s9
25 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
26 ; GFX7-NEXT:    v_mad_i32_i24 v0, s8, v0, v1
27 ; GFX7-NEXT:    s_bfe_i32 s10, s0, 0x40004
28 ; GFX7-NEXT:    v_mov_b32_e32 v1, s11
29 ; GFX7-NEXT:    s_bfe_i32 s13, s1, 0x40008
30 ; GFX7-NEXT:    v_mad_i32_i24 v0, s10, v1, v0
31 ; GFX7-NEXT:    s_bfe_i32 s12, s0, 0x40008
32 ; GFX7-NEXT:    v_mov_b32_e32 v1, s13
33 ; GFX7-NEXT:    s_bfe_i32 s15, s1, 0x4000c
34 ; GFX7-NEXT:    v_mad_i32_i24 v0, s12, v1, v0
35 ; GFX7-NEXT:    s_bfe_i32 s14, s0, 0x4000c
36 ; GFX7-NEXT:    v_mov_b32_e32 v1, s15
37 ; GFX7-NEXT:    s_bfe_i32 s17, s1, 0x40010
38 ; GFX7-NEXT:    v_mad_i32_i24 v0, s14, v1, v0
39 ; GFX7-NEXT:    s_bfe_i32 s16, s0, 0x40010
40 ; GFX7-NEXT:    v_mov_b32_e32 v1, s17
41 ; GFX7-NEXT:    s_bfe_i32 s19, s1, 0x40014
42 ; GFX7-NEXT:    s_bfe_i32 s21, s1, 0x40018
43 ; GFX7-NEXT:    v_mad_i32_i24 v0, s16, v1, v0
44 ; GFX7-NEXT:    s_bfe_i32 s18, s0, 0x40014
45 ; GFX7-NEXT:    v_mov_b32_e32 v1, s19
46 ; GFX7-NEXT:    s_bfe_i32 s20, s0, 0x40018
47 ; GFX7-NEXT:    v_mad_i32_i24 v0, s18, v1, v0
48 ; GFX7-NEXT:    v_mov_b32_e32 v1, s21
49 ; GFX7-NEXT:    s_ashr_i32 s1, s1, 28
50 ; GFX7-NEXT:    v_mad_i32_i24 v0, s20, v1, v0
51 ; GFX7-NEXT:    s_ashr_i32 s0, s0, 28
52 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
53 ; GFX7-NEXT:    v_mad_i32_i24 v0, s0, v1, v0
54 ; GFX7-NEXT:    buffer_store_dword v0, off, s[4:7], 0
55 ; GFX7-NEXT:    s_endpgm
57 ; GFX8-LABEL: idot8_acc32:
58 ; GFX8:       ; %bb.0: ; %entry
59 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
60 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
61 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
62 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
63 ; GFX8-NEXT:    s_load_dword s4, s[6:7], 0x0
64 ; GFX8-NEXT:    s_load_dword s5, s[0:1], 0x0
65 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
66 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
67 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
68 ; GFX8-NEXT:    s_bfe_i32 s0, s2, 0x40000
69 ; GFX8-NEXT:    s_bfe_i32 s1, s4, 0x40000
70 ; GFX8-NEXT:    s_bfe_i32 s7, s4, 0x40004
71 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
72 ; GFX8-NEXT:    v_mov_b32_e32 v3, s5
73 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
74 ; GFX8-NEXT:    s_bfe_i32 s6, s2, 0x40004
75 ; GFX8-NEXT:    v_mov_b32_e32 v3, s7
76 ; GFX8-NEXT:    s_bfe_i32 s9, s4, 0x40008
77 ; GFX8-NEXT:    v_mad_i32_i24 v2, s6, v3, v2
78 ; GFX8-NEXT:    s_bfe_i32 s8, s2, 0x40008
79 ; GFX8-NEXT:    v_mov_b32_e32 v3, s9
80 ; GFX8-NEXT:    s_bfe_i32 s11, s4, 0x4000c
81 ; GFX8-NEXT:    v_mad_i32_i24 v2, s8, v3, v2
82 ; GFX8-NEXT:    s_bfe_i32 s10, s2, 0x4000c
83 ; GFX8-NEXT:    v_mov_b32_e32 v3, s11
84 ; GFX8-NEXT:    s_bfe_i32 s13, s4, 0x40010
85 ; GFX8-NEXT:    v_mad_i32_i24 v2, s10, v3, v2
86 ; GFX8-NEXT:    s_bfe_i32 s12, s2, 0x40010
87 ; GFX8-NEXT:    v_mov_b32_e32 v3, s13
88 ; GFX8-NEXT:    s_bfe_i32 s15, s4, 0x40014
89 ; GFX8-NEXT:    s_bfe_i32 s17, s4, 0x40018
90 ; GFX8-NEXT:    v_mad_i32_i24 v2, s12, v3, v2
91 ; GFX8-NEXT:    s_bfe_i32 s14, s2, 0x40014
92 ; GFX8-NEXT:    v_mov_b32_e32 v3, s15
93 ; GFX8-NEXT:    s_bfe_i32 s16, s2, 0x40018
94 ; GFX8-NEXT:    v_mad_i32_i24 v2, s14, v3, v2
95 ; GFX8-NEXT:    v_mov_b32_e32 v3, s17
96 ; GFX8-NEXT:    s_ashr_i32 s4, s4, 28
97 ; GFX8-NEXT:    v_mad_i32_i24 v2, s16, v3, v2
98 ; GFX8-NEXT:    s_ashr_i32 s2, s2, 28
99 ; GFX8-NEXT:    v_mov_b32_e32 v3, s4
100 ; GFX8-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
101 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
102 ; GFX8-NEXT:    s_endpgm
104 ; GFX9-LABEL: idot8_acc32:
105 ; GFX9:       ; %bb.0: ; %entry
106 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
107 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
108 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
109 ; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x0
110 ; GFX9-NEXT:    s_load_dword s4, s[6:7], 0x0
111 ; GFX9-NEXT:    s_load_dword s5, s[0:1], 0x0
112 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
113 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
114 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
115 ; GFX9-NEXT:    s_bfe_i32 s0, s2, 0x40000
116 ; GFX9-NEXT:    s_bfe_i32 s1, s4, 0x40000
117 ; GFX9-NEXT:    s_bfe_i32 s7, s4, 0x40004
118 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
119 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
120 ; GFX9-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
121 ; GFX9-NEXT:    s_bfe_i32 s6, s2, 0x40004
122 ; GFX9-NEXT:    v_mov_b32_e32 v3, s7
123 ; GFX9-NEXT:    s_bfe_i32 s9, s4, 0x40008
124 ; GFX9-NEXT:    v_mad_i32_i24 v2, s6, v3, v2
125 ; GFX9-NEXT:    s_bfe_i32 s8, s2, 0x40008
126 ; GFX9-NEXT:    v_mov_b32_e32 v3, s9
127 ; GFX9-NEXT:    s_bfe_i32 s11, s4, 0x4000c
128 ; GFX9-NEXT:    v_mad_i32_i24 v2, s8, v3, v2
129 ; GFX9-NEXT:    s_bfe_i32 s10, s2, 0x4000c
130 ; GFX9-NEXT:    v_mov_b32_e32 v3, s11
131 ; GFX9-NEXT:    s_bfe_i32 s13, s4, 0x40010
132 ; GFX9-NEXT:    v_mad_i32_i24 v2, s10, v3, v2
133 ; GFX9-NEXT:    s_bfe_i32 s12, s2, 0x40010
134 ; GFX9-NEXT:    v_mov_b32_e32 v3, s13
135 ; GFX9-NEXT:    s_bfe_i32 s15, s4, 0x40014
136 ; GFX9-NEXT:    s_bfe_i32 s17, s4, 0x40018
137 ; GFX9-NEXT:    v_mad_i32_i24 v2, s12, v3, v2
138 ; GFX9-NEXT:    s_bfe_i32 s14, s2, 0x40014
139 ; GFX9-NEXT:    v_mov_b32_e32 v3, s15
140 ; GFX9-NEXT:    s_bfe_i32 s16, s2, 0x40018
141 ; GFX9-NEXT:    v_mad_i32_i24 v2, s14, v3, v2
142 ; GFX9-NEXT:    v_mov_b32_e32 v3, s17
143 ; GFX9-NEXT:    s_ashr_i32 s4, s4, 28
144 ; GFX9-NEXT:    v_mad_i32_i24 v2, s16, v3, v2
145 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 28
146 ; GFX9-NEXT:    v_mov_b32_e32 v3, s4
147 ; GFX9-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
148 ; GFX9-NEXT:    global_store_dword v[0:1], v2, off
149 ; GFX9-NEXT:    s_endpgm
151 ; GFX9-DL-LABEL: idot8_acc32:
152 ; GFX9-DL:       ; %bb.0: ; %entry
153 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
154 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
155 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
156 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
157 ; GFX9-DL-NEXT:    s_load_dword s4, s[6:7], 0x0
158 ; GFX9-DL-NEXT:    s_load_dword s5, s[0:1], 0x0
159 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
160 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
161 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
162 ; GFX9-DL-NEXT:    v_mov_b32_e32 v2, s4
163 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s5
164 ; GFX9-DL-NEXT:    v_dot8_i32_i4 v2, s2, v2, v3
165 ; GFX9-DL-NEXT:    global_store_dword v[0:1], v2, off
166 ; GFX9-DL-NEXT:    s_endpgm
168 ; GFX10-DL-LABEL: idot8_acc32:
169 ; GFX10-DL:       ; %bb.0: ; %entry
170 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
171 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
172 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
173 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
174 ; GFX10-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
175 ; GFX10-DL-NEXT:    s_load_dword s4, s[6:7], 0x0
176 ; GFX10-DL-NEXT:    s_load_dword s5, s[0:1], 0x0
177 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
178 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
179 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
180 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, s5
181 ; GFX10-DL-NEXT:    v_dot8_i32_i4 v2, s2, s4, v2
182 ; GFX10-DL-NEXT:    global_store_dword v[0:1], v2, off
183 ; GFX10-DL-NEXT:    s_endpgm
184                                        <8 x i4> addrspace(1)* %src2,
185                                        i32 addrspace(1)* nocapture %dst) {
186 entry:
187   %vec1 = load <8 x i4>, <8 x i4> addrspace(1)* %src1
188   %vec2 = load <8 x i4>, <8 x i4> addrspace(1)* %src2
190   %v1e0 = extractelement <8 x i4> %vec1, i64 0
191   %cv1e0 = sext i4 %v1e0 to i32
192   %v2e0 = extractelement <8 x i4> %vec2, i64 0
193   %cv2e0 = sext i4 %v2e0 to i32
194   %mul0 = mul nuw nsw i32 %cv1e0, %cv2e0
196   %v1e1 = extractelement <8 x i4> %vec1, i64 1
197   %cv1e1 = sext i4 %v1e1 to i32
198   %v2e1 = extractelement <8 x i4> %vec2, i64 1
199   %cv2e1 = sext i4 %v2e1 to i32
200   %mul1 = mul nuw nsw i32 %cv1e1, %cv2e1
202   %v1e2 = extractelement <8 x i4> %vec1, i64 2
203   %cv1e2 = sext i4 %v1e2 to i32
204   %v2e2 = extractelement <8 x i4> %vec2, i64 2
205   %cv2e2 = sext i4 %v2e2 to i32
206   %mul2 = mul nuw nsw i32 %cv1e2, %cv2e2
208   %v1e3 = extractelement <8 x i4> %vec1, i64 3
209   %cv1e3 = sext i4 %v1e3 to i32
210   %v2e3 = extractelement <8 x i4> %vec2, i64 3
211   %cv2e3 = sext i4 %v2e3 to i32
212   %mul3 = mul nuw nsw i32 %cv1e3, %cv2e3
214   %v1e4 = extractelement <8 x i4> %vec1, i64 4
215   %cv1e4 = sext i4 %v1e4 to i32
216   %v2e4 = extractelement <8 x i4> %vec2, i64 4
217   %cv2e4 = sext i4 %v2e4 to i32
218   %mul4 = mul nuw nsw i32 %cv1e4, %cv2e4
220   %v1e5 = extractelement <8 x i4> %vec1, i64 5
221   %cv1e5 = sext i4 %v1e5 to i32
222   %v2e5 = extractelement <8 x i4> %vec2, i64 5
223   %cv2e5 = sext i4 %v2e5 to i32
224   %mul5 = mul nuw nsw i32 %cv1e5, %cv2e5
226   %v1e6 = extractelement <8 x i4> %vec1, i64 6
227   %cv1e6 = sext i4 %v1e6 to i32
228   %v2e6 = extractelement <8 x i4> %vec2, i64 6
229   %cv2e6 = sext i4 %v2e6 to i32
230   %mul6 = mul nuw nsw i32 %cv1e6, %cv2e6
232   %v1e7 = extractelement <8 x i4> %vec1, i64 7
233   %cv1e7 = sext i4 %v1e7 to i32
234   %v2e7 = extractelement <8 x i4> %vec2, i64 7
235   %cv2e7 = sext i4 %v2e7 to i32
236   %mul7 = mul nuw nsw i32 %cv1e7, %cv2e7
238   %acc = load i32, i32 addrspace(1)* %dst, align 4
239   %add1 = add i32 %mul0, %acc
240   %add2 = add i32 %add1, %mul1
241   %add3 = add i32 %add2, %mul2
242   %add4 = add i32 %add3, %mul3
243   %add5 = add i32 %add4, %mul4
244   %add6 = add i32 %add5, %mul5
245   %add7 = add i32 %add6, %mul6
246   %add8 = add i32 %add7, %mul7
248   store i32 %add8, i32 addrspace(1)* %dst, align 4
249   ret void
252 ; TODO: Once the unnecessary zero extentions of the elements are removed;
253 ; pattern recognizer will kick in.
254 define amdgpu_kernel void @idot8_acc16(<8 x i4> addrspace(1)* %src1,
255 ; GFX7-LABEL: idot8_acc16:
256 ; GFX7:       ; %bb.0: ; %entry
257 ; GFX7-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
258 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
259 ; GFX7-NEXT:    s_mov_b32 s7, 0xf000
260 ; GFX7-NEXT:    s_mov_b32 s6, -1
261 ; GFX7-NEXT:    s_mov_b32 s0, 0xffff
262 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
263 ; GFX7-NEXT:    s_load_dword s1, s[8:9], 0x0
264 ; GFX7-NEXT:    buffer_load_ushort v0, off, s[4:7], 0
265 ; GFX7-NEXT:    s_load_dword s2, s[10:11], 0x0
266 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
267 ; GFX7-NEXT:    s_bfe_i32 s8, s1, 0x40000
268 ; GFX7-NEXT:    s_bfe_i32 s10, s1, 0x40004
269 ; GFX7-NEXT:    s_bfe_i32 s9, s2, 0x40000
270 ; GFX7-NEXT:    s_bfe_i32 s11, s2, 0x40004
271 ; GFX7-NEXT:    s_and_b32 s9, s9, s0
272 ; GFX7-NEXT:    s_bfe_i32 s13, s2, 0x40008
273 ; GFX7-NEXT:    s_and_b32 s11, s11, s0
274 ; GFX7-NEXT:    s_and_b32 s8, s8, s0
275 ; GFX7-NEXT:    v_mov_b32_e32 v1, s9
276 ; GFX7-NEXT:    s_bfe_i32 s12, s1, 0x40008
277 ; GFX7-NEXT:    s_bfe_i32 s15, s2, 0x4000c
278 ; GFX7-NEXT:    s_and_b32 s13, s13, s0
279 ; GFX7-NEXT:    s_and_b32 s10, s10, s0
280 ; GFX7-NEXT:    v_mov_b32_e32 v2, s11
281 ; GFX7-NEXT:    s_bfe_i32 s14, s1, 0x4000c
282 ; GFX7-NEXT:    s_bfe_i32 s17, s2, 0x40010
283 ; GFX7-NEXT:    s_and_b32 s15, s15, s0
284 ; GFX7-NEXT:    s_and_b32 s12, s12, s0
285 ; GFX7-NEXT:    v_mov_b32_e32 v3, s13
286 ; GFX7-NEXT:    s_bfe_i32 s16, s1, 0x40010
287 ; GFX7-NEXT:    s_bfe_i32 s19, s2, 0x40014
288 ; GFX7-NEXT:    s_and_b32 s17, s17, s0
289 ; GFX7-NEXT:    s_and_b32 s14, s14, s0
290 ; GFX7-NEXT:    v_mov_b32_e32 v4, s15
291 ; GFX7-NEXT:    s_bfe_i32 s21, s2, 0x40018
292 ; GFX7-NEXT:    s_bfe_i32 s18, s1, 0x40014
293 ; GFX7-NEXT:    s_and_b32 s19, s19, s0
294 ; GFX7-NEXT:    s_and_b32 s16, s16, s0
295 ; GFX7-NEXT:    v_mov_b32_e32 v5, s17
296 ; GFX7-NEXT:    s_bfe_i32 s20, s1, 0x40018
297 ; GFX7-NEXT:    s_ashr_i32 s2, s2, 28
298 ; GFX7-NEXT:    s_and_b32 s21, s21, s0
299 ; GFX7-NEXT:    s_and_b32 s18, s18, s0
300 ; GFX7-NEXT:    v_mov_b32_e32 v6, s19
301 ; GFX7-NEXT:    s_ashr_i32 s1, s1, 28
302 ; GFX7-NEXT:    s_and_b32 s20, s20, s0
303 ; GFX7-NEXT:    s_and_b32 s2, s2, s0
304 ; GFX7-NEXT:    v_mov_b32_e32 v7, s21
305 ; GFX7-NEXT:    s_and_b32 s0, s1, s0
306 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
307 ; GFX7-NEXT:    v_mad_u32_u24 v0, s8, v1, v0
308 ; GFX7-NEXT:    v_mad_u32_u24 v0, s10, v2, v0
309 ; GFX7-NEXT:    v_mad_u32_u24 v0, s12, v3, v0
310 ; GFX7-NEXT:    v_mad_u32_u24 v0, s14, v4, v0
311 ; GFX7-NEXT:    v_mad_u32_u24 v0, s16, v5, v0
312 ; GFX7-NEXT:    v_mad_u32_u24 v0, s18, v6, v0
313 ; GFX7-NEXT:    v_mad_u32_u24 v0, s20, v7, v0
314 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
315 ; GFX7-NEXT:    v_mad_u32_u24 v0, s0, v1, v0
316 ; GFX7-NEXT:    buffer_store_short v0, off, s[4:7], 0
317 ; GFX7-NEXT:    s_endpgm
319 ; GFX8-LABEL: idot8_acc16:
320 ; GFX8:       ; %bb.0: ; %entry
321 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
322 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
323 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
324 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
325 ; GFX8-NEXT:    s_load_dword s4, s[6:7], 0x0
326 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
327 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
328 ; GFX8-NEXT:    flat_load_ushort v2, v[0:1]
329 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
330 ; GFX8-NEXT:    s_bfe_i32 s0, s2, 0x40000
331 ; GFX8-NEXT:    s_bfe_i32 s1, s4, 0x40000
332 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
333 ; GFX8-NEXT:    s_bfe_i32 s5, s4, 0x40004
334 ; GFX8-NEXT:    s_bfe_i32 s6, s4, 0x40008
335 ; GFX8-NEXT:    s_lshr_b32 s1, s2, 12
336 ; GFX8-NEXT:    s_lshr_b32 s7, s4, 12
337 ; GFX8-NEXT:    s_bfe_i32 s8, s2, 0x40004
338 ; GFX8-NEXT:    s_bfe_i32 s9, s2, 0x40008
339 ; GFX8-NEXT:    v_mov_b32_e32 v4, s6
340 ; GFX8-NEXT:    v_mov_b32_e32 v7, s5
341 ; GFX8-NEXT:    v_lshlrev_b16_e64 v5, 12, s1
342 ; GFX8-NEXT:    v_lshlrev_b16_e64 v6, 12, s7
343 ; GFX8-NEXT:    v_mul_i32_i24_e32 v4, s9, v4
344 ; GFX8-NEXT:    s_bfe_i32 s10, s4, 0x40010
345 ; GFX8-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
346 ; GFX8-NEXT:    v_ashrrev_i16_e32 v6, 12, v6
347 ; GFX8-NEXT:    s_bfe_i32 s12, s4, 0x40014
348 ; GFX8-NEXT:    s_bfe_i32 s11, s2, 0x40010
349 ; GFX8-NEXT:    v_mov_b32_e32 v8, s10
350 ; GFX8-NEXT:    s_bfe_i32 s14, s4, 0x40018
351 ; GFX8-NEXT:    s_bfe_i32 s13, s2, 0x40014
352 ; GFX8-NEXT:    v_mov_b32_e32 v9, s12
353 ; GFX8-NEXT:    s_bfe_i32 s15, s2, 0x40018
354 ; GFX8-NEXT:    s_ashr_i32 s4, s4, 28
355 ; GFX8-NEXT:    v_mov_b32_e32 v10, s14
356 ; GFX8-NEXT:    s_ashr_i32 s2, s2, 28
357 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
358 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
359 ; GFX8-NEXT:    v_mad_i32_i24 v2, s8, v7, v2
360 ; GFX8-NEXT:    v_add_u32_sdwa v2, vcc, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
361 ; GFX8-NEXT:    v_mad_u32_u24 v2, v5, v6, v2
362 ; GFX8-NEXT:    v_mad_i32_i24 v2, s11, v8, v2
363 ; GFX8-NEXT:    v_mad_i32_i24 v2, s13, v9, v2
364 ; GFX8-NEXT:    v_mad_i32_i24 v2, s15, v10, v2
365 ; GFX8-NEXT:    v_mov_b32_e32 v3, s4
366 ; GFX8-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
367 ; GFX8-NEXT:    flat_store_short v[0:1], v2
368 ; GFX8-NEXT:    s_endpgm
370 ; GFX9-LABEL: idot8_acc16:
371 ; GFX9:       ; %bb.0: ; %entry
372 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
373 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
374 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
375 ; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x0
376 ; GFX9-NEXT:    s_load_dword s4, s[6:7], 0x0
377 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
378 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
379 ; GFX9-NEXT:    global_load_ushort v2, v[0:1], off
380 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
381 ; GFX9-NEXT:    s_bfe_i32 s0, s2, 0x40000
382 ; GFX9-NEXT:    s_bfe_i32 s1, s4, 0x40000
383 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
384 ; GFX9-NEXT:    s_bfe_i32 s5, s4, 0x40004
385 ; GFX9-NEXT:    s_bfe_i32 s6, s4, 0x40008
386 ; GFX9-NEXT:    s_lshr_b32 s1, s2, 12
387 ; GFX9-NEXT:    s_lshr_b32 s7, s4, 12
388 ; GFX9-NEXT:    s_bfe_i32 s8, s2, 0x40004
389 ; GFX9-NEXT:    s_bfe_i32 s9, s2, 0x40008
390 ; GFX9-NEXT:    v_mov_b32_e32 v4, s6
391 ; GFX9-NEXT:    v_mov_b32_e32 v7, s5
392 ; GFX9-NEXT:    v_lshlrev_b16_e64 v5, 12, s1
393 ; GFX9-NEXT:    v_lshlrev_b16_e64 v6, 12, s7
394 ; GFX9-NEXT:    v_mul_i32_i24_e32 v4, s9, v4
395 ; GFX9-NEXT:    s_bfe_i32 s10, s4, 0x40010
396 ; GFX9-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
397 ; GFX9-NEXT:    v_ashrrev_i16_e32 v6, 12, v6
398 ; GFX9-NEXT:    s_bfe_i32 s12, s4, 0x40014
399 ; GFX9-NEXT:    s_bfe_i32 s11, s2, 0x40010
400 ; GFX9-NEXT:    v_mov_b32_e32 v8, s10
401 ; GFX9-NEXT:    s_bfe_i32 s14, s4, 0x40018
402 ; GFX9-NEXT:    s_bfe_i32 s13, s2, 0x40014
403 ; GFX9-NEXT:    v_mov_b32_e32 v9, s12
404 ; GFX9-NEXT:    s_bfe_i32 s15, s2, 0x40018
405 ; GFX9-NEXT:    s_ashr_i32 s4, s4, 28
406 ; GFX9-NEXT:    v_mov_b32_e32 v10, s14
407 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 28
408 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
409 ; GFX9-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
410 ; GFX9-NEXT:    v_mad_i32_i24 v2, s8, v7, v2
411 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
412 ; GFX9-NEXT:    v_mad_u32_u24 v2, v5, v6, v2
413 ; GFX9-NEXT:    v_mad_i32_i24 v2, s11, v8, v2
414 ; GFX9-NEXT:    v_mad_i32_i24 v2, s13, v9, v2
415 ; GFX9-NEXT:    v_mad_i32_i24 v2, s15, v10, v2
416 ; GFX9-NEXT:    v_mov_b32_e32 v3, s4
417 ; GFX9-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
418 ; GFX9-NEXT:    global_store_short v[0:1], v2, off
419 ; GFX9-NEXT:    s_endpgm
421 ; GFX9-DL-LABEL: idot8_acc16:
422 ; GFX9-DL:       ; %bb.0: ; %entry
423 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
424 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
425 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
426 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
427 ; GFX9-DL-NEXT:    s_load_dword s4, s[6:7], 0x0
428 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
429 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
430 ; GFX9-DL-NEXT:    global_load_ushort v2, v[0:1], off
431 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
432 ; GFX9-DL-NEXT:    s_bfe_i32 s0, s2, 0x40000
433 ; GFX9-DL-NEXT:    s_bfe_i32 s1, s4, 0x40000
434 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s1
435 ; GFX9-DL-NEXT:    s_bfe_i32 s5, s4, 0x40004
436 ; GFX9-DL-NEXT:    s_bfe_i32 s6, s4, 0x40008
437 ; GFX9-DL-NEXT:    s_lshr_b32 s1, s2, 12
438 ; GFX9-DL-NEXT:    s_lshr_b32 s7, s4, 12
439 ; GFX9-DL-NEXT:    s_bfe_i32 s8, s2, 0x40004
440 ; GFX9-DL-NEXT:    s_bfe_i32 s9, s2, 0x40008
441 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s6
442 ; GFX9-DL-NEXT:    v_mov_b32_e32 v7, s5
443 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v5, 12, s1
444 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v6, 12, s7
445 ; GFX9-DL-NEXT:    v_mul_i32_i24_e32 v4, s9, v4
446 ; GFX9-DL-NEXT:    s_bfe_i32 s10, s4, 0x40010
447 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
448 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v6, 12, v6
449 ; GFX9-DL-NEXT:    s_bfe_i32 s12, s4, 0x40014
450 ; GFX9-DL-NEXT:    s_bfe_i32 s11, s2, 0x40010
451 ; GFX9-DL-NEXT:    v_mov_b32_e32 v8, s10
452 ; GFX9-DL-NEXT:    s_bfe_i32 s14, s4, 0x40018
453 ; GFX9-DL-NEXT:    s_bfe_i32 s13, s2, 0x40014
454 ; GFX9-DL-NEXT:    v_mov_b32_e32 v9, s12
455 ; GFX9-DL-NEXT:    s_bfe_i32 s15, s2, 0x40018
456 ; GFX9-DL-NEXT:    s_ashr_i32 s4, s4, 28
457 ; GFX9-DL-NEXT:    v_mov_b32_e32 v10, s14
458 ; GFX9-DL-NEXT:    s_ashr_i32 s2, s2, 28
459 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
460 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
461 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s8, v7, v2
462 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
463 ; GFX9-DL-NEXT:    v_mad_u32_u24 v2, v5, v6, v2
464 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s11, v8, v2
465 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s13, v9, v2
466 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s15, v10, v2
467 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s4
468 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s2, v3, v2
469 ; GFX9-DL-NEXT:    global_store_short v[0:1], v2, off
470 ; GFX9-DL-NEXT:    s_endpgm
472 ; GFX10-DL-LABEL: idot8_acc16:
473 ; GFX10-DL:       ; %bb.0: ; %entry
474 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
475 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
476 ; GFX10-DL-NEXT:    s_mov_b32 s2, 0xffff
477 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
478 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
479 ; GFX10-DL-NEXT:    s_load_dword s4, s[4:5], 0x0
480 ; GFX10-DL-NEXT:    s_load_dword s5, s[6:7], 0x0
481 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
482 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
483 ; GFX10-DL-NEXT:    global_load_ushort v2, v[0:1], off
484 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
485 ; GFX10-DL-NEXT:    s_lshr_b32 s0, s4, 12
486 ; GFX10-DL-NEXT:    s_lshr_b32 s1, s5, 12
487 ; GFX10-DL-NEXT:    s_bfe_i32 s6, s4, 0x40000
488 ; GFX10-DL-NEXT:    s_bfe_i32 s7, s5, 0x40000
489 ; GFX10-DL-NEXT:    s_bfe_i32 s8, s4, 0x40004
490 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v3, 12, s0
491 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v4, 12, s1
492 ; GFX10-DL-NEXT:    s_bfe_i32 s9, s5, 0x40004
493 ; GFX10-DL-NEXT:    s_bfe_i32 s10, s4, 0x40008
494 ; GFX10-DL-NEXT:    s_bfe_i32 s11, s5, 0x40008
495 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v3, 12, v3
496 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v4, 12, v4
497 ; GFX10-DL-NEXT:    s_bfe_i32 s0, s4, 0x40010
498 ; GFX10-DL-NEXT:    s_bfe_i32 s1, s5, 0x40010
499 ; GFX10-DL-NEXT:    v_mul_i32_i24_e64 v5, s10, s11
500 ; GFX10-DL-NEXT:    v_and_b32_e32 v3, s2, v3
501 ; GFX10-DL-NEXT:    v_and_b32_e32 v4, s2, v4
502 ; GFX10-DL-NEXT:    s_bfe_i32 s10, s4, 0x40014
503 ; GFX10-DL-NEXT:    s_bfe_i32 s11, s5, 0x40014
504 ; GFX10-DL-NEXT:    s_bfe_i32 s12, s4, 0x40018
505 ; GFX10-DL-NEXT:    s_bfe_i32 s2, s5, 0x40018
506 ; GFX10-DL-NEXT:    s_ashr_i32 s4, s4, 28
507 ; GFX10-DL-NEXT:    s_ashr_i32 s5, s5, 28
508 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
509 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s6, s7, v2
510 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s8, s9, v2
511 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
512 ; GFX10-DL-NEXT:    v_mad_u32_u24 v2, v3, v4, v2
513 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s1, v2
514 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s10, s11, v2
515 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s12, s2, v2
516 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s4, s5, v2
517 ; GFX10-DL-NEXT:    global_store_short v[0:1], v2, off
518 ; GFX10-DL-NEXT:    s_endpgm
519                                        <8 x i4> addrspace(1)* %src2,
520                                        i16 addrspace(1)* nocapture %dst) {
521 entry:
522   %vec1 = load <8 x i4>, <8 x i4> addrspace(1)* %src1
523   %vec2 = load <8 x i4>, <8 x i4> addrspace(1)* %src2
525   %v1e0 = extractelement <8 x i4> %vec1, i64 0
526   %cv1e0 = sext i4 %v1e0 to i16
527   %v2e0 = extractelement <8 x i4> %vec2, i64 0
528   %cv2e0 = sext i4 %v2e0 to i16
529   %mul0 = mul nuw nsw i16 %cv1e0, %cv2e0
531   %v1e1 = extractelement <8 x i4> %vec1, i64 1
532   %cv1e1 = sext i4 %v1e1 to i16
533   %v2e1 = extractelement <8 x i4> %vec2, i64 1
534   %cv2e1 = sext i4 %v2e1 to i16
535   %mul1 = mul nuw nsw i16 %cv1e1, %cv2e1
537   %v1e2 = extractelement <8 x i4> %vec1, i64 2
538   %cv1e2 = sext i4 %v1e2 to i16
539   %v2e2 = extractelement <8 x i4> %vec2, i64 2
540   %cv2e2 = sext i4 %v2e2 to i16
541   %mul2 = mul nuw nsw i16 %cv1e2, %cv2e2
543   %v1e3 = extractelement <8 x i4> %vec1, i64 3
544   %cv1e3 = sext i4 %v1e3 to i16
545   %v2e3 = extractelement <8 x i4> %vec2, i64 3
546   %cv2e3 = sext i4 %v2e3 to i16
547   %mul3 = mul nuw nsw i16 %cv1e3, %cv2e3
549   %v1e4 = extractelement <8 x i4> %vec1, i64 4
550   %cv1e4 = sext i4 %v1e4 to i16
551   %v2e4 = extractelement <8 x i4> %vec2, i64 4
552   %cv2e4 = sext i4 %v2e4 to i16
553   %mul4 = mul nuw nsw i16 %cv1e4, %cv2e4
555   %v1e5 = extractelement <8 x i4> %vec1, i64 5
556   %cv1e5 = sext i4 %v1e5 to i16
557   %v2e5 = extractelement <8 x i4> %vec2, i64 5
558   %cv2e5 = sext i4 %v2e5 to i16
559   %mul5 = mul nuw nsw i16 %cv1e5, %cv2e5
561   %v1e6 = extractelement <8 x i4> %vec1, i64 6
562   %cv1e6 = sext i4 %v1e6 to i16
563   %v2e6 = extractelement <8 x i4> %vec2, i64 6
564   %cv2e6 = sext i4 %v2e6 to i16
565   %mul6 = mul nuw nsw i16 %cv1e6, %cv2e6
567   %v1e7 = extractelement <8 x i4> %vec1, i64 7
568   %cv1e7 = sext i4 %v1e7 to i16
569   %v2e7 = extractelement <8 x i4> %vec2, i64 7
570   %cv2e7 = sext i4 %v2e7 to i16
571   %mul7 = mul nuw nsw i16 %cv1e7, %cv2e7
573   %acc = load i16, i16 addrspace(1)* %dst, align 4
574   %add1 = add i16 %mul0, %acc
575   %add2 = add i16 %add1, %mul1
576   %add3 = add i16 %add2, %mul2
577   %add4 = add i16 %add3, %mul3
578   %add5 = add i16 %add4, %mul4
579   %add6 = add i16 %add5, %mul5
580   %add7 = add i16 %add6, %mul6
581   %add8 = add i16 %add7, %mul7
583   store i16 %add8, i16 addrspace(1)* %dst, align 4
584   ret void
587 ; TODO: Support this pattern.
588 define amdgpu_kernel void @idot8_acc8(<8 x i4> addrspace(1)* %src1,
589 ; GFX7-LABEL: idot8_acc8:
590 ; GFX7:       ; %bb.0: ; %entry
591 ; GFX7-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
592 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
593 ; GFX7-NEXT:    s_mov_b32 s7, 0xf000
594 ; GFX7-NEXT:    s_mov_b32 s6, -1
595 ; GFX7-NEXT:    s_movk_i32 s0, 0xff
596 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
597 ; GFX7-NEXT:    s_load_dword s1, s[8:9], 0x0
598 ; GFX7-NEXT:    buffer_load_ubyte v0, off, s[4:7], 0
599 ; GFX7-NEXT:    s_load_dword s2, s[10:11], 0x0
600 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
601 ; GFX7-NEXT:    s_bfe_i32 s8, s1, 0x40000
602 ; GFX7-NEXT:    s_bfe_i32 s10, s1, 0x40004
603 ; GFX7-NEXT:    s_bfe_i32 s9, s2, 0x40000
604 ; GFX7-NEXT:    s_bfe_i32 s11, s2, 0x40004
605 ; GFX7-NEXT:    s_and_b32 s9, s9, s0
606 ; GFX7-NEXT:    s_bfe_i32 s13, s2, 0x40008
607 ; GFX7-NEXT:    s_and_b32 s11, s11, s0
608 ; GFX7-NEXT:    s_and_b32 s8, s8, s0
609 ; GFX7-NEXT:    v_mov_b32_e32 v1, s9
610 ; GFX7-NEXT:    s_bfe_i32 s12, s1, 0x40008
611 ; GFX7-NEXT:    s_bfe_i32 s15, s2, 0x4000c
612 ; GFX7-NEXT:    s_and_b32 s13, s13, s0
613 ; GFX7-NEXT:    s_and_b32 s10, s10, s0
614 ; GFX7-NEXT:    v_mov_b32_e32 v2, s11
615 ; GFX7-NEXT:    s_bfe_i32 s14, s1, 0x4000c
616 ; GFX7-NEXT:    s_bfe_i32 s17, s2, 0x40010
617 ; GFX7-NEXT:    s_and_b32 s15, s15, s0
618 ; GFX7-NEXT:    s_and_b32 s12, s12, s0
619 ; GFX7-NEXT:    v_mov_b32_e32 v3, s13
620 ; GFX7-NEXT:    s_bfe_i32 s16, s1, 0x40010
621 ; GFX7-NEXT:    s_bfe_i32 s19, s2, 0x40014
622 ; GFX7-NEXT:    s_and_b32 s17, s17, s0
623 ; GFX7-NEXT:    s_and_b32 s14, s14, s0
624 ; GFX7-NEXT:    v_mov_b32_e32 v4, s15
625 ; GFX7-NEXT:    s_bfe_i32 s21, s2, 0x40018
626 ; GFX7-NEXT:    s_bfe_i32 s18, s1, 0x40014
627 ; GFX7-NEXT:    s_and_b32 s19, s19, s0
628 ; GFX7-NEXT:    s_and_b32 s16, s16, s0
629 ; GFX7-NEXT:    v_mov_b32_e32 v5, s17
630 ; GFX7-NEXT:    s_bfe_i32 s20, s1, 0x40018
631 ; GFX7-NEXT:    s_ashr_i32 s2, s2, 28
632 ; GFX7-NEXT:    s_and_b32 s21, s21, s0
633 ; GFX7-NEXT:    s_and_b32 s18, s18, s0
634 ; GFX7-NEXT:    v_mov_b32_e32 v6, s19
635 ; GFX7-NEXT:    s_ashr_i32 s1, s1, 28
636 ; GFX7-NEXT:    s_and_b32 s20, s20, s0
637 ; GFX7-NEXT:    s_and_b32 s2, s2, s0
638 ; GFX7-NEXT:    v_mov_b32_e32 v7, s21
639 ; GFX7-NEXT:    s_and_b32 s0, s1, s0
640 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
641 ; GFX7-NEXT:    v_mad_u32_u24 v0, s8, v1, v0
642 ; GFX7-NEXT:    v_mad_u32_u24 v0, s10, v2, v0
643 ; GFX7-NEXT:    v_mad_u32_u24 v0, s12, v3, v0
644 ; GFX7-NEXT:    v_mad_u32_u24 v0, s14, v4, v0
645 ; GFX7-NEXT:    v_mad_u32_u24 v0, s16, v5, v0
646 ; GFX7-NEXT:    v_mad_u32_u24 v0, s18, v6, v0
647 ; GFX7-NEXT:    v_mad_u32_u24 v0, s20, v7, v0
648 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
649 ; GFX7-NEXT:    v_mad_u32_u24 v0, s0, v1, v0
650 ; GFX7-NEXT:    buffer_store_byte v0, off, s[4:7], 0
651 ; GFX7-NEXT:    s_endpgm
653 ; GFX8-LABEL: idot8_acc8:
654 ; GFX8:       ; %bb.0: ; %entry
655 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
656 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
657 ; GFX8-NEXT:    s_movk_i32 s2, 0xff
658 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
659 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
660 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
661 ; GFX8-NEXT:    flat_load_ubyte v2, v[0:1]
662 ; GFX8-NEXT:    s_load_dword s0, s[4:5], 0x0
663 ; GFX8-NEXT:    s_load_dword s1, s[6:7], 0x0
664 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
665 ; GFX8-NEXT:    s_lshr_b32 s4, s0, 12
666 ; GFX8-NEXT:    s_bfe_i32 s7, s1, 0x40000
667 ; GFX8-NEXT:    s_lshr_b32 s5, s1, 12
668 ; GFX8-NEXT:    s_bfe_i32 s9, s1, 0x40004
669 ; GFX8-NEXT:    s_bfe_i32 s11, s1, 0x40008
670 ; GFX8-NEXT:    s_bfe_i32 s6, s0, 0x40000
671 ; GFX8-NEXT:    v_mov_b32_e32 v6, s7
672 ; GFX8-NEXT:    v_lshlrev_b16_e64 v4, 12, s4
673 ; GFX8-NEXT:    v_lshlrev_b16_e64 v5, 12, s5
674 ; GFX8-NEXT:    s_bfe_i32 s8, s0, 0x40004
675 ; GFX8-NEXT:    s_bfe_i32 s10, s0, 0x40008
676 ; GFX8-NEXT:    v_mov_b32_e32 v3, s11
677 ; GFX8-NEXT:    v_mov_b32_e32 v7, s9
678 ; GFX8-NEXT:    v_ashrrev_i16_e32 v4, 12, v4
679 ; GFX8-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
680 ; GFX8-NEXT:    v_mul_i32_i24_e32 v3, s10, v3
681 ; GFX8-NEXT:    s_bfe_i32 s13, s1, 0x40010
682 ; GFX8-NEXT:    v_and_b32_e32 v4, s2, v4
683 ; GFX8-NEXT:    v_and_b32_e32 v5, s2, v5
684 ; GFX8-NEXT:    s_bfe_i32 s15, s1, 0x40014
685 ; GFX8-NEXT:    s_bfe_i32 s12, s0, 0x40010
686 ; GFX8-NEXT:    v_mov_b32_e32 v8, s13
687 ; GFX8-NEXT:    s_bfe_i32 s17, s1, 0x40018
688 ; GFX8-NEXT:    s_bfe_i32 s14, s0, 0x40014
689 ; GFX8-NEXT:    v_mov_b32_e32 v9, s15
690 ; GFX8-NEXT:    s_bfe_i32 s16, s0, 0x40018
691 ; GFX8-NEXT:    s_ashr_i32 s1, s1, 28
692 ; GFX8-NEXT:    v_mov_b32_e32 v10, s17
693 ; GFX8-NEXT:    s_ashr_i32 s0, s0, 28
694 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
695 ; GFX8-NEXT:    v_mad_i32_i24 v2, s6, v6, v2
696 ; GFX8-NEXT:    v_mad_i32_i24 v2, s8, v7, v2
697 ; GFX8-NEXT:    v_add_u32_sdwa v2, vcc, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
698 ; GFX8-NEXT:    v_mad_u32_u24 v2, v4, v5, v2
699 ; GFX8-NEXT:    v_mad_i32_i24 v2, s12, v8, v2
700 ; GFX8-NEXT:    v_mad_i32_i24 v2, s14, v9, v2
701 ; GFX8-NEXT:    v_mad_i32_i24 v2, s16, v10, v2
702 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
703 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
704 ; GFX8-NEXT:    flat_store_byte v[0:1], v2
705 ; GFX8-NEXT:    s_endpgm
707 ; GFX9-LABEL: idot8_acc8:
708 ; GFX9:       ; %bb.0: ; %entry
709 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
710 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
711 ; GFX9-NEXT:    s_movk_i32 s2, 0xff
712 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
713 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
714 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
715 ; GFX9-NEXT:    global_load_ubyte v2, v[0:1], off
716 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x0
717 ; GFX9-NEXT:    s_load_dword s1, s[6:7], 0x0
718 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
719 ; GFX9-NEXT:    s_lshr_b32 s4, s0, 12
720 ; GFX9-NEXT:    s_bfe_i32 s7, s1, 0x40000
721 ; GFX9-NEXT:    s_lshr_b32 s5, s1, 12
722 ; GFX9-NEXT:    s_bfe_i32 s9, s1, 0x40004
723 ; GFX9-NEXT:    s_bfe_i32 s11, s1, 0x40008
724 ; GFX9-NEXT:    s_bfe_i32 s6, s0, 0x40000
725 ; GFX9-NEXT:    v_mov_b32_e32 v6, s7
726 ; GFX9-NEXT:    v_lshlrev_b16_e64 v4, 12, s4
727 ; GFX9-NEXT:    v_lshlrev_b16_e64 v5, 12, s5
728 ; GFX9-NEXT:    s_bfe_i32 s8, s0, 0x40004
729 ; GFX9-NEXT:    s_bfe_i32 s10, s0, 0x40008
730 ; GFX9-NEXT:    v_mov_b32_e32 v3, s11
731 ; GFX9-NEXT:    v_mov_b32_e32 v7, s9
732 ; GFX9-NEXT:    v_ashrrev_i16_e32 v4, 12, v4
733 ; GFX9-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
734 ; GFX9-NEXT:    v_mul_i32_i24_e32 v3, s10, v3
735 ; GFX9-NEXT:    s_bfe_i32 s13, s1, 0x40010
736 ; GFX9-NEXT:    v_and_b32_e32 v4, s2, v4
737 ; GFX9-NEXT:    v_and_b32_e32 v5, s2, v5
738 ; GFX9-NEXT:    s_bfe_i32 s15, s1, 0x40014
739 ; GFX9-NEXT:    s_bfe_i32 s12, s0, 0x40010
740 ; GFX9-NEXT:    v_mov_b32_e32 v8, s13
741 ; GFX9-NEXT:    s_bfe_i32 s17, s1, 0x40018
742 ; GFX9-NEXT:    s_bfe_i32 s14, s0, 0x40014
743 ; GFX9-NEXT:    v_mov_b32_e32 v9, s15
744 ; GFX9-NEXT:    s_bfe_i32 s16, s0, 0x40018
745 ; GFX9-NEXT:    s_ashr_i32 s1, s1, 28
746 ; GFX9-NEXT:    v_mov_b32_e32 v10, s17
747 ; GFX9-NEXT:    s_ashr_i32 s0, s0, 28
748 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
749 ; GFX9-NEXT:    v_mad_i32_i24 v2, s6, v6, v2
750 ; GFX9-NEXT:    v_mad_i32_i24 v2, s8, v7, v2
751 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
752 ; GFX9-NEXT:    v_mad_u32_u24 v2, v4, v5, v2
753 ; GFX9-NEXT:    v_mad_i32_i24 v2, s12, v8, v2
754 ; GFX9-NEXT:    v_mad_i32_i24 v2, s14, v9, v2
755 ; GFX9-NEXT:    v_mad_i32_i24 v2, s16, v10, v2
756 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
757 ; GFX9-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
758 ; GFX9-NEXT:    global_store_byte v[0:1], v2, off
759 ; GFX9-NEXT:    s_endpgm
761 ; GFX9-DL-LABEL: idot8_acc8:
762 ; GFX9-DL:       ; %bb.0: ; %entry
763 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
764 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
765 ; GFX9-DL-NEXT:    s_movk_i32 s2, 0xff
766 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
767 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
768 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
769 ; GFX9-DL-NEXT:    global_load_ubyte v2, v[0:1], off
770 ; GFX9-DL-NEXT:    s_load_dword s0, s[4:5], 0x0
771 ; GFX9-DL-NEXT:    s_load_dword s1, s[6:7], 0x0
772 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
773 ; GFX9-DL-NEXT:    s_lshr_b32 s4, s0, 12
774 ; GFX9-DL-NEXT:    s_bfe_i32 s7, s1, 0x40000
775 ; GFX9-DL-NEXT:    s_lshr_b32 s5, s1, 12
776 ; GFX9-DL-NEXT:    s_bfe_i32 s9, s1, 0x40004
777 ; GFX9-DL-NEXT:    s_bfe_i32 s11, s1, 0x40008
778 ; GFX9-DL-NEXT:    s_bfe_i32 s6, s0, 0x40000
779 ; GFX9-DL-NEXT:    v_mov_b32_e32 v6, s7
780 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v4, 12, s4
781 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v5, 12, s5
782 ; GFX9-DL-NEXT:    s_bfe_i32 s8, s0, 0x40004
783 ; GFX9-DL-NEXT:    s_bfe_i32 s10, s0, 0x40008
784 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s11
785 ; GFX9-DL-NEXT:    v_mov_b32_e32 v7, s9
786 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v4, 12, v4
787 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
788 ; GFX9-DL-NEXT:    v_mul_i32_i24_e32 v3, s10, v3
789 ; GFX9-DL-NEXT:    s_bfe_i32 s13, s1, 0x40010
790 ; GFX9-DL-NEXT:    v_and_b32_e32 v4, s2, v4
791 ; GFX9-DL-NEXT:    v_and_b32_e32 v5, s2, v5
792 ; GFX9-DL-NEXT:    s_bfe_i32 s15, s1, 0x40014
793 ; GFX9-DL-NEXT:    s_bfe_i32 s12, s0, 0x40010
794 ; GFX9-DL-NEXT:    v_mov_b32_e32 v8, s13
795 ; GFX9-DL-NEXT:    s_bfe_i32 s17, s1, 0x40018
796 ; GFX9-DL-NEXT:    s_bfe_i32 s14, s0, 0x40014
797 ; GFX9-DL-NEXT:    v_mov_b32_e32 v9, s15
798 ; GFX9-DL-NEXT:    s_bfe_i32 s16, s0, 0x40018
799 ; GFX9-DL-NEXT:    s_ashr_i32 s1, s1, 28
800 ; GFX9-DL-NEXT:    v_mov_b32_e32 v10, s17
801 ; GFX9-DL-NEXT:    s_ashr_i32 s0, s0, 28
802 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
803 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s6, v6, v2
804 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s8, v7, v2
805 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
806 ; GFX9-DL-NEXT:    v_mad_u32_u24 v2, v4, v5, v2
807 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s12, v8, v2
808 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s14, v9, v2
809 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s16, v10, v2
810 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s1
811 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
812 ; GFX9-DL-NEXT:    global_store_byte v[0:1], v2, off
813 ; GFX9-DL-NEXT:    s_endpgm
815 ; GFX10-DL-LABEL: idot8_acc8:
816 ; GFX10-DL:       ; %bb.0: ; %entry
817 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
818 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
819 ; GFX10-DL-NEXT:    s_movk_i32 s2, 0xff
820 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
821 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
822 ; GFX10-DL-NEXT:    s_load_dword s4, s[4:5], 0x0
823 ; GFX10-DL-NEXT:    s_load_dword s5, s[6:7], 0x0
824 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
825 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
826 ; GFX10-DL-NEXT:    global_load_ubyte v2, v[0:1], off
827 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
828 ; GFX10-DL-NEXT:    s_lshr_b32 s0, s4, 12
829 ; GFX10-DL-NEXT:    s_lshr_b32 s1, s5, 12
830 ; GFX10-DL-NEXT:    s_bfe_i32 s6, s4, 0x40000
831 ; GFX10-DL-NEXT:    s_bfe_i32 s7, s5, 0x40000
832 ; GFX10-DL-NEXT:    s_bfe_i32 s8, s4, 0x40004
833 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v3, 12, s0
834 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v4, 12, s1
835 ; GFX10-DL-NEXT:    s_bfe_i32 s9, s5, 0x40004
836 ; GFX10-DL-NEXT:    s_bfe_i32 s10, s4, 0x40008
837 ; GFX10-DL-NEXT:    s_bfe_i32 s11, s5, 0x40008
838 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v3, 12, v3
839 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v4, 12, v4
840 ; GFX10-DL-NEXT:    s_bfe_i32 s0, s4, 0x40010
841 ; GFX10-DL-NEXT:    s_bfe_i32 s1, s5, 0x40010
842 ; GFX10-DL-NEXT:    v_mul_i32_i24_e64 v5, s10, s11
843 ; GFX10-DL-NEXT:    v_and_b32_e32 v3, s2, v3
844 ; GFX10-DL-NEXT:    v_and_b32_e32 v4, s2, v4
845 ; GFX10-DL-NEXT:    s_bfe_i32 s10, s4, 0x40014
846 ; GFX10-DL-NEXT:    s_bfe_i32 s11, s5, 0x40014
847 ; GFX10-DL-NEXT:    s_bfe_i32 s12, s4, 0x40018
848 ; GFX10-DL-NEXT:    s_bfe_i32 s2, s5, 0x40018
849 ; GFX10-DL-NEXT:    s_ashr_i32 s4, s4, 28
850 ; GFX10-DL-NEXT:    s_ashr_i32 s5, s5, 28
851 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
852 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s6, s7, v2
853 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s8, s9, v2
854 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
855 ; GFX10-DL-NEXT:    v_mad_u32_u24 v2, v3, v4, v2
856 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s1, v2
857 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s10, s11, v2
858 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s12, s2, v2
859 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s4, s5, v2
860 ; GFX10-DL-NEXT:    global_store_byte v[0:1], v2, off
861 ; GFX10-DL-NEXT:    s_endpgm
862                                        <8 x i4> addrspace(1)* %src2,
863                                        i8 addrspace(1)* nocapture %dst) {
864 entry:
865   %vec1 = load <8 x i4>, <8 x i4> addrspace(1)* %src1
866   %vec2 = load <8 x i4>, <8 x i4> addrspace(1)* %src2
868   %v1e0 = extractelement <8 x i4> %vec1, i64 0
869   %cv1e0 = sext i4 %v1e0 to i8
870   %v2e0 = extractelement <8 x i4> %vec2, i64 0
871   %cv2e0 = sext i4 %v2e0 to i8
872   %mul0 = mul nuw nsw i8 %cv1e0, %cv2e0
874   %v1e1 = extractelement <8 x i4> %vec1, i64 1
875   %cv1e1 = sext i4 %v1e1 to i8
876   %v2e1 = extractelement <8 x i4> %vec2, i64 1
877   %cv2e1 = sext i4 %v2e1 to i8
878   %mul1 = mul nuw nsw i8 %cv1e1, %cv2e1
880   %v1e2 = extractelement <8 x i4> %vec1, i64 2
881   %cv1e2 = sext i4 %v1e2 to i8
882   %v2e2 = extractelement <8 x i4> %vec2, i64 2
883   %cv2e2 = sext i4 %v2e2 to i8
884   %mul2 = mul nuw nsw i8 %cv1e2, %cv2e2
886   %v1e3 = extractelement <8 x i4> %vec1, i64 3
887   %cv1e3 = sext i4 %v1e3 to i8
888   %v2e3 = extractelement <8 x i4> %vec2, i64 3
889   %cv2e3 = sext i4 %v2e3 to i8
890   %mul3 = mul nuw nsw i8 %cv1e3, %cv2e3
892   %v1e4 = extractelement <8 x i4> %vec1, i64 4
893   %cv1e4 = sext i4 %v1e4 to i8
894   %v2e4 = extractelement <8 x i4> %vec2, i64 4
895   %cv2e4 = sext i4 %v2e4 to i8
896   %mul4 = mul nuw nsw i8 %cv1e4, %cv2e4
898   %v1e5 = extractelement <8 x i4> %vec1, i64 5
899   %cv1e5 = sext i4 %v1e5 to i8
900   %v2e5 = extractelement <8 x i4> %vec2, i64 5
901   %cv2e5 = sext i4 %v2e5 to i8
902   %mul5 = mul nuw nsw i8 %cv1e5, %cv2e5
904   %v1e6 = extractelement <8 x i4> %vec1, i64 6
905   %cv1e6 = sext i4 %v1e6 to i8
906   %v2e6 = extractelement <8 x i4> %vec2, i64 6
907   %cv2e6 = sext i4 %v2e6 to i8
908   %mul6 = mul nuw nsw i8 %cv1e6, %cv2e6
910   %v1e7 = extractelement <8 x i4> %vec1, i64 7
911   %cv1e7 = sext i4 %v1e7 to i8
912   %v2e7 = extractelement <8 x i4> %vec2, i64 7
913   %cv2e7 = sext i4 %v2e7 to i8
914   %mul7 = mul nuw nsw i8 %cv1e7, %cv2e7
916   %acc = load i8, i8 addrspace(1)* %dst, align 4
917   %add1 = add i8 %mul0, %acc
918   %add2 = add i8 %add1, %mul1
919   %add3 = add i8 %add2, %mul2
920   %add4 = add i8 %add3, %mul3
921   %add5 = add i8 %add4, %mul4
922   %add6 = add i8 %add5, %mul5
923   %add7 = add i8 %add6, %mul6
924   %add8 = add i8 %add7, %mul7
926   store i8 %add8, i8 addrspace(1)* %dst, align 4
927   ret void
930 ; Make sure the pattern is not recognized if there are multiple uses of the
931 ; intermediate multiplications.
932 define amdgpu_kernel void @idot8_multiuses_mul1(<8 x i4> addrspace(1)* %src1,
933 ; GFX7-LABEL: idot8_multiuses_mul1:
934 ; GFX7:       ; %bb.0: ; %entry
935 ; GFX7-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
936 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
937 ; GFX7-NEXT:    s_mov_b32 s7, 0xf000
938 ; GFX7-NEXT:    s_mov_b32 s6, -1
939 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
940 ; GFX7-NEXT:    s_load_dword s0, s[8:9], 0x0
941 ; GFX7-NEXT:    s_load_dword s1, s[10:11], 0x0
942 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
943 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
944 ; GFX7-NEXT:    s_bfe_i32 s8, s0, 0x40000
945 ; GFX7-NEXT:    s_bfe_i32 s9, s1, 0x40000
946 ; GFX7-NEXT:    v_mov_b32_e32 v0, s9
947 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
948 ; GFX7-NEXT:    v_mad_i32_i24 v1, s8, v0, v1
949 ; GFX7-NEXT:    s_bfe_i32 s11, s1, 0x40004
950 ; GFX7-NEXT:    s_bfe_i32 s10, s0, 0x40004
951 ; GFX7-NEXT:    s_bfe_i32 s13, s1, 0x40008
952 ; GFX7-NEXT:    v_mad_i32_i24 v0, s8, v0, v1
953 ; GFX7-NEXT:    v_mov_b32_e32 v2, s11
954 ; GFX7-NEXT:    v_mad_i32_i24 v0, s10, v2, v0
955 ; GFX7-NEXT:    s_bfe_i32 s12, s0, 0x40008
956 ; GFX7-NEXT:    v_mov_b32_e32 v2, s13
957 ; GFX7-NEXT:    s_bfe_i32 s15, s1, 0x4000c
958 ; GFX7-NEXT:    v_mad_i32_i24 v0, s12, v2, v0
959 ; GFX7-NEXT:    s_bfe_i32 s14, s0, 0x4000c
960 ; GFX7-NEXT:    v_mov_b32_e32 v2, s15
961 ; GFX7-NEXT:    s_bfe_i32 s17, s1, 0x40010
962 ; GFX7-NEXT:    v_mad_i32_i24 v0, s14, v2, v0
963 ; GFX7-NEXT:    s_bfe_i32 s16, s0, 0x40010
964 ; GFX7-NEXT:    v_mov_b32_e32 v2, s17
965 ; GFX7-NEXT:    s_bfe_i32 s19, s1, 0x40014
966 ; GFX7-NEXT:    s_bfe_i32 s21, s1, 0x40018
967 ; GFX7-NEXT:    v_mad_i32_i24 v0, s16, v2, v0
968 ; GFX7-NEXT:    s_bfe_i32 s18, s0, 0x40014
969 ; GFX7-NEXT:    v_mov_b32_e32 v2, s19
970 ; GFX7-NEXT:    s_bfe_i32 s20, s0, 0x40018
971 ; GFX7-NEXT:    v_mad_i32_i24 v0, s18, v2, v0
972 ; GFX7-NEXT:    v_mov_b32_e32 v2, s21
973 ; GFX7-NEXT:    s_ashr_i32 s1, s1, 28
974 ; GFX7-NEXT:    v_mad_i32_i24 v0, s20, v2, v0
975 ; GFX7-NEXT:    s_ashr_i32 s0, s0, 28
976 ; GFX7-NEXT:    v_mov_b32_e32 v2, s1
977 ; GFX7-NEXT:    v_mad_i32_i24 v0, s0, v2, v0
978 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
979 ; GFX7-NEXT:    buffer_store_dword v0, off, s[4:7], 0
980 ; GFX7-NEXT:    s_endpgm
982 ; GFX8-LABEL: idot8_multiuses_mul1:
983 ; GFX8:       ; %bb.0: ; %entry
984 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
985 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
986 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
987 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
988 ; GFX8-NEXT:    s_load_dword s4, s[6:7], 0x0
989 ; GFX8-NEXT:    s_load_dword s5, s[0:1], 0x0
990 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
991 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
992 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
993 ; GFX8-NEXT:    s_bfe_i32 s0, s2, 0x40000
994 ; GFX8-NEXT:    s_bfe_i32 s1, s4, 0x40000
995 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
996 ; GFX8-NEXT:    v_mov_b32_e32 v3, s5
997 ; GFX8-NEXT:    v_mad_i32_i24 v3, s0, v2, v3
998 ; GFX8-NEXT:    s_bfe_i32 s7, s4, 0x40004
999 ; GFX8-NEXT:    s_bfe_i32 s6, s2, 0x40004
1000 ; GFX8-NEXT:    s_bfe_i32 s9, s4, 0x40008
1001 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
1002 ; GFX8-NEXT:    v_mov_b32_e32 v4, s7
1003 ; GFX8-NEXT:    v_mad_i32_i24 v2, s6, v4, v2
1004 ; GFX8-NEXT:    s_bfe_i32 s8, s2, 0x40008
1005 ; GFX8-NEXT:    v_mov_b32_e32 v4, s9
1006 ; GFX8-NEXT:    s_bfe_i32 s11, s4, 0x4000c
1007 ; GFX8-NEXT:    v_mad_i32_i24 v2, s8, v4, v2
1008 ; GFX8-NEXT:    s_bfe_i32 s10, s2, 0x4000c
1009 ; GFX8-NEXT:    v_mov_b32_e32 v4, s11
1010 ; GFX8-NEXT:    s_bfe_i32 s13, s4, 0x40010
1011 ; GFX8-NEXT:    v_mad_i32_i24 v2, s10, v4, v2
1012 ; GFX8-NEXT:    s_bfe_i32 s12, s2, 0x40010
1013 ; GFX8-NEXT:    v_mov_b32_e32 v4, s13
1014 ; GFX8-NEXT:    s_bfe_i32 s15, s4, 0x40014
1015 ; GFX8-NEXT:    s_bfe_i32 s17, s4, 0x40018
1016 ; GFX8-NEXT:    v_mad_i32_i24 v2, s12, v4, v2
1017 ; GFX8-NEXT:    s_bfe_i32 s14, s2, 0x40014
1018 ; GFX8-NEXT:    v_mov_b32_e32 v4, s15
1019 ; GFX8-NEXT:    s_bfe_i32 s16, s2, 0x40018
1020 ; GFX8-NEXT:    v_mad_i32_i24 v2, s14, v4, v2
1021 ; GFX8-NEXT:    v_mov_b32_e32 v4, s17
1022 ; GFX8-NEXT:    s_ashr_i32 s4, s4, 28
1023 ; GFX8-NEXT:    v_mad_i32_i24 v2, s16, v4, v2
1024 ; GFX8-NEXT:    s_ashr_i32 s2, s2, 28
1025 ; GFX8-NEXT:    v_mov_b32_e32 v4, s4
1026 ; GFX8-NEXT:    v_mad_i32_i24 v2, s2, v4, v2
1027 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
1028 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1029 ; GFX8-NEXT:    s_endpgm
1031 ; GFX9-LABEL: idot8_multiuses_mul1:
1032 ; GFX9:       ; %bb.0: ; %entry
1033 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1034 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1035 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1036 ; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x0
1037 ; GFX9-NEXT:    s_load_dword s4, s[6:7], 0x0
1038 ; GFX9-NEXT:    s_load_dword s5, s[0:1], 0x0
1039 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
1040 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
1041 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1042 ; GFX9-NEXT:    s_bfe_i32 s0, s2, 0x40000
1043 ; GFX9-NEXT:    s_bfe_i32 s1, s4, 0x40000
1044 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
1045 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
1046 ; GFX9-NEXT:    v_mad_i32_i24 v3, s0, v2, v3
1047 ; GFX9-NEXT:    s_bfe_i32 s7, s4, 0x40004
1048 ; GFX9-NEXT:    s_bfe_i32 s6, s2, 0x40004
1049 ; GFX9-NEXT:    s_bfe_i32 s9, s4, 0x40008
1050 ; GFX9-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
1051 ; GFX9-NEXT:    v_mov_b32_e32 v4, s7
1052 ; GFX9-NEXT:    v_mad_i32_i24 v2, s6, v4, v2
1053 ; GFX9-NEXT:    s_bfe_i32 s8, s2, 0x40008
1054 ; GFX9-NEXT:    v_mov_b32_e32 v4, s9
1055 ; GFX9-NEXT:    s_bfe_i32 s11, s4, 0x4000c
1056 ; GFX9-NEXT:    v_mad_i32_i24 v2, s8, v4, v2
1057 ; GFX9-NEXT:    s_bfe_i32 s10, s2, 0x4000c
1058 ; GFX9-NEXT:    v_mov_b32_e32 v4, s11
1059 ; GFX9-NEXT:    s_bfe_i32 s13, s4, 0x40010
1060 ; GFX9-NEXT:    v_mad_i32_i24 v2, s10, v4, v2
1061 ; GFX9-NEXT:    s_bfe_i32 s12, s2, 0x40010
1062 ; GFX9-NEXT:    v_mov_b32_e32 v4, s13
1063 ; GFX9-NEXT:    s_bfe_i32 s15, s4, 0x40014
1064 ; GFX9-NEXT:    s_bfe_i32 s17, s4, 0x40018
1065 ; GFX9-NEXT:    v_mad_i32_i24 v2, s12, v4, v2
1066 ; GFX9-NEXT:    s_bfe_i32 s14, s2, 0x40014
1067 ; GFX9-NEXT:    v_mov_b32_e32 v4, s15
1068 ; GFX9-NEXT:    s_bfe_i32 s16, s2, 0x40018
1069 ; GFX9-NEXT:    v_mad_i32_i24 v2, s14, v4, v2
1070 ; GFX9-NEXT:    v_mov_b32_e32 v4, s17
1071 ; GFX9-NEXT:    s_ashr_i32 s4, s4, 28
1072 ; GFX9-NEXT:    v_mad_i32_i24 v2, s16, v4, v2
1073 ; GFX9-NEXT:    s_ashr_i32 s2, s2, 28
1074 ; GFX9-NEXT:    v_mov_b32_e32 v4, s4
1075 ; GFX9-NEXT:    v_mad_i32_i24 v2, s2, v4, v2
1076 ; GFX9-NEXT:    v_add_u32_e32 v2, v3, v2
1077 ; GFX9-NEXT:    global_store_dword v[0:1], v2, off
1078 ; GFX9-NEXT:    s_endpgm
1080 ; GFX9-DL-LABEL: idot8_multiuses_mul1:
1081 ; GFX9-DL:       ; %bb.0: ; %entry
1082 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1083 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1084 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1085 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
1086 ; GFX9-DL-NEXT:    s_load_dword s4, s[6:7], 0x0
1087 ; GFX9-DL-NEXT:    s_load_dword s5, s[0:1], 0x0
1088 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
1089 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
1090 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1091 ; GFX9-DL-NEXT:    s_bfe_i32 s0, s2, 0x40000
1092 ; GFX9-DL-NEXT:    s_bfe_i32 s1, s4, 0x40000
1093 ; GFX9-DL-NEXT:    v_mov_b32_e32 v2, s1
1094 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s5
1095 ; GFX9-DL-NEXT:    v_mad_i32_i24 v3, s0, v2, v3
1096 ; GFX9-DL-NEXT:    s_bfe_i32 s7, s4, 0x40004
1097 ; GFX9-DL-NEXT:    s_bfe_i32 s6, s2, 0x40004
1098 ; GFX9-DL-NEXT:    s_bfe_i32 s9, s4, 0x40008
1099 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s0, v2, v3
1100 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s7
1101 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s6, v4, v2
1102 ; GFX9-DL-NEXT:    s_bfe_i32 s8, s2, 0x40008
1103 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s9
1104 ; GFX9-DL-NEXT:    s_bfe_i32 s11, s4, 0x4000c
1105 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s8, v4, v2
1106 ; GFX9-DL-NEXT:    s_bfe_i32 s10, s2, 0x4000c
1107 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s11
1108 ; GFX9-DL-NEXT:    s_bfe_i32 s13, s4, 0x40010
1109 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s10, v4, v2
1110 ; GFX9-DL-NEXT:    s_bfe_i32 s12, s2, 0x40010
1111 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s13
1112 ; GFX9-DL-NEXT:    s_bfe_i32 s15, s4, 0x40014
1113 ; GFX9-DL-NEXT:    s_bfe_i32 s17, s4, 0x40018
1114 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s12, v4, v2
1115 ; GFX9-DL-NEXT:    s_bfe_i32 s14, s2, 0x40014
1116 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s15
1117 ; GFX9-DL-NEXT:    s_bfe_i32 s16, s2, 0x40018
1118 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s14, v4, v2
1119 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s17
1120 ; GFX9-DL-NEXT:    s_ashr_i32 s4, s4, 28
1121 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s16, v4, v2
1122 ; GFX9-DL-NEXT:    s_ashr_i32 s2, s2, 28
1123 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, s4
1124 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s2, v4, v2
1125 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v3, v2
1126 ; GFX9-DL-NEXT:    global_store_dword v[0:1], v2, off
1127 ; GFX9-DL-NEXT:    s_endpgm
1129 ; GFX10-DL-LABEL: idot8_multiuses_mul1:
1130 ; GFX10-DL:       ; %bb.0: ; %entry
1131 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1132 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1133 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
1134 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1135 ; GFX10-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
1136 ; GFX10-DL-NEXT:    s_load_dword s4, s[6:7], 0x0
1137 ; GFX10-DL-NEXT:    s_load_dword s5, s[0:1], 0x0
1138 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
1139 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
1140 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1141 ; GFX10-DL-NEXT:    s_bfe_i32 s0, s2, 0x40000
1142 ; GFX10-DL-NEXT:    s_bfe_i32 s1, s4, 0x40000
1143 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, s5
1144 ; GFX10-DL-NEXT:    s_bfe_i32 s5, s2, 0x40004
1145 ; GFX10-DL-NEXT:    s_bfe_i32 s6, s4, 0x40004
1146 ; GFX10-DL-NEXT:    s_bfe_i32 s7, s2, 0x40008
1147 ; GFX10-DL-NEXT:    s_bfe_i32 s8, s4, 0x40008
1148 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s1, v2
1149 ; GFX10-DL-NEXT:    s_bfe_i32 s9, s2, 0x4000c
1150 ; GFX10-DL-NEXT:    s_bfe_i32 s10, s4, 0x4000c
1151 ; GFX10-DL-NEXT:    s_bfe_i32 s11, s2, 0x40010
1152 ; GFX10-DL-NEXT:    s_bfe_i32 s12, s4, 0x40010
1153 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s0, s1, v2
1154 ; GFX10-DL-NEXT:    s_bfe_i32 s0, s2, 0x40014
1155 ; GFX10-DL-NEXT:    s_bfe_i32 s1, s4, 0x40014
1156 ; GFX10-DL-NEXT:    s_bfe_i32 s13, s2, 0x40018
1157 ; GFX10-DL-NEXT:    s_bfe_i32 s14, s4, 0x40018
1158 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s5, s6, v3
1159 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s7, s8, v3
1160 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s9, s10, v3
1161 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s11, s12, v3
1162 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s0, s1, v3
1163 ; GFX10-DL-NEXT:    s_ashr_i32 s0, s2, 28
1164 ; GFX10-DL-NEXT:    s_ashr_i32 s1, s4, 28
1165 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s13, s14, v3
1166 ; GFX10-DL-NEXT:    v_mad_i32_i24 v3, s0, s1, v3
1167 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v2, v3
1168 ; GFX10-DL-NEXT:    global_store_dword v[0:1], v2, off
1169 ; GFX10-DL-NEXT:    s_endpgm
1170                                                 <8 x i4> addrspace(1)* %src2,
1171                                                 i32 addrspace(1)* nocapture %dst) {
1172 entry:
1173   %vec1 = load <8 x i4>, <8 x i4> addrspace(1)* %src1
1174   %vec2 = load <8 x i4>, <8 x i4> addrspace(1)* %src2
1176   %v1e0 = extractelement <8 x i4> %vec1, i64 0
1177   %cv1e0 = sext i4 %v1e0 to i32
1178   %v2e0 = extractelement <8 x i4> %vec2, i64 0
1179   %cv2e0 = sext i4 %v2e0 to i32
1180   %mul0 = mul nuw nsw i32 %cv1e0, %cv2e0
1182   %v1e1 = extractelement <8 x i4> %vec1, i64 1
1183   %cv1e1 = sext i4 %v1e1 to i32
1184   %v2e1 = extractelement <8 x i4> %vec2, i64 1
1185   %cv2e1 = sext i4 %v2e1 to i32
1186   %mul1 = mul nuw nsw i32 %cv1e1, %cv2e1
1188   %v1e2 = extractelement <8 x i4> %vec1, i64 2
1189   %cv1e2 = sext i4 %v1e2 to i32
1190   %v2e2 = extractelement <8 x i4> %vec2, i64 2
1191   %cv2e2 = sext i4 %v2e2 to i32
1192   %mul2 = mul nuw nsw i32 %cv1e2, %cv2e2
1194   %v1e3 = extractelement <8 x i4> %vec1, i64 3
1195   %cv1e3 = sext i4 %v1e3 to i32
1196   %v2e3 = extractelement <8 x i4> %vec2, i64 3
1197   %cv2e3 = sext i4 %v2e3 to i32
1198   %mul3 = mul nuw nsw i32 %cv1e3, %cv2e3
1200   %v1e4 = extractelement <8 x i4> %vec1, i64 4
1201   %cv1e4 = sext i4 %v1e4 to i32
1202   %v2e4 = extractelement <8 x i4> %vec2, i64 4
1203   %cv2e4 = sext i4 %v2e4 to i32
1204   %mul4 = mul nuw nsw i32 %cv1e4, %cv2e4
1206   %v1e5 = extractelement <8 x i4> %vec1, i64 5
1207   %cv1e5 = sext i4 %v1e5 to i32
1208   %v2e5 = extractelement <8 x i4> %vec2, i64 5
1209   %cv2e5 = sext i4 %v2e5 to i32
1210   %mul5 = mul nuw nsw i32 %cv1e5, %cv2e5
1212   %v1e6 = extractelement <8 x i4> %vec1, i64 6
1213   %cv1e6 = sext i4 %v1e6 to i32
1214   %v2e6 = extractelement <8 x i4> %vec2, i64 6
1215   %cv2e6 = sext i4 %v2e6 to i32
1216   %mul6 = mul nuw nsw i32 %cv1e6, %cv2e6
1218   %v1e7 = extractelement <8 x i4> %vec1, i64 7
1219   %cv1e7 = sext i4 %v1e7 to i32
1220   %v2e7 = extractelement <8 x i4> %vec2, i64 7
1221   %cv2e7 = sext i4 %v2e7 to i32
1222   %mul7 = mul nuw nsw i32 %cv1e7, %cv2e7
1224   %acc = load i32, i32 addrspace(1)* %dst, align 4
1225   %add =  add i32  %mul0, %acc
1226   %add1 = add i32 %mul0, %add
1227   %add2 = add i32 %add1, %mul1
1228   %add3 = add i32 %add2, %mul2
1229   %add4 = add i32 %add3, %mul3
1230   %add5 = add i32 %add4, %mul4
1231   %add6 = add i32 %add5, %mul5
1232   %add7 = add i32 %add6, %mul6
1233   %add8 = add i32 %add7, %mul7
1235   %res = add i32 %add, %add8
1236   store i32 %res, i32 addrspace(1)* %dst, align 4
1237   ret void
1240 ; TODO: Support this pattern.
1241 define amdgpu_kernel void @idot8_acc32_vecMul(<8 x i4> addrspace(1)* %src1,
1242 ; GFX7-LABEL: idot8_acc32_vecMul:
1243 ; GFX7:       ; %bb.0: ; %entry
1244 ; GFX7-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
1245 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
1246 ; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1247 ; GFX7-NEXT:    s_mov_b32 s6, -1
1248 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1249 ; GFX7-NEXT:    s_load_dword s1, s[8:9], 0x0
1250 ; GFX7-NEXT:    s_load_dword s9, s[10:11], 0x0
1251 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
1252 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1253 ; GFX7-NEXT:    s_ashr_i64 s[10:11], s[0:1], 60
1254 ; GFX7-NEXT:    s_lshl_b32 s11, s1, 4
1255 ; GFX7-NEXT:    s_ashr_i64 s[14:15], s[10:11], 60
1256 ; GFX7-NEXT:    s_lshl_b32 s11, s1, 12
1257 ; GFX7-NEXT:    s_ashr_i64 s[16:17], s[10:11], 60
1258 ; GFX7-NEXT:    s_lshl_b32 s11, s1, 16
1259 ; GFX7-NEXT:    s_ashr_i64 s[18:19], s[10:11], 60
1260 ; GFX7-NEXT:    s_lshl_b32 s11, s1, 20
1261 ; GFX7-NEXT:    s_lshl_b32 s13, s1, 8
1262 ; GFX7-NEXT:    s_ashr_i64 s[20:21], s[10:11], 60
1263 ; GFX7-NEXT:    s_lshl_b32 s11, s1, 24
1264 ; GFX7-NEXT:    s_lshl_b32 s1, s1, 28
1265 ; GFX7-NEXT:    s_ashr_i64 s[0:1], s[0:1], 60
1266 ; GFX7-NEXT:    s_lshl_b32 s1, s9, 4
1267 ; GFX7-NEXT:    s_ashr_i64 s[26:27], s[0:1], 60
1268 ; GFX7-NEXT:    s_lshl_b32 s1, s9, 8
1269 ; GFX7-NEXT:    s_ashr_i64 s[28:29], s[0:1], 60
1270 ; GFX7-NEXT:    s_lshl_b32 s1, s9, 12
1271 ; GFX7-NEXT:    s_ashr_i64 s[30:31], s[0:1], 60
1272 ; GFX7-NEXT:    s_lshl_b32 s1, s9, 16
1273 ; GFX7-NEXT:    s_ashr_i64 s[32:33], s[0:1], 60
1274 ; GFX7-NEXT:    s_lshl_b32 s1, s9, 20
1275 ; GFX7-NEXT:    s_ashr_i64 s[34:35], s[0:1], 60
1276 ; GFX7-NEXT:    s_lshl_b32 s1, s9, 24
1277 ; GFX7-NEXT:    s_ashr_i64 s[36:37], s[0:1], 60
1278 ; GFX7-NEXT:    s_lshl_b32 s1, s9, 28
1279 ; GFX7-NEXT:    s_ashr_i64 s[24:25], s[8:9], 60
1280 ; GFX7-NEXT:    s_ashr_i64 s[8:9], s[0:1], 60
1281 ; GFX7-NEXT:    v_mov_b32_e32 v0, s8
1282 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
1283 ; GFX7-NEXT:    v_mad_i32_i24 v0, s0, v0, v1
1284 ; GFX7-NEXT:    s_ashr_i64 s[22:23], s[10:11], 60
1285 ; GFX7-NEXT:    v_mov_b32_e32 v1, s36
1286 ; GFX7-NEXT:    v_mad_i32_i24 v0, s22, v1, v0
1287 ; GFX7-NEXT:    v_mov_b32_e32 v1, s34
1288 ; GFX7-NEXT:    v_mad_i32_i24 v0, s20, v1, v0
1289 ; GFX7-NEXT:    v_mov_b32_e32 v1, s32
1290 ; GFX7-NEXT:    v_mad_i32_i24 v0, s18, v1, v0
1291 ; GFX7-NEXT:    v_mov_b32_e32 v1, s30
1292 ; GFX7-NEXT:    v_mad_i32_i24 v0, s16, v1, v0
1293 ; GFX7-NEXT:    s_ashr_i64 s[12:13], s[12:13], 60
1294 ; GFX7-NEXT:    v_mov_b32_e32 v1, s28
1295 ; GFX7-NEXT:    v_mad_i32_i24 v0, s12, v1, v0
1296 ; GFX7-NEXT:    v_mov_b32_e32 v1, s26
1297 ; GFX7-NEXT:    v_mad_i32_i24 v0, s14, v1, v0
1298 ; GFX7-NEXT:    v_mov_b32_e32 v1, s24
1299 ; GFX7-NEXT:    v_mad_i32_i24 v0, s10, v1, v0
1300 ; GFX7-NEXT:    buffer_store_dword v0, off, s[4:7], 0
1301 ; GFX7-NEXT:    s_endpgm
1303 ; GFX8-LABEL: idot8_acc32_vecMul:
1304 ; GFX8:       ; %bb.0: ; %entry
1305 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1306 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1307 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1308 ; GFX8-NEXT:    s_load_dword s5, s[4:5], 0x0
1309 ; GFX8-NEXT:    s_load_dword s7, s[6:7], 0x0
1310 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1311 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1312 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1313 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1314 ; GFX8-NEXT:    s_ashr_i64 s[0:1], s[4:5], 60
1315 ; GFX8-NEXT:    s_lshl_b32 s1, s5, 4
1316 ; GFX8-NEXT:    s_ashr_i64 s[12:13], s[0:1], 60
1317 ; GFX8-NEXT:    s_lshl_b32 s1, s5, 16
1318 ; GFX8-NEXT:    s_ashr_i64 s[14:15], s[0:1], 60
1319 ; GFX8-NEXT:    s_lshl_b32 s1, s5, 20
1320 ; GFX8-NEXT:    s_ashr_i64 s[16:17], s[0:1], 60
1321 ; GFX8-NEXT:    s_lshl_b32 s1, s5, 24
1322 ; GFX8-NEXT:    s_ashr_i64 s[18:19], s[0:1], 60
1323 ; GFX8-NEXT:    s_lshl_b32 s1, s5, 28
1324 ; GFX8-NEXT:    s_lshl_b32 s9, s5, 8
1325 ; GFX8-NEXT:    s_lshl_b32 s11, s5, 12
1326 ; GFX8-NEXT:    s_ashr_i64 s[4:5], s[0:1], 60
1327 ; GFX8-NEXT:    s_lshl_b32 s1, s7, 4
1328 ; GFX8-NEXT:    s_ashr_i64 s[22:23], s[0:1], 60
1329 ; GFX8-NEXT:    s_lshl_b32 s1, s7, 8
1330 ; GFX8-NEXT:    s_ashr_i64 s[24:25], s[0:1], 60
1331 ; GFX8-NEXT:    s_lshl_b32 s1, s7, 12
1332 ; GFX8-NEXT:    s_ashr_i64 s[26:27], s[0:1], 60
1333 ; GFX8-NEXT:    s_lshl_b32 s1, s7, 16
1334 ; GFX8-NEXT:    s_ashr_i64 s[28:29], s[0:1], 60
1335 ; GFX8-NEXT:    s_lshl_b32 s1, s7, 20
1336 ; GFX8-NEXT:    s_ashr_i64 s[30:31], s[0:1], 60
1337 ; GFX8-NEXT:    s_lshl_b32 s1, s7, 24
1338 ; GFX8-NEXT:    s_ashr_i64 s[32:33], s[0:1], 60
1339 ; GFX8-NEXT:    s_lshl_b32 s1, s7, 28
1340 ; GFX8-NEXT:    s_ashr_i64 s[20:21], s[6:7], 60
1341 ; GFX8-NEXT:    s_ashr_i64 s[6:7], s[0:1], 60
1342 ; GFX8-NEXT:    v_mov_b32_e32 v2, s6
1343 ; GFX8-NEXT:    v_mov_b32_e32 v3, s2
1344 ; GFX8-NEXT:    v_mad_i32_i24 v2, s4, v2, v3
1345 ; GFX8-NEXT:    v_mov_b32_e32 v3, s32
1346 ; GFX8-NEXT:    v_mad_i32_i24 v2, s18, v3, v2
1347 ; GFX8-NEXT:    v_mov_b32_e32 v3, s30
1348 ; GFX8-NEXT:    v_mad_i32_i24 v2, s16, v3, v2
1349 ; GFX8-NEXT:    v_mov_b32_e32 v3, s28
1350 ; GFX8-NEXT:    v_mad_i32_i24 v2, s14, v3, v2
1351 ; GFX8-NEXT:    s_ashr_i64 s[10:11], s[10:11], 60
1352 ; GFX8-NEXT:    v_mov_b32_e32 v3, s26
1353 ; GFX8-NEXT:    v_mad_i32_i24 v2, s10, v3, v2
1354 ; GFX8-NEXT:    s_ashr_i64 s[8:9], s[8:9], 60
1355 ; GFX8-NEXT:    v_mov_b32_e32 v3, s24
1356 ; GFX8-NEXT:    v_mad_i32_i24 v2, s8, v3, v2
1357 ; GFX8-NEXT:    v_mov_b32_e32 v3, s22
1358 ; GFX8-NEXT:    v_mad_i32_i24 v2, s12, v3, v2
1359 ; GFX8-NEXT:    v_mov_b32_e32 v3, s20
1360 ; GFX8-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
1361 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1362 ; GFX8-NEXT:    s_endpgm
1364 ; GFX9-LABEL: idot8_acc32_vecMul:
1365 ; GFX9:       ; %bb.0: ; %entry
1366 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1367 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1368 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1369 ; GFX9-NEXT:    s_load_dword s5, s[4:5], 0x0
1370 ; GFX9-NEXT:    s_load_dword s7, s[6:7], 0x0
1371 ; GFX9-NEXT:    s_load_dword s2, s[0:1], 0x0
1372 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
1373 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
1374 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1375 ; GFX9-NEXT:    s_ashr_i64 s[0:1], s[4:5], 60
1376 ; GFX9-NEXT:    s_lshl_b32 s1, s5, 4
1377 ; GFX9-NEXT:    s_ashr_i64 s[12:13], s[0:1], 60
1378 ; GFX9-NEXT:    s_lshl_b32 s1, s5, 16
1379 ; GFX9-NEXT:    s_ashr_i64 s[14:15], s[0:1], 60
1380 ; GFX9-NEXT:    s_lshl_b32 s1, s5, 20
1381 ; GFX9-NEXT:    s_ashr_i64 s[16:17], s[0:1], 60
1382 ; GFX9-NEXT:    s_lshl_b32 s1, s5, 24
1383 ; GFX9-NEXT:    s_ashr_i64 s[18:19], s[0:1], 60
1384 ; GFX9-NEXT:    s_lshl_b32 s1, s5, 28
1385 ; GFX9-NEXT:    s_lshl_b32 s9, s5, 8
1386 ; GFX9-NEXT:    s_lshl_b32 s11, s5, 12
1387 ; GFX9-NEXT:    s_ashr_i64 s[4:5], s[0:1], 60
1388 ; GFX9-NEXT:    s_lshl_b32 s1, s7, 4
1389 ; GFX9-NEXT:    s_ashr_i64 s[22:23], s[0:1], 60
1390 ; GFX9-NEXT:    s_lshl_b32 s1, s7, 8
1391 ; GFX9-NEXT:    s_ashr_i64 s[24:25], s[0:1], 60
1392 ; GFX9-NEXT:    s_lshl_b32 s1, s7, 12
1393 ; GFX9-NEXT:    s_ashr_i64 s[26:27], s[0:1], 60
1394 ; GFX9-NEXT:    s_lshl_b32 s1, s7, 16
1395 ; GFX9-NEXT:    s_ashr_i64 s[28:29], s[0:1], 60
1396 ; GFX9-NEXT:    s_lshl_b32 s1, s7, 20
1397 ; GFX9-NEXT:    s_ashr_i64 s[30:31], s[0:1], 60
1398 ; GFX9-NEXT:    s_lshl_b32 s1, s7, 24
1399 ; GFX9-NEXT:    s_ashr_i64 s[32:33], s[0:1], 60
1400 ; GFX9-NEXT:    s_lshl_b32 s1, s7, 28
1401 ; GFX9-NEXT:    s_ashr_i64 s[20:21], s[6:7], 60
1402 ; GFX9-NEXT:    s_ashr_i64 s[6:7], s[0:1], 60
1403 ; GFX9-NEXT:    v_mov_b32_e32 v2, s6
1404 ; GFX9-NEXT:    v_mov_b32_e32 v3, s2
1405 ; GFX9-NEXT:    v_mad_i32_i24 v2, s4, v2, v3
1406 ; GFX9-NEXT:    v_mov_b32_e32 v3, s32
1407 ; GFX9-NEXT:    v_mad_i32_i24 v2, s18, v3, v2
1408 ; GFX9-NEXT:    v_mov_b32_e32 v3, s30
1409 ; GFX9-NEXT:    v_mad_i32_i24 v2, s16, v3, v2
1410 ; GFX9-NEXT:    v_mov_b32_e32 v3, s28
1411 ; GFX9-NEXT:    v_mad_i32_i24 v2, s14, v3, v2
1412 ; GFX9-NEXT:    s_ashr_i64 s[10:11], s[10:11], 60
1413 ; GFX9-NEXT:    v_mov_b32_e32 v3, s26
1414 ; GFX9-NEXT:    v_mad_i32_i24 v2, s10, v3, v2
1415 ; GFX9-NEXT:    s_ashr_i64 s[8:9], s[8:9], 60
1416 ; GFX9-NEXT:    v_mov_b32_e32 v3, s24
1417 ; GFX9-NEXT:    v_mad_i32_i24 v2, s8, v3, v2
1418 ; GFX9-NEXT:    v_mov_b32_e32 v3, s22
1419 ; GFX9-NEXT:    v_mad_i32_i24 v2, s12, v3, v2
1420 ; GFX9-NEXT:    v_mov_b32_e32 v3, s20
1421 ; GFX9-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
1422 ; GFX9-NEXT:    global_store_dword v[0:1], v2, off
1423 ; GFX9-NEXT:    s_endpgm
1425 ; GFX9-DL-LABEL: idot8_acc32_vecMul:
1426 ; GFX9-DL:       ; %bb.0: ; %entry
1427 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1428 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1429 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1430 ; GFX9-DL-NEXT:    s_load_dword s5, s[4:5], 0x0
1431 ; GFX9-DL-NEXT:    s_load_dword s7, s[6:7], 0x0
1432 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1433 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
1434 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
1435 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1436 ; GFX9-DL-NEXT:    s_ashr_i64 s[0:1], s[4:5], 60
1437 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s5, 4
1438 ; GFX9-DL-NEXT:    s_ashr_i64 s[12:13], s[0:1], 60
1439 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s5, 16
1440 ; GFX9-DL-NEXT:    s_ashr_i64 s[14:15], s[0:1], 60
1441 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s5, 20
1442 ; GFX9-DL-NEXT:    s_ashr_i64 s[16:17], s[0:1], 60
1443 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s5, 24
1444 ; GFX9-DL-NEXT:    s_ashr_i64 s[18:19], s[0:1], 60
1445 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s5, 28
1446 ; GFX9-DL-NEXT:    s_lshl_b32 s9, s5, 8
1447 ; GFX9-DL-NEXT:    s_lshl_b32 s11, s5, 12
1448 ; GFX9-DL-NEXT:    s_ashr_i64 s[4:5], s[0:1], 60
1449 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s7, 4
1450 ; GFX9-DL-NEXT:    s_ashr_i64 s[22:23], s[0:1], 60
1451 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s7, 8
1452 ; GFX9-DL-NEXT:    s_ashr_i64 s[24:25], s[0:1], 60
1453 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s7, 12
1454 ; GFX9-DL-NEXT:    s_ashr_i64 s[26:27], s[0:1], 60
1455 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s7, 16
1456 ; GFX9-DL-NEXT:    s_ashr_i64 s[28:29], s[0:1], 60
1457 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s7, 20
1458 ; GFX9-DL-NEXT:    s_ashr_i64 s[30:31], s[0:1], 60
1459 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s7, 24
1460 ; GFX9-DL-NEXT:    s_ashr_i64 s[32:33], s[0:1], 60
1461 ; GFX9-DL-NEXT:    s_lshl_b32 s1, s7, 28
1462 ; GFX9-DL-NEXT:    s_ashr_i64 s[20:21], s[6:7], 60
1463 ; GFX9-DL-NEXT:    s_ashr_i64 s[6:7], s[0:1], 60
1464 ; GFX9-DL-NEXT:    v_mov_b32_e32 v2, s6
1465 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s2
1466 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s4, v2, v3
1467 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s32
1468 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s18, v3, v2
1469 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s30
1470 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s16, v3, v2
1471 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s28
1472 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s14, v3, v2
1473 ; GFX9-DL-NEXT:    s_ashr_i64 s[10:11], s[10:11], 60
1474 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s26
1475 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s10, v3, v2
1476 ; GFX9-DL-NEXT:    s_ashr_i64 s[8:9], s[8:9], 60
1477 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s24
1478 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s8, v3, v2
1479 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s22
1480 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s12, v3, v2
1481 ; GFX9-DL-NEXT:    v_mov_b32_e32 v3, s20
1482 ; GFX9-DL-NEXT:    v_mad_i32_i24 v2, s0, v3, v2
1483 ; GFX9-DL-NEXT:    global_store_dword v[0:1], v2, off
1484 ; GFX9-DL-NEXT:    s_endpgm
1486 ; GFX10-DL-LABEL: idot8_acc32_vecMul:
1487 ; GFX10-DL:       ; %bb.0: ; %entry
1488 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1489 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1490 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
1491 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1492 ; GFX10-DL-NEXT:    s_load_dword s5, s[4:5], 0x0
1493 ; GFX10-DL-NEXT:    s_load_dword s7, s[6:7], 0x0
1494 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1495 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
1496 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
1497 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1498 ; GFX10-DL-NEXT:    s_lshl_b32 s1, s5, 28
1499 ; GFX10-DL-NEXT:    s_lshl_b32 s9, s7, 28
1500 ; GFX10-DL-NEXT:    s_lshl_b32 s11, s5, 24
1501 ; GFX10-DL-NEXT:    s_lshl_b32 s13, s7, 24
1502 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, s2
1503 ; GFX10-DL-NEXT:    s_ashr_i64 s[0:1], s[0:1], 60
1504 ; GFX10-DL-NEXT:    s_ashr_i64 s[8:9], s[8:9], 60
1505 ; GFX10-DL-NEXT:    s_lshl_b32 s1, s5, 20
1506 ; GFX10-DL-NEXT:    s_ashr_i64 s[10:11], s[10:11], 60
1507 ; GFX10-DL-NEXT:    s_lshl_b32 s9, s7, 20
1508 ; GFX10-DL-NEXT:    s_ashr_i64 s[12:13], s[12:13], 60
1509 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s8, v2
1510 ; GFX10-DL-NEXT:    s_ashr_i64 s[0:1], s[0:1], 60
1511 ; GFX10-DL-NEXT:    s_lshl_b32 s11, s5, 16
1512 ; GFX10-DL-NEXT:    s_ashr_i64 s[8:9], s[8:9], 60
1513 ; GFX10-DL-NEXT:    s_lshl_b32 s1, s7, 16
1514 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s10, s12, v2
1515 ; GFX10-DL-NEXT:    s_lshl_b32 s9, s5, 12
1516 ; GFX10-DL-NEXT:    s_ashr_i64 s[10:11], s[10:11], 60
1517 ; GFX10-DL-NEXT:    s_lshl_b32 s11, s7, 12
1518 ; GFX10-DL-NEXT:    s_ashr_i64 s[12:13], s[0:1], 60
1519 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s8, v2
1520 ; GFX10-DL-NEXT:    s_lshl_b32 s1, s5, 8
1521 ; GFX10-DL-NEXT:    s_ashr_i64 s[8:9], s[8:9], 60
1522 ; GFX10-DL-NEXT:    s_ashr_i64 s[14:15], s[10:11], 60
1523 ; GFX10-DL-NEXT:    s_lshl_b32 s9, s7, 8
1524 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s10, s12, v2
1525 ; GFX10-DL-NEXT:    s_ashr_i64 s[0:1], s[0:1], 60
1526 ; GFX10-DL-NEXT:    s_lshl_b32 s11, s5, 4
1527 ; GFX10-DL-NEXT:    s_lshl_b32 s1, s7, 4
1528 ; GFX10-DL-NEXT:    s_ashr_i64 s[12:13], s[8:9], 60
1529 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s8, s14, v2
1530 ; GFX10-DL-NEXT:    s_ashr_i64 s[8:9], s[10:11], 60
1531 ; GFX10-DL-NEXT:    s_ashr_i64 s[10:11], s[0:1], 60
1532 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s12, v2
1533 ; GFX10-DL-NEXT:    s_ashr_i64 s[0:1], s[4:5], 60
1534 ; GFX10-DL-NEXT:    s_ashr_i64 s[4:5], s[6:7], 60
1535 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s8, s10, v2
1536 ; GFX10-DL-NEXT:    v_mad_i32_i24 v2, s0, s4, v2
1537 ; GFX10-DL-NEXT:    global_store_dword v[0:1], v2, off
1538 ; GFX10-DL-NEXT:    s_endpgm
1539                                               <8 x i4> addrspace(1)* %src2,
1540                                               i32 addrspace(1)* nocapture %dst) {
1541 entry:
1542   %vec1 = load <8 x i4>, <8 x i4> addrspace(1)* %src1
1543   %vec2 = load <8 x i4>, <8 x i4> addrspace(1)* %src2
1545   %cvec1 = sext <8 x i4> %vec1 to <8 x i32>
1546   %cvec2 = sext <8 x i4> %vec2 to <8 x i32>
1548   %mul = mul <8 x i32> %cvec1, %cvec2
1549   %mul0 = extractelement <8 x i32> %mul, i64 0
1550   %mul1 = extractelement <8 x i32> %mul, i64 1
1551   %mul2 = extractelement <8 x i32> %mul, i64 2
1552   %mul3 = extractelement <8 x i32> %mul, i64 3
1553   %mul4 = extractelement <8 x i32> %mul, i64 4
1554   %mul5 = extractelement <8 x i32> %mul, i64 5
1555   %mul6 = extractelement <8 x i32> %mul, i64 6
1556   %mul7 = extractelement <8 x i32> %mul, i64 7
1558   %acc = load i32, i32 addrspace(1)* %dst, align 4
1559   %add1 = add i32 %mul0, %acc
1560   %add2 = add i32 %add1, %mul1
1561   %add3 = add i32 %add2, %mul2
1562   %add4 = add i32 %add3, %mul3
1563   %add5 = add i32 %add4, %mul4
1564   %add6 = add i32 %add5, %mul5
1565   %add7 = add i32 %add6, %mul6
1566   %add8 = add i32 %add7, %mul7
1568   store i32 %add8, i32 addrspace(1)* %dst, align 4
1569   ret void
1572 ; TODO: Support this pattern.
1573 define amdgpu_kernel void @idot8_acc16_vecMul(<8 x i4> addrspace(1)* %src1,
1574 ; GFX7-LABEL: idot8_acc16_vecMul:
1575 ; GFX7:       ; %bb.0: ; %entry
1576 ; GFX7-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
1577 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
1578 ; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1579 ; GFX7-NEXT:    s_mov_b32 s6, -1
1580 ; GFX7-NEXT:    s_mov_b32 s2, 0xffff
1581 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1582 ; GFX7-NEXT:    s_load_dword s0, s[8:9], 0x0
1583 ; GFX7-NEXT:    buffer_load_ushort v0, off, s[4:7], 0
1584 ; GFX7-NEXT:    s_load_dword s1, s[10:11], 0x0
1585 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1586 ; GFX7-NEXT:    s_ashr_i32 s8, s0, 28
1587 ; GFX7-NEXT:    s_bfe_i32 s9, s0, 0x40018
1588 ; GFX7-NEXT:    s_bfe_i32 s16, s1, 0x40018
1589 ; GFX7-NEXT:    s_bfe_i32 s17, s1, 0x40014
1590 ; GFX7-NEXT:    s_bfe_i32 s18, s1, 0x40010
1591 ; GFX7-NEXT:    s_bfe_i32 s19, s1, 0x40000
1592 ; GFX7-NEXT:    s_bfe_i32 s20, s1, 0x40004
1593 ; GFX7-NEXT:    s_bfe_i32 s21, s1, 0x40008
1594 ; GFX7-NEXT:    s_ashr_i32 s15, s1, 28
1595 ; GFX7-NEXT:    s_bfe_i32 s1, s1, 0x4000c
1596 ; GFX7-NEXT:    s_bfe_i32 s10, s0, 0x40014
1597 ; GFX7-NEXT:    s_bfe_i32 s11, s0, 0x40010
1598 ; GFX7-NEXT:    s_bfe_i32 s12, s0, 0x40000
1599 ; GFX7-NEXT:    v_mov_b32_e32 v4, s19
1600 ; GFX7-NEXT:    s_bfe_i32 s13, s0, 0x40004
1601 ; GFX7-NEXT:    v_mov_b32_e32 v3, s20
1602 ; GFX7-NEXT:    s_bfe_i32 s14, s0, 0x40008
1603 ; GFX7-NEXT:    v_mov_b32_e32 v2, s21
1604 ; GFX7-NEXT:    s_bfe_i32 s0, s0, 0x4000c
1605 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1606 ; GFX7-NEXT:    v_mul_i32_i24_e32 v1, s0, v1
1607 ; GFX7-NEXT:    v_mul_i32_i24_e32 v2, s14, v2
1608 ; GFX7-NEXT:    v_mul_i32_i24_e32 v3, s13, v3
1609 ; GFX7-NEXT:    v_mul_i32_i24_e32 v4, s12, v4
1610 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1611 ; GFX7-NEXT:    v_and_b32_e32 v2, s2, v2
1612 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
1613 ; GFX7-NEXT:    v_and_b32_e32 v4, s2, v4
1614 ; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
1615 ; GFX7-NEXT:    v_or_b32_e32 v2, v4, v3
1616 ; GFX7-NEXT:    v_alignbit_b32 v3, v1, v2, 16
1617 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
1618 ; GFX7-NEXT:    v_mov_b32_e32 v5, s18
1619 ; GFX7-NEXT:    v_mov_b32_e32 v6, s17
1620 ; GFX7-NEXT:    v_mov_b32_e32 v7, s16
1621 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1622 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
1623 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v3, v0
1624 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
1625 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v4, v0
1626 ; GFX7-NEXT:    v_mad_i32_i24 v0, s11, v5, v0
1627 ; GFX7-NEXT:    v_mad_i32_i24 v0, s10, v6, v0
1628 ; GFX7-NEXT:    v_mad_i32_i24 v0, s9, v7, v0
1629 ; GFX7-NEXT:    v_mov_b32_e32 v1, s15
1630 ; GFX7-NEXT:    v_mad_i32_i24 v0, s8, v1, v0
1631 ; GFX7-NEXT:    buffer_store_short v0, off, s[4:7], 0
1632 ; GFX7-NEXT:    s_endpgm
1634 ; GFX8-LABEL: idot8_acc16_vecMul:
1635 ; GFX8:       ; %bb.0: ; %entry
1636 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1637 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1638 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1639 ; GFX8-NEXT:    s_load_dword s2, s[4:5], 0x0
1640 ; GFX8-NEXT:    s_load_dword s4, s[6:7], 0x0
1641 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1642 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1643 ; GFX8-NEXT:    flat_load_ushort v2, v[0:1]
1644 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1645 ; GFX8-NEXT:    v_lshlrev_b16_e64 v3, 12, s2
1646 ; GFX8-NEXT:    v_lshlrev_b16_e64 v4, 12, s4
1647 ; GFX8-NEXT:    s_lshr_b32 s0, s2, 4
1648 ; GFX8-NEXT:    s_lshr_b32 s1, s2, 8
1649 ; GFX8-NEXT:    s_lshr_b32 s5, s4, 4
1650 ; GFX8-NEXT:    s_lshr_b32 s6, s4, 8
1651 ; GFX8-NEXT:    v_lshlrev_b16_e64 v5, 12, s1
1652 ; GFX8-NEXT:    v_lshlrev_b16_e64 v6, 12, s0
1653 ; GFX8-NEXT:    v_lshlrev_b16_e64 v7, 12, s6
1654 ; GFX8-NEXT:    v_lshlrev_b16_e64 v8, 12, s5
1655 ; GFX8-NEXT:    v_ashrrev_i16_e32 v3, 12, v3
1656 ; GFX8-NEXT:    v_ashrrev_i16_e32 v4, 12, v4
1657 ; GFX8-NEXT:    s_lshr_b32 s0, s2, 12
1658 ; GFX8-NEXT:    s_lshr_b32 s1, s4, 12
1659 ; GFX8-NEXT:    v_ashrrev_i16_e32 v6, 12, v6
1660 ; GFX8-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
1661 ; GFX8-NEXT:    v_ashrrev_i16_e32 v7, 12, v7
1662 ; GFX8-NEXT:    v_ashrrev_i16_e32 v8, 12, v8
1663 ; GFX8-NEXT:    v_lshlrev_b16_e64 v9, 12, s0
1664 ; GFX8-NEXT:    v_lshlrev_b16_e64 v10, 12, s1
1665 ; GFX8-NEXT:    s_lshr_b32 s5, s2, 16
1666 ; GFX8-NEXT:    s_lshr_b32 s6, s4, 16
1667 ; GFX8-NEXT:    v_mul_u32_u24_e32 v5, v5, v7
1668 ; GFX8-NEXT:    v_lshlrev_b16_e64 v11, 12, s5
1669 ; GFX8-NEXT:    v_lshlrev_b16_e64 v12, 12, s6
1670 ; GFX8-NEXT:    s_lshr_b32 s0, s2, 20
1671 ; GFX8-NEXT:    s_lshr_b32 s1, s4, 20
1672 ; GFX8-NEXT:    v_ashrrev_i16_e32 v9, 12, v9
1673 ; GFX8-NEXT:    v_ashrrev_i16_e32 v10, 12, v10
1674 ; GFX8-NEXT:    v_lshlrev_b16_e64 v13, 12, s0
1675 ; GFX8-NEXT:    v_lshlrev_b16_e64 v14, 12, s1
1676 ; GFX8-NEXT:    s_lshr_b32 s5, s2, 24
1677 ; GFX8-NEXT:    s_lshr_b32 s6, s4, 24
1678 ; GFX8-NEXT:    v_ashrrev_i16_e32 v11, 12, v11
1679 ; GFX8-NEXT:    v_ashrrev_i16_e32 v12, 12, v12
1680 ; GFX8-NEXT:    v_lshlrev_b16_e64 v15, 12, s5
1681 ; GFX8-NEXT:    v_lshlrev_b16_e64 v17, 12, s6
1682 ; GFX8-NEXT:    s_lshr_b32 s0, s2, 28
1683 ; GFX8-NEXT:    s_lshr_b32 s1, s4, 28
1684 ; GFX8-NEXT:    v_ashrrev_i16_e32 v13, 12, v13
1685 ; GFX8-NEXT:    v_ashrrev_i16_e32 v14, 12, v14
1686 ; GFX8-NEXT:    v_lshlrev_b16_e64 v16, 12, s0
1687 ; GFX8-NEXT:    v_lshlrev_b16_e64 v18, 12, s1
1688 ; GFX8-NEXT:    v_ashrrev_i16_e32 v15, 12, v15
1689 ; GFX8-NEXT:    v_ashrrev_i16_e32 v17, 12, v17
1690 ; GFX8-NEXT:    v_ashrrev_i16_e32 v16, 12, v16
1691 ; GFX8-NEXT:    v_ashrrev_i16_e32 v18, 12, v18
1692 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1693 ; GFX8-NEXT:    v_mad_u32_u24 v2, v3, v4, v2
1694 ; GFX8-NEXT:    v_mad_u32_u24 v2, v6, v8, v2
1695 ; GFX8-NEXT:    v_add_u32_sdwa v2, vcc, v5, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1696 ; GFX8-NEXT:    v_mad_u32_u24 v2, v9, v10, v2
1697 ; GFX8-NEXT:    v_mad_u32_u24 v2, v11, v12, v2
1698 ; GFX8-NEXT:    v_mad_u32_u24 v2, v13, v14, v2
1699 ; GFX8-NEXT:    v_mad_u32_u24 v2, v15, v17, v2
1700 ; GFX8-NEXT:    v_mad_u32_u24 v2, v16, v18, v2
1701 ; GFX8-NEXT:    flat_store_short v[0:1], v2
1702 ; GFX8-NEXT:    s_endpgm
1704 ; GFX9-LABEL: idot8_acc16_vecMul:
1705 ; GFX9:       ; %bb.0: ; %entry
1706 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1707 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1708 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1709 ; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x0
1710 ; GFX9-NEXT:    s_load_dword s4, s[6:7], 0x0
1711 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
1712 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
1713 ; GFX9-NEXT:    global_load_ushort v2, v[0:1], off
1714 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1715 ; GFX9-NEXT:    s_and_b32 s0, s2, 15
1716 ; GFX9-NEXT:    s_bfe_u32 s1, s2, 0x40004
1717 ; GFX9-NEXT:    s_and_b32 s5, s4, 15
1718 ; GFX9-NEXT:    s_bfe_u32 s6, s4, 0x40004
1719 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, s1
1720 ; GFX9-NEXT:    s_pack_ll_b32_b16 s1, s5, s6
1721 ; GFX9-NEXT:    s_bfe_u32 s5, s2, 0x40008
1722 ; GFX9-NEXT:    s_bfe_u32 s6, s2, 0x4000c
1723 ; GFX9-NEXT:    v_pk_lshlrev_b16 v3, 12, s0 op_sel_hi:[0,1]
1724 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s5, s6
1725 ; GFX9-NEXT:    s_bfe_u32 s9, s2, 0x40010
1726 ; GFX9-NEXT:    s_bfe_u32 s10, s2, 0x40014
1727 ; GFX9-NEXT:    v_pk_lshlrev_b16 v4, 12, s0 op_sel_hi:[0,1]
1728 ; GFX9-NEXT:    s_bfe_u32 s13, s2, 0x40018
1729 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s9, s10
1730 ; GFX9-NEXT:    s_lshr_b32 s2, s2, 28
1731 ; GFX9-NEXT:    v_pk_lshlrev_b16 v5, 12, s0 op_sel_hi:[0,1]
1732 ; GFX9-NEXT:    v_pk_lshlrev_b16 v7, 12, s1 op_sel_hi:[0,1]
1733 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s13, s2
1734 ; GFX9-NEXT:    s_bfe_u32 s7, s4, 0x40008
1735 ; GFX9-NEXT:    s_bfe_u32 s8, s4, 0x4000c
1736 ; GFX9-NEXT:    v_pk_lshlrev_b16 v6, 12, s0 op_sel_hi:[0,1]
1737 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s7, s8
1738 ; GFX9-NEXT:    v_pk_ashrrev_i16 v3, 12, v3 op_sel_hi:[0,1]
1739 ; GFX9-NEXT:    v_pk_ashrrev_i16 v7, 12, v7 op_sel_hi:[0,1]
1740 ; GFX9-NEXT:    v_pk_lshlrev_b16 v8, 12, s0 op_sel_hi:[0,1]
1741 ; GFX9-NEXT:    v_pk_mul_lo_u16 v3, v3, v7
1742 ; GFX9-NEXT:    s_bfe_u32 s11, s4, 0x40010
1743 ; GFX9-NEXT:    s_bfe_u32 s12, s4, 0x40014
1744 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s11, s12
1745 ; GFX9-NEXT:    v_pk_ashrrev_i16 v4, 12, v4 op_sel_hi:[0,1]
1746 ; GFX9-NEXT:    v_pk_ashrrev_i16 v8, 12, v8 op_sel_hi:[0,1]
1747 ; GFX9-NEXT:    v_pk_lshlrev_b16 v9, 12, s0 op_sel_hi:[0,1]
1748 ; GFX9-NEXT:    s_bfe_u32 s14, s4, 0x40018
1749 ; GFX9-NEXT:    s_lshr_b32 s4, s4, 28
1750 ; GFX9-NEXT:    v_pk_mul_lo_u16 v4, v4, v8
1751 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s14, s4
1752 ; GFX9-NEXT:    v_pk_ashrrev_i16 v5, 12, v5 op_sel_hi:[0,1]
1753 ; GFX9-NEXT:    v_pk_ashrrev_i16 v9, 12, v9 op_sel_hi:[0,1]
1754 ; GFX9-NEXT:    v_pk_lshlrev_b16 v10, 12, s0 op_sel_hi:[0,1]
1755 ; GFX9-NEXT:    v_pk_mul_lo_u16 v5, v5, v9
1756 ; GFX9-NEXT:    v_pk_ashrrev_i16 v6, 12, v6 op_sel_hi:[0,1]
1757 ; GFX9-NEXT:    v_pk_ashrrev_i16 v10, 12, v10 op_sel_hi:[0,1]
1758 ; GFX9-NEXT:    v_pk_mul_lo_u16 v6, v6, v10
1759 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1760 ; GFX9-NEXT:    v_add_u32_e32 v2, v3, v2
1761 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1762 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1763 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1764 ; GFX9-NEXT:    v_add_u32_e32 v2, v2, v5
1765 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1766 ; GFX9-NEXT:    v_add_u32_e32 v2, v2, v6
1767 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1768 ; GFX9-NEXT:    global_store_short v[0:1], v2, off
1769 ; GFX9-NEXT:    s_endpgm
1771 ; GFX9-DL-LABEL: idot8_acc16_vecMul:
1772 ; GFX9-DL:       ; %bb.0: ; %entry
1773 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1774 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1775 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1776 ; GFX9-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
1777 ; GFX9-DL-NEXT:    s_load_dword s4, s[6:7], 0x0
1778 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
1779 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
1780 ; GFX9-DL-NEXT:    global_load_ushort v2, v[0:1], off
1781 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1782 ; GFX9-DL-NEXT:    s_and_b32 s0, s2, 15
1783 ; GFX9-DL-NEXT:    s_bfe_u32 s1, s2, 0x40004
1784 ; GFX9-DL-NEXT:    s_and_b32 s5, s4, 15
1785 ; GFX9-DL-NEXT:    s_bfe_u32 s6, s4, 0x40004
1786 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s0, s0, s1
1787 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s1, s5, s6
1788 ; GFX9-DL-NEXT:    s_bfe_u32 s5, s2, 0x40008
1789 ; GFX9-DL-NEXT:    s_bfe_u32 s6, s2, 0x4000c
1790 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v3, 12, s0 op_sel_hi:[0,1]
1791 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s0, s5, s6
1792 ; GFX9-DL-NEXT:    s_bfe_u32 s9, s2, 0x40010
1793 ; GFX9-DL-NEXT:    s_bfe_u32 s10, s2, 0x40014
1794 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v4, 12, s0 op_sel_hi:[0,1]
1795 ; GFX9-DL-NEXT:    s_bfe_u32 s13, s2, 0x40018
1796 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s0, s9, s10
1797 ; GFX9-DL-NEXT:    s_lshr_b32 s2, s2, 28
1798 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v5, 12, s0 op_sel_hi:[0,1]
1799 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v7, 12, s1 op_sel_hi:[0,1]
1800 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s0, s13, s2
1801 ; GFX9-DL-NEXT:    s_bfe_u32 s7, s4, 0x40008
1802 ; GFX9-DL-NEXT:    s_bfe_u32 s8, s4, 0x4000c
1803 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v6, 12, s0 op_sel_hi:[0,1]
1804 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s0, s7, s8
1805 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v3, 12, v3 op_sel_hi:[0,1]
1806 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v7, 12, v7 op_sel_hi:[0,1]
1807 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v8, 12, s0 op_sel_hi:[0,1]
1808 ; GFX9-DL-NEXT:    v_pk_mul_lo_u16 v3, v3, v7
1809 ; GFX9-DL-NEXT:    s_bfe_u32 s11, s4, 0x40010
1810 ; GFX9-DL-NEXT:    s_bfe_u32 s12, s4, 0x40014
1811 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s0, s11, s12
1812 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v4, 12, v4 op_sel_hi:[0,1]
1813 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v8, 12, v8 op_sel_hi:[0,1]
1814 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v9, 12, s0 op_sel_hi:[0,1]
1815 ; GFX9-DL-NEXT:    s_bfe_u32 s14, s4, 0x40018
1816 ; GFX9-DL-NEXT:    s_lshr_b32 s4, s4, 28
1817 ; GFX9-DL-NEXT:    v_pk_mul_lo_u16 v4, v4, v8
1818 ; GFX9-DL-NEXT:    s_pack_ll_b32_b16 s0, s14, s4
1819 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v5, 12, v5 op_sel_hi:[0,1]
1820 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v9, 12, v9 op_sel_hi:[0,1]
1821 ; GFX9-DL-NEXT:    v_pk_lshlrev_b16 v10, 12, s0 op_sel_hi:[0,1]
1822 ; GFX9-DL-NEXT:    v_pk_mul_lo_u16 v5, v5, v9
1823 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v6, 12, v6 op_sel_hi:[0,1]
1824 ; GFX9-DL-NEXT:    v_pk_ashrrev_i16 v10, 12, v10 op_sel_hi:[0,1]
1825 ; GFX9-DL-NEXT:    v_pk_mul_lo_u16 v6, v6, v10
1826 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
1827 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v3, v2
1828 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1829 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1830 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1831 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v2, v5
1832 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1833 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v2, v6
1834 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1835 ; GFX9-DL-NEXT:    global_store_short v[0:1], v2, off
1836 ; GFX9-DL-NEXT:    s_endpgm
1838 ; GFX10-DL-LABEL: idot8_acc16_vecMul:
1839 ; GFX10-DL:       ; %bb.0: ; %entry
1840 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
1841 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
1842 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
1843 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1844 ; GFX10-DL-NEXT:    s_load_dword s2, s[4:5], 0x0
1845 ; GFX10-DL-NEXT:    s_load_dword s4, s[6:7], 0x0
1846 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
1847 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
1848 ; GFX10-DL-NEXT:    global_load_ushort v2, v[0:1], off
1849 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1850 ; GFX10-DL-NEXT:    s_and_b32 s0, s2, 15
1851 ; GFX10-DL-NEXT:    s_bfe_u32 s1, s2, 0x40004
1852 ; GFX10-DL-NEXT:    s_and_b32 s5, s4, 15
1853 ; GFX10-DL-NEXT:    s_bfe_u32 s6, s4, 0x40004
1854 ; GFX10-DL-NEXT:    s_bfe_u32 s7, s2, 0x40008
1855 ; GFX10-DL-NEXT:    s_bfe_u32 s8, s2, 0x4000c
1856 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s0, s0, s1
1857 ; GFX10-DL-NEXT:    s_bfe_u32 s1, s4, 0x40008
1858 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s5, s5, s6
1859 ; GFX10-DL-NEXT:    s_bfe_u32 s6, s4, 0x4000c
1860 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s7, s7, s8
1861 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v3, 12, s0 op_sel_hi:[0,1]
1862 ; GFX10-DL-NEXT:    s_bfe_u32 s0, s2, 0x40010
1863 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v4, 12, s5 op_sel_hi:[0,1]
1864 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s1, s1, s6
1865 ; GFX10-DL-NEXT:    s_bfe_u32 s5, s2, 0x40014
1866 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v3, 12, v3 op_sel_hi:[0,1]
1867 ; GFX10-DL-NEXT:    s_bfe_u32 s6, s4, 0x40010
1868 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v4, 12, v4 op_sel_hi:[0,1]
1869 ; GFX10-DL-NEXT:    s_bfe_u32 s8, s4, 0x40014
1870 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v6, 12, s1 op_sel_hi:[0,1]
1871 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v5, 12, s7 op_sel_hi:[0,1]
1872 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s0, s0, s5
1873 ; GFX10-DL-NEXT:    v_pk_mul_lo_u16 v3, v3, v4
1874 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s1, s6, s8
1875 ; GFX10-DL-NEXT:    s_bfe_u32 s5, s2, 0x40018
1876 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v4, 12, v5 op_sel_hi:[0,1]
1877 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v5, 12, v6 op_sel_hi:[0,1]
1878 ; GFX10-DL-NEXT:    s_bfe_u32 s6, s4, 0x40018
1879 ; GFX10-DL-NEXT:    s_lshr_b32 s2, s2, 28
1880 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v6, 12, s0 op_sel_hi:[0,1]
1881 ; GFX10-DL-NEXT:    s_lshr_b32 s4, s4, 28
1882 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v7, 12, s1 op_sel_hi:[0,1]
1883 ; GFX10-DL-NEXT:    v_pk_mul_lo_u16 v4, v4, v5
1884 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s0, s5, s2
1885 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v5, 12, v6 op_sel_hi:[0,1]
1886 ; GFX10-DL-NEXT:    s_pack_ll_b32_b16 s1, s6, s4
1887 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v6, 12, v7 op_sel_hi:[0,1]
1888 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v7, 12, s0 op_sel_hi:[0,1]
1889 ; GFX10-DL-NEXT:    v_pk_lshlrev_b16 v8, 12, s1 op_sel_hi:[0,1]
1890 ; GFX10-DL-NEXT:    v_pk_mul_lo_u16 v5, v5, v6
1891 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v6, 12, v7 op_sel_hi:[0,1]
1892 ; GFX10-DL-NEXT:    v_pk_ashrrev_i16 v7, 12, v8 op_sel_hi:[0,1]
1893 ; GFX10-DL-NEXT:    v_pk_mul_lo_u16 v7, v6, v7
1894 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
1895 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v3, v2
1896 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1897 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1898 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1899 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v2, v5
1900 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1901 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v2, v7
1902 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
1903 ; GFX10-DL-NEXT:    global_store_short v[0:1], v2, off
1904 ; GFX10-DL-NEXT:    s_endpgm
1905                                               <8 x i4> addrspace(1)* %src2,
1906                                               i16 addrspace(1)* nocapture %dst) {
1907 entry:
1908   %vec1 = load <8 x i4>, <8 x i4> addrspace(1)* %src1
1909   %vec2 = load <8 x i4>, <8 x i4> addrspace(1)* %src2
1911   %cvec1 = sext <8 x i4> %vec1 to <8 x i16>
1912   %cvec2 = sext <8 x i4> %vec2 to <8 x i16>
1914   %mul = mul <8 x i16> %cvec1, %cvec2
1915   %mul0 = extractelement <8 x i16> %mul, i64 0
1916   %mul1 = extractelement <8 x i16> %mul, i64 1
1917   %mul2 = extractelement <8 x i16> %mul, i64 2
1918   %mul3 = extractelement <8 x i16> %mul, i64 3
1919   %mul4 = extractelement <8 x i16> %mul, i64 4
1920   %mul5 = extractelement <8 x i16> %mul, i64 5
1921   %mul6 = extractelement <8 x i16> %mul, i64 6
1922   %mul7 = extractelement <8 x i16> %mul, i64 7
1924   %acc = load i16, i16 addrspace(1)* %dst, align 4
1925   %add1 = add i16 %mul0, %acc
1926   %add2 = add i16 %add1, %mul1
1927   %add3 = add i16 %add2, %mul2
1928   %add4 = add i16 %add3, %mul3
1929   %add5 = add i16 %add4, %mul4
1930   %add6 = add i16 %add5, %mul5
1931   %add7 = add i16 %add6, %mul6
1932   %add8 = add i16 %add7, %mul7
1934   store i16 %add8, i16 addrspace(1)* %dst, align 4
1935   ret void
1938 ; TODO: Support this pattern.
1939 define amdgpu_kernel void @idot8_acc8_vecMul(<8 x i4> addrspace(1)* %src1,
1940 ; GFX7-LABEL: idot8_acc8_vecMul:
1941 ; GFX7:       ; %bb.0: ; %entry
1942 ; GFX7-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x9
1943 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
1944 ; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1945 ; GFX7-NEXT:    s_mov_b32 s6, -1
1946 ; GFX7-NEXT:    s_movk_i32 s0, 0xff
1947 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1948 ; GFX7-NEXT:    s_load_dword s2, s[8:9], 0x0
1949 ; GFX7-NEXT:    buffer_load_ubyte v0, off, s[4:7], 0
1950 ; GFX7-NEXT:    s_load_dword s8, s[10:11], 0x0
1951 ; GFX7-NEXT:    s_mov_b32 s1, 0xffff
1952 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1953 ; GFX7-NEXT:    s_bfe_i32 s9, s2, 0x40000
1954 ; GFX7-NEXT:    s_bfe_i32 s10, s2, 0x40004
1955 ; GFX7-NEXT:    s_bfe_i32 s16, s8, 0x40000
1956 ; GFX7-NEXT:    s_bfe_i32 s17, s8, 0x40004
1957 ; GFX7-NEXT:    s_bfe_i32 s18, s8, 0x40008
1958 ; GFX7-NEXT:    s_bfe_i32 s19, s8, 0x4000c
1959 ; GFX7-NEXT:    s_bfe_i32 s20, s8, 0x40010
1960 ; GFX7-NEXT:    s_bfe_i32 s21, s8, 0x40014
1961 ; GFX7-NEXT:    s_bfe_i32 s22, s8, 0x40018
1962 ; GFX7-NEXT:    s_ashr_i32 s8, s8, 28
1963 ; GFX7-NEXT:    v_mov_b32_e32 v7, s17
1964 ; GFX7-NEXT:    v_mov_b32_e32 v8, s16
1965 ; GFX7-NEXT:    s_bfe_i32 s11, s2, 0x40008
1966 ; GFX7-NEXT:    v_mov_b32_e32 v6, s18
1967 ; GFX7-NEXT:    s_bfe_i32 s12, s2, 0x4000c
1968 ; GFX7-NEXT:    v_mov_b32_e32 v5, s19
1969 ; GFX7-NEXT:    s_bfe_i32 s13, s2, 0x40010
1970 ; GFX7-NEXT:    v_mov_b32_e32 v4, s20
1971 ; GFX7-NEXT:    s_bfe_i32 s14, s2, 0x40014
1972 ; GFX7-NEXT:    v_mov_b32_e32 v3, s21
1973 ; GFX7-NEXT:    s_bfe_i32 s15, s2, 0x40018
1974 ; GFX7-NEXT:    v_mov_b32_e32 v2, s22
1975 ; GFX7-NEXT:    s_ashr_i32 s2, s2, 28
1976 ; GFX7-NEXT:    v_mov_b32_e32 v1, s8
1977 ; GFX7-NEXT:    v_mul_i32_i24_e32 v1, s2, v1
1978 ; GFX7-NEXT:    v_mul_i32_i24_e32 v2, s15, v2
1979 ; GFX7-NEXT:    v_mul_i32_i24_e32 v3, s14, v3
1980 ; GFX7-NEXT:    v_mul_i32_i24_e32 v9, s13, v4
1981 ; GFX7-NEXT:    v_mul_i32_i24_e32 v5, s12, v5
1982 ; GFX7-NEXT:    v_mul_i32_i24_e32 v6, s11, v6
1983 ; GFX7-NEXT:    v_mul_i32_i24_e32 v7, s10, v7
1984 ; GFX7-NEXT:    v_mul_i32_i24_e32 v8, s9, v8
1985 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1986 ; GFX7-NEXT:    v_and_b32_e32 v2, s0, v2
1987 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
1988 ; GFX7-NEXT:    v_and_b32_e32 v9, s0, v9
1989 ; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 8, v5
1990 ; GFX7-NEXT:    v_and_b32_e32 v6, s0, v6
1991 ; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 8, v7
1992 ; GFX7-NEXT:    v_and_b32_e32 v8, s0, v8
1993 ; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
1994 ; GFX7-NEXT:    v_or_b32_e32 v2, v9, v3
1995 ; GFX7-NEXT:    v_or_b32_e32 v3, v6, v5
1996 ; GFX7-NEXT:    v_or_b32_e32 v5, v8, v7
1997 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
1998 ; GFX7-NEXT:    v_and_b32_e32 v2, s1, v2
1999 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2000 ; GFX7-NEXT:    v_and_b32_e32 v5, s1, v5
2001 ; GFX7-NEXT:    v_or_b32_e32 v1, v2, v1
2002 ; GFX7-NEXT:    v_or_b32_e32 v2, v5, v3
2003 ; GFX7-NEXT:    v_alignbit_b32 v3, v1, v2, 8
2004 ; GFX7-NEXT:    v_alignbit_b32 v5, v1, v2, 16
2005 ; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 24, v2
2006 ; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 8, v1
2007 ; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
2008 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 24, v1
2009 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2010 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
2011 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v3, v0
2012 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v5, v0
2013 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v6, v0
2014 ; GFX7-NEXT:    v_mad_i32_i24 v0, s13, v4, v0
2015 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v7
2016 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v8
2017 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
2018 ; GFX7-NEXT:    buffer_store_byte v0, off, s[4:7], 0
2019 ; GFX7-NEXT:    s_endpgm
2021 ; GFX8-LABEL: idot8_acc8_vecMul:
2022 ; GFX8:       ; %bb.0: ; %entry
2023 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2024 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
2025 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2026 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2027 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2028 ; GFX8-NEXT:    flat_load_ubyte v2, v[0:1]
2029 ; GFX8-NEXT:    s_load_dword s1, s[4:5], 0x0
2030 ; GFX8-NEXT:    s_load_dword s2, s[6:7], 0x0
2031 ; GFX8-NEXT:    s_mov_b32 s0, 0xffff
2032 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2033 ; GFX8-NEXT:    s_lshr_b32 s8, s1, 4
2034 ; GFX8-NEXT:    s_lshr_b32 s9, s1, 12
2035 ; GFX8-NEXT:    s_lshr_b32 s10, s1, 8
2036 ; GFX8-NEXT:    s_lshr_b32 s15, s2, 4
2037 ; GFX8-NEXT:    s_lshr_b32 s16, s2, 12
2038 ; GFX8-NEXT:    s_lshr_b32 s17, s2, 8
2039 ; GFX8-NEXT:    v_lshlrev_b16_e64 v3, 12, s1
2040 ; GFX8-NEXT:    v_lshlrev_b16_e64 v4, 12, s2
2041 ; GFX8-NEXT:    v_lshlrev_b16_e64 v5, 12, s10
2042 ; GFX8-NEXT:    v_lshlrev_b16_e64 v6, 12, s9
2043 ; GFX8-NEXT:    v_lshlrev_b16_e64 v7, 12, s8
2044 ; GFX8-NEXT:    v_lshlrev_b16_e64 v12, 12, s17
2045 ; GFX8-NEXT:    v_lshlrev_b16_e64 v13, 12, s16
2046 ; GFX8-NEXT:    v_lshlrev_b16_e64 v14, 12, s15
2047 ; GFX8-NEXT:    s_lshr_b32 s4, s1, 20
2048 ; GFX8-NEXT:    s_lshr_b32 s5, s1, 16
2049 ; GFX8-NEXT:    s_lshr_b32 s6, s1, 28
2050 ; GFX8-NEXT:    s_lshr_b32 s7, s1, 24
2051 ; GFX8-NEXT:    s_lshr_b32 s11, s2, 20
2052 ; GFX8-NEXT:    s_lshr_b32 s12, s2, 16
2053 ; GFX8-NEXT:    s_lshr_b32 s13, s2, 28
2054 ; GFX8-NEXT:    s_lshr_b32 s14, s2, 24
2055 ; GFX8-NEXT:    v_lshlrev_b16_e64 v8, 12, s7
2056 ; GFX8-NEXT:    v_lshlrev_b16_e64 v9, 12, s6
2057 ; GFX8-NEXT:    v_lshlrev_b16_e64 v10, 12, s5
2058 ; GFX8-NEXT:    v_lshlrev_b16_e64 v11, 12, s4
2059 ; GFX8-NEXT:    v_lshlrev_b16_e64 v15, 12, s14
2060 ; GFX8-NEXT:    v_lshlrev_b16_e64 v16, 12, s13
2061 ; GFX8-NEXT:    v_lshlrev_b16_e64 v17, 12, s12
2062 ; GFX8-NEXT:    v_lshlrev_b16_e64 v18, 12, s11
2063 ; GFX8-NEXT:    v_ashrrev_i16_e32 v3, 12, v3
2064 ; GFX8-NEXT:    v_ashrrev_i16_e32 v4, 12, v4
2065 ; GFX8-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
2066 ; GFX8-NEXT:    v_ashrrev_i16_e32 v6, 12, v6
2067 ; GFX8-NEXT:    v_ashrrev_i16_e32 v7, 12, v7
2068 ; GFX8-NEXT:    v_ashrrev_i16_e32 v12, 12, v12
2069 ; GFX8-NEXT:    v_ashrrev_i16_e32 v13, 12, v13
2070 ; GFX8-NEXT:    v_ashrrev_i16_e32 v14, 12, v14
2071 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v3, v3, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2072 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v4, v5, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2073 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v5, v6, v13 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2074 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v6, v7, v14 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2075 ; GFX8-NEXT:    v_ashrrev_i16_e32 v8, 12, v8
2076 ; GFX8-NEXT:    v_ashrrev_i16_e32 v15, 12, v15
2077 ; GFX8-NEXT:    v_ashrrev_i16_e32 v9, 12, v9
2078 ; GFX8-NEXT:    v_ashrrev_i16_e32 v10, 12, v10
2079 ; GFX8-NEXT:    v_ashrrev_i16_e32 v11, 12, v11
2080 ; GFX8-NEXT:    v_ashrrev_i16_e32 v16, 12, v16
2081 ; GFX8-NEXT:    v_ashrrev_i16_e32 v17, 12, v17
2082 ; GFX8-NEXT:    v_ashrrev_i16_e32 v18, 12, v18
2083 ; GFX8-NEXT:    v_or_b32_sdwa v3, v3, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2084 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v7, v8, v15 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2085 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v8, v9, v16 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2086 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v9, v10, v17 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2087 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v10, v11, v18 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2088 ; GFX8-NEXT:    v_and_b32_e32 v3, s0, v3
2089 ; GFX8-NEXT:    v_or_b32_sdwa v4, v4, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2090 ; GFX8-NEXT:    v_or_b32_sdwa v9, v9, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2091 ; GFX8-NEXT:    v_or_b32_sdwa v7, v7, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2092 ; GFX8-NEXT:    v_and_b32_e32 v5, s0, v9
2093 ; GFX8-NEXT:    v_or_b32_e32 v4, v3, v4
2094 ; GFX8-NEXT:    v_or_b32_e32 v6, v5, v7
2095 ; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 8, v4
2096 ; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 8, v6
2097 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2098 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v3
2099 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v7, v2
2100 ; GFX8-NEXT:    v_add_u32_sdwa v2, vcc, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_0
2101 ; GFX8-NEXT:    v_add_u32_sdwa v2, vcc, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2102 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v2, v5
2103 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v8, v2
2104 ; GFX8-NEXT:    v_add_u32_sdwa v2, vcc, v6, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2105 ; GFX8-NEXT:    v_add_u32_sdwa v2, vcc, v6, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2106 ; GFX8-NEXT:    flat_store_byte v[0:1], v2
2107 ; GFX8-NEXT:    s_endpgm
2109 ; GFX9-LABEL: idot8_acc8_vecMul:
2110 ; GFX9:       ; %bb.0: ; %entry
2111 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2112 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
2113 ; GFX9-NEXT:    s_mov_b32 s2, 0xffff
2114 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2115 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
2116 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
2117 ; GFX9-NEXT:    global_load_ubyte v2, v[0:1], off
2118 ; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x0
2119 ; GFX9-NEXT:    s_load_dword s1, s[6:7], 0x0
2120 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2121 ; GFX9-NEXT:    s_lshr_b32 s8, s0, 4
2122 ; GFX9-NEXT:    s_lshr_b32 s15, s1, 4
2123 ; GFX9-NEXT:    v_lshlrev_b16_e64 v3, 12, s0
2124 ; GFX9-NEXT:    v_lshlrev_b16_e64 v4, 12, s1
2125 ; GFX9-NEXT:    v_lshlrev_b16_e64 v7, 12, s8
2126 ; GFX9-NEXT:    v_lshlrev_b16_e64 v14, 12, s15
2127 ; GFX9-NEXT:    s_lshr_b32 s9, s0, 12
2128 ; GFX9-NEXT:    s_lshr_b32 s10, s0, 8
2129 ; GFX9-NEXT:    s_lshr_b32 s16, s1, 12
2130 ; GFX9-NEXT:    s_lshr_b32 s17, s1, 8
2131 ; GFX9-NEXT:    v_lshlrev_b16_e64 v5, 12, s10
2132 ; GFX9-NEXT:    v_lshlrev_b16_e64 v6, 12, s9
2133 ; GFX9-NEXT:    v_lshlrev_b16_e64 v12, 12, s17
2134 ; GFX9-NEXT:    v_lshlrev_b16_e64 v13, 12, s16
2135 ; GFX9-NEXT:    v_ashrrev_i16_e32 v3, 12, v3
2136 ; GFX9-NEXT:    v_ashrrev_i16_e32 v4, 12, v4
2137 ; GFX9-NEXT:    v_ashrrev_i16_e32 v7, 12, v7
2138 ; GFX9-NEXT:    v_ashrrev_i16_e32 v14, 12, v14
2139 ; GFX9-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
2140 ; GFX9-NEXT:    v_ashrrev_i16_e32 v12, 12, v12
2141 ; GFX9-NEXT:    v_ashrrev_i16_e32 v6, 12, v6
2142 ; GFX9-NEXT:    v_ashrrev_i16_e32 v13, 12, v13
2143 ; GFX9-NEXT:    v_mul_lo_u16_e32 v3, v3, v4
2144 ; GFX9-NEXT:    v_mul_lo_u16_sdwa v7, v7, v14 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2145 ; GFX9-NEXT:    v_or_b32_sdwa v3, v3, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2146 ; GFX9-NEXT:    s_lshr_b32 s4, s0, 20
2147 ; GFX9-NEXT:    s_lshr_b32 s5, s0, 16
2148 ; GFX9-NEXT:    s_lshr_b32 s11, s1, 20
2149 ; GFX9-NEXT:    s_lshr_b32 s12, s1, 16
2150 ; GFX9-NEXT:    v_mul_lo_u16_sdwa v6, v6, v13 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2151 ; GFX9-NEXT:    v_mul_lo_u16_e32 v5, v5, v12
2152 ; GFX9-NEXT:    v_lshlrev_b16_e64 v10, 12, s5
2153 ; GFX9-NEXT:    v_lshlrev_b16_e64 v11, 12, s4
2154 ; GFX9-NEXT:    v_lshlrev_b16_e64 v17, 12, s12
2155 ; GFX9-NEXT:    v_lshlrev_b16_e64 v18, 12, s11
2156 ; GFX9-NEXT:    s_lshr_b32 s6, s0, 28
2157 ; GFX9-NEXT:    s_lshr_b32 s7, s0, 24
2158 ; GFX9-NEXT:    s_lshr_b32 s13, s1, 28
2159 ; GFX9-NEXT:    s_lshr_b32 s14, s1, 24
2160 ; GFX9-NEXT:    v_and_b32_e32 v3, s2, v3
2161 ; GFX9-NEXT:    v_or_b32_sdwa v5, v5, v6 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2162 ; GFX9-NEXT:    v_lshlrev_b16_e64 v8, 12, s7
2163 ; GFX9-NEXT:    v_lshlrev_b16_e64 v9, 12, s6
2164 ; GFX9-NEXT:    v_lshlrev_b16_e64 v15, 12, s14
2165 ; GFX9-NEXT:    v_lshlrev_b16_e64 v16, 12, s13
2166 ; GFX9-NEXT:    v_or_b32_e32 v5, v3, v5
2167 ; GFX9-NEXT:    v_ashrrev_i16_e32 v10, 12, v10
2168 ; GFX9-NEXT:    v_ashrrev_i16_e32 v17, 12, v17
2169 ; GFX9-NEXT:    v_ashrrev_i16_e32 v11, 12, v11
2170 ; GFX9-NEXT:    v_ashrrev_i16_e32 v18, 12, v18
2171 ; GFX9-NEXT:    v_ashrrev_i16_e32 v8, 12, v8
2172 ; GFX9-NEXT:    v_ashrrev_i16_e32 v15, 12, v15
2173 ; GFX9-NEXT:    v_ashrrev_i16_e32 v9, 12, v9
2174 ; GFX9-NEXT:    v_ashrrev_i16_e32 v16, 12, v16
2175 ; GFX9-NEXT:    v_mul_lo_u16_sdwa v4, v11, v18 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2176 ; GFX9-NEXT:    v_mul_lo_u16_e32 v10, v10, v17
2177 ; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 8, v5
2178 ; GFX9-NEXT:    v_or_b32_sdwa v4, v10, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2179 ; GFX9-NEXT:    v_mul_lo_u16_sdwa v9, v9, v16 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2180 ; GFX9-NEXT:    v_mul_lo_u16_e32 v8, v8, v15
2181 ; GFX9-NEXT:    v_or_b32_sdwa v8, v8, v9 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2182 ; GFX9-NEXT:    v_and_b32_e32 v4, s2, v4
2183 ; GFX9-NEXT:    v_or_b32_e32 v6, v4, v8
2184 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2185 ; GFX9-NEXT:    v_add_u32_e32 v2, v3, v2
2186 ; GFX9-NEXT:    v_add_u32_e32 v2, v2, v7
2187 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_2
2188 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3
2189 ; GFX9-NEXT:    v_add_u32_e32 v2, v2, v4
2190 ; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 8, v6
2191 ; GFX9-NEXT:    v_add_u32_e32 v2, v2, v3
2192 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2193 ; GFX9-NEXT:    v_add_u32_sdwa v2, v2, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3
2194 ; GFX9-NEXT:    global_store_byte v[0:1], v2, off
2195 ; GFX9-NEXT:    s_endpgm
2197 ; GFX9-DL-LABEL: idot8_acc8_vecMul:
2198 ; GFX9-DL:       ; %bb.0: ; %entry
2199 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2200 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
2201 ; GFX9-DL-NEXT:    s_mov_b32 s2, 0xffff
2202 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2203 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, s0
2204 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, s1
2205 ; GFX9-DL-NEXT:    global_load_ubyte v2, v[0:1], off
2206 ; GFX9-DL-NEXT:    s_load_dword s0, s[4:5], 0x0
2207 ; GFX9-DL-NEXT:    s_load_dword s1, s[6:7], 0x0
2208 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2209 ; GFX9-DL-NEXT:    s_lshr_b32 s8, s0, 4
2210 ; GFX9-DL-NEXT:    s_lshr_b32 s15, s1, 4
2211 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v3, 12, s0
2212 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v4, 12, s1
2213 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v7, 12, s8
2214 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v14, 12, s15
2215 ; GFX9-DL-NEXT:    s_lshr_b32 s9, s0, 12
2216 ; GFX9-DL-NEXT:    s_lshr_b32 s10, s0, 8
2217 ; GFX9-DL-NEXT:    s_lshr_b32 s16, s1, 12
2218 ; GFX9-DL-NEXT:    s_lshr_b32 s17, s1, 8
2219 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v5, 12, s10
2220 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v6, 12, s9
2221 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v12, 12, s17
2222 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v13, 12, s16
2223 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v3, 12, v3
2224 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v4, 12, v4
2225 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v7, 12, v7
2226 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v14, 12, v14
2227 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v5, 12, v5
2228 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v12, 12, v12
2229 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v6, 12, v6
2230 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v13, 12, v13
2231 ; GFX9-DL-NEXT:    v_mul_lo_u16_e32 v3, v3, v4
2232 ; GFX9-DL-NEXT:    v_mul_lo_u16_sdwa v7, v7, v14 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2233 ; GFX9-DL-NEXT:    v_or_b32_sdwa v3, v3, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2234 ; GFX9-DL-NEXT:    s_lshr_b32 s4, s0, 20
2235 ; GFX9-DL-NEXT:    s_lshr_b32 s5, s0, 16
2236 ; GFX9-DL-NEXT:    s_lshr_b32 s11, s1, 20
2237 ; GFX9-DL-NEXT:    s_lshr_b32 s12, s1, 16
2238 ; GFX9-DL-NEXT:    v_mul_lo_u16_sdwa v6, v6, v13 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2239 ; GFX9-DL-NEXT:    v_mul_lo_u16_e32 v5, v5, v12
2240 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v10, 12, s5
2241 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v11, 12, s4
2242 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v17, 12, s12
2243 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v18, 12, s11
2244 ; GFX9-DL-NEXT:    s_lshr_b32 s6, s0, 28
2245 ; GFX9-DL-NEXT:    s_lshr_b32 s7, s0, 24
2246 ; GFX9-DL-NEXT:    s_lshr_b32 s13, s1, 28
2247 ; GFX9-DL-NEXT:    s_lshr_b32 s14, s1, 24
2248 ; GFX9-DL-NEXT:    v_and_b32_e32 v3, s2, v3
2249 ; GFX9-DL-NEXT:    v_or_b32_sdwa v5, v5, v6 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2250 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v8, 12, s7
2251 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v9, 12, s6
2252 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v15, 12, s14
2253 ; GFX9-DL-NEXT:    v_lshlrev_b16_e64 v16, 12, s13
2254 ; GFX9-DL-NEXT:    v_or_b32_e32 v5, v3, v5
2255 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v10, 12, v10
2256 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v17, 12, v17
2257 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v11, 12, v11
2258 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v18, 12, v18
2259 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v8, 12, v8
2260 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v15, 12, v15
2261 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v9, 12, v9
2262 ; GFX9-DL-NEXT:    v_ashrrev_i16_e32 v16, 12, v16
2263 ; GFX9-DL-NEXT:    v_mul_lo_u16_sdwa v4, v11, v18 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2264 ; GFX9-DL-NEXT:    v_mul_lo_u16_e32 v10, v10, v17
2265 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v7, 8, v5
2266 ; GFX9-DL-NEXT:    v_or_b32_sdwa v4, v10, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2267 ; GFX9-DL-NEXT:    v_mul_lo_u16_sdwa v9, v9, v16 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2268 ; GFX9-DL-NEXT:    v_mul_lo_u16_e32 v8, v8, v15
2269 ; GFX9-DL-NEXT:    v_or_b32_sdwa v8, v8, v9 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2270 ; GFX9-DL-NEXT:    v_and_b32_e32 v4, s2, v4
2271 ; GFX9-DL-NEXT:    v_or_b32_e32 v6, v4, v8
2272 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
2273 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v3, v2
2274 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v2, v7
2275 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_2
2276 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3
2277 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v2, v4
2278 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v3, 8, v6
2279 ; GFX9-DL-NEXT:    v_add_u32_e32 v2, v2, v3
2280 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2281 ; GFX9-DL-NEXT:    v_add_u32_sdwa v2, v2, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3
2282 ; GFX9-DL-NEXT:    global_store_byte v[0:1], v2, off
2283 ; GFX9-DL-NEXT:    s_endpgm
2285 ; GFX10-DL-LABEL: idot8_acc8_vecMul:
2286 ; GFX10-DL:       ; %bb.0: ; %entry
2287 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
2288 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
2289 ; GFX10-DL-NEXT:    s_mov_b32 s2, 0xffff
2290 ; GFX10-DL-NEXT:    ; implicit-def: $vcc_hi
2291 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2292 ; GFX10-DL-NEXT:    s_load_dword s4, s[4:5], 0x0
2293 ; GFX10-DL-NEXT:    s_load_dword s5, s[6:7], 0x0
2294 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s0
2295 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, s1
2296 ; GFX10-DL-NEXT:    global_load_ubyte v2, v[0:1], off
2297 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2298 ; GFX10-DL-NEXT:    s_lshr_b32 s0, s4, 4
2299 ; GFX10-DL-NEXT:    s_lshr_b32 s1, s5, 4
2300 ; GFX10-DL-NEXT:    s_lshr_b32 s6, s4, 12
2301 ; GFX10-DL-NEXT:    s_lshr_b32 s7, s5, 12
2302 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v6, 12, s4
2303 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v3, 12, s0
2304 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v4, 12, s1
2305 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v5, 12, s6
2306 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v7, 12, s7
2307 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v8, 12, s5
2308 ; GFX10-DL-NEXT:    s_lshr_b32 s8, s4, 8
2309 ; GFX10-DL-NEXT:    s_lshr_b32 s0, s5, 8
2310 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v3, 12, v3
2311 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v4, 12, v4
2312 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v5, 12, v5
2313 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v9, 12, s8
2314 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v10, 12, s0
2315 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v7, 12, v7
2316 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v3, v3, v4
2317 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v6, 12, v6
2318 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v8, 12, v8
2319 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v4, 12, v9
2320 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v5, v5, v7
2321 ; GFX10-DL-NEXT:    s_lshr_b32 s0, s4, 20
2322 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v9, 12, v10
2323 ; GFX10-DL-NEXT:    s_lshr_b32 s1, s5, 20
2324 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v6, v6, v8
2325 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v3, 8, v3
2326 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v7, 12, s0
2327 ; GFX10-DL-NEXT:    s_lshr_b32 s8, s5, 16
2328 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v8, 12, s1
2329 ; GFX10-DL-NEXT:    s_lshr_b32 s9, s5, 28
2330 ; GFX10-DL-NEXT:    v_or_b32_sdwa v3, v6, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2331 ; GFX10-DL-NEXT:    s_lshr_b32 s7, s4, 28
2332 ; GFX10-DL-NEXT:    s_lshr_b32 s6, s4, 16
2333 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v4, v4, v9
2334 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v5, 8, v5
2335 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v10, 12, s9
2336 ; GFX10-DL-NEXT:    s_lshr_b32 s0, s4, 24
2337 ; GFX10-DL-NEXT:    s_lshr_b32 s1, s5, 24
2338 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v6, 12, s7
2339 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v9, 12, s6
2340 ; GFX10-DL-NEXT:    v_and_b32_e32 v3, s2, v3
2341 ; GFX10-DL-NEXT:    v_or_b32_sdwa v4, v4, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2342 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v7, 12, v7
2343 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v8, 12, v8
2344 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v13, 12, s8
2345 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v11, 12, s0
2346 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v12, 12, s1
2347 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v15, 12, v9
2348 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v19, 12, v6
2349 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v9, 12, v13
2350 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v10, 12, v10
2351 ; GFX10-DL-NEXT:    v_or_b32_e32 v4, v3, v4
2352 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v7, v7, v8
2353 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v11, 12, v11
2354 ; GFX10-DL-NEXT:    v_ashrrev_i16_e64 v12, 12, v12
2355 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v6, v19, v10
2356 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v5, v15, v9
2357 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v8, 8, v4
2358 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v6, 8, v6
2359 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
2360 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v3, v2
2361 ; GFX10-DL-NEXT:    v_lshlrev_b16_e64 v3, 8, v7
2362 ; GFX10-DL-NEXT:    v_mul_lo_u16_e64 v7, v11, v12
2363 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v2, v8
2364 ; GFX10-DL-NEXT:    v_or_b32_sdwa v3, v5, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2365 ; GFX10-DL-NEXT:    v_or_b32_sdwa v5, v7, v6 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2366 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_2
2367 ; GFX10-DL-NEXT:    v_and_b32_e32 v3, s2, v3
2368 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3
2369 ; GFX10-DL-NEXT:    v_or_b32_e32 v4, v3, v5
2370 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v2, v3
2371 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v3, 8, v4
2372 ; GFX10-DL-NEXT:    v_add_nc_u32_e32 v2, v2, v3
2373 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2374 ; GFX10-DL-NEXT:    v_add_nc_u32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3
2375 ; GFX10-DL-NEXT:    global_store_byte v[0:1], v2, off
2376 ; GFX10-DL-NEXT:    s_endpgm
2377                                              <8 x i4> addrspace(1)* %src2,
2378                                              i8 addrspace(1)* nocapture %dst) {
2379 entry:
2380   %vec1 = load <8 x i4>, <8 x i4> addrspace(1)* %src1
2381   %vec2 = load <8 x i4>, <8 x i4> addrspace(1)* %src2
2383   %cvec1 = sext <8 x i4> %vec1 to <8 x i8>
2384   %cvec2 = sext <8 x i4> %vec2 to <8 x i8>
2386   %mul = mul <8 x i8> %cvec1, %cvec2
2387   %mul0 = extractelement <8 x i8> %mul, i64 0
2388   %mul1 = extractelement <8 x i8> %mul, i64 1
2389   %mul2 = extractelement <8 x i8> %mul, i64 2
2390   %mul3 = extractelement <8 x i8> %mul, i64 3
2391   %mul4 = extractelement <8 x i8> %mul, i64 4
2392   %mul5 = extractelement <8 x i8> %mul, i64 5
2393   %mul6 = extractelement <8 x i8> %mul, i64 6
2394   %mul7 = extractelement <8 x i8> %mul, i64 7
2396   %acc = load i8, i8 addrspace(1)* %dst, align 4
2397   %add1 = add i8 %mul0, %acc
2398   %add2 = add i8 %add1, %mul1
2399   %add3 = add i8 %add2, %mul2
2400   %add4 = add i8 %add3, %mul3
2401   %add5 = add i8 %add4, %mul4
2402   %add6 = add i8 %add5, %mul5
2403   %add7 = add i8 %add6, %mul6
2404   %add8 = add i8 %add7, %mul7
2406   store i8 %add8, i8 addrspace(1)* %dst, align 4
2407   ret void