[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.mulo.ll
blobab527481235ca9484a60f70711c829cf1d64cb05
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck --check-prefix=SI %s
3 ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck --check-prefix=GFX9 %s
4 ; RUN: llc -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck --check-prefix=GFX10 %s
5 ; RUN: llc -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck --check-prefix=GFX11 %s
7 define { i64, i1 } @umulo_i64_v_v(i64 %x, i64 %y) {
8 ; SI-LABEL: umulo_i64_v_v:
9 ; SI:       ; %bb.0: ; %bb
10 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
11 ; SI-NEXT:    v_mul_hi_u32 v4, v1, v2
12 ; SI-NEXT:    v_mul_lo_u32 v5, v1, v2
13 ; SI-NEXT:    v_mul_hi_u32 v6, v0, v3
14 ; SI-NEXT:    v_mul_lo_u32 v7, v0, v3
15 ; SI-NEXT:    v_mul_hi_u32 v8, v0, v2
16 ; SI-NEXT:    v_mul_hi_u32 v9, v1, v3
17 ; SI-NEXT:    v_mul_lo_u32 v3, v1, v3
18 ; SI-NEXT:    v_mul_lo_u32 v0, v0, v2
19 ; SI-NEXT:    v_add_i32_e32 v1, vcc, v8, v7
20 ; SI-NEXT:    v_addc_u32_e32 v2, vcc, 0, v6, vcc
21 ; SI-NEXT:    v_add_i32_e32 v6, vcc, v1, v5
22 ; SI-NEXT:    v_add_i32_e64 v1, s[4:5], v1, v5
23 ; SI-NEXT:    v_addc_u32_e32 v2, vcc, v2, v4, vcc
24 ; SI-NEXT:    v_addc_u32_e32 v4, vcc, 0, v9, vcc
25 ; SI-NEXT:    v_add_i32_e32 v2, vcc, v2, v3
26 ; SI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v4, vcc
27 ; SI-NEXT:    v_cmp_ne_u64_e32 vcc, 0, v[2:3]
28 ; SI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
29 ; SI-NEXT:    s_setpc_b64 s[30:31]
31 ; GFX9-LABEL: umulo_i64_v_v:
32 ; GFX9:       ; %bb.0: ; %bb
33 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
34 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
35 ; GFX9-NEXT:    v_mov_b32_e32 v4, v1
36 ; GFX9-NEXT:    v_mad_u64_u32 v[0:1], s[4:5], v5, v2, 0
37 ; GFX9-NEXT:    v_mad_u64_u32 v[5:6], s[4:5], v5, v3, 0
38 ; GFX9-NEXT:    v_mad_u64_u32 v[7:8], s[4:5], v4, v2, 0
39 ; GFX9-NEXT:    v_mov_b32_e32 v2, v1
40 ; GFX9-NEXT:    v_add_co_u32_e32 v9, vcc, v2, v5
41 ; GFX9-NEXT:    v_mad_u64_u32 v[2:3], s[4:5], v4, v3, 0
42 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
43 ; GFX9-NEXT:    v_add_co_u32_e32 v4, vcc, v9, v7
44 ; GFX9-NEXT:    v_addc_co_u32_e32 v4, vcc, v6, v8, vcc
45 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
46 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, v4, v2
47 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
48 ; GFX9-NEXT:    v_cmp_ne_u64_e32 vcc, 0, v[2:3]
49 ; GFX9-NEXT:    v_add3_u32 v1, v1, v5, v7
50 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
51 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
53 ; GFX10-LABEL: umulo_i64_v_v:
54 ; GFX10:       ; %bb.0: ; %bb
55 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
56 ; GFX10-NEXT:    v_mov_b32_e32 v4, v0
57 ; GFX10-NEXT:    v_mov_b32_e32 v5, v1
58 ; GFX10-NEXT:    v_mad_u64_u32 v[0:1], s4, v4, v2, 0
59 ; GFX10-NEXT:    v_mad_u64_u32 v[6:7], s4, v4, v3, 0
60 ; GFX10-NEXT:    v_mad_u64_u32 v[8:9], s4, v5, v2, 0
61 ; GFX10-NEXT:    v_mad_u64_u32 v[2:3], s4, v5, v3, 0
62 ; GFX10-NEXT:    v_mov_b32_e32 v4, v1
63 ; GFX10-NEXT:    v_add3_u32 v1, v1, v6, v8
64 ; GFX10-NEXT:    v_add_co_u32 v4, vcc_lo, v4, v6
65 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v5, vcc_lo, 0, v7, vcc_lo
66 ; GFX10-NEXT:    v_add_co_u32 v4, vcc_lo, v4, v8
67 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v4, vcc_lo, v5, v9, vcc_lo
68 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
69 ; GFX10-NEXT:    v_add_co_u32 v2, vcc_lo, v4, v2
70 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
71 ; GFX10-NEXT:    v_cmp_ne_u64_e32 vcc_lo, 0, v[2:3]
72 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
73 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
75 ; GFX11-LABEL: umulo_i64_v_v:
76 ; GFX11:       ; %bb.0: ; %bb
77 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
78 ; GFX11-NEXT:    v_dual_mov_b32 v4, v0 :: v_dual_mov_b32 v5, v1
79 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_3)
80 ; GFX11-NEXT:    v_mad_u64_u32 v[0:1], null, v4, v2, 0
81 ; GFX11-NEXT:    v_mad_u64_u32 v[6:7], null, v4, v3, 0
82 ; GFX11-NEXT:    v_mad_u64_u32 v[8:9], null, v5, v2, 0
83 ; GFX11-NEXT:    v_mad_u64_u32 v[10:11], null, v5, v3, 0
84 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3)
85 ; GFX11-NEXT:    v_mov_b32_e32 v4, v1
86 ; GFX11-NEXT:    v_add3_u32 v1, v1, v6, v8
87 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
88 ; GFX11-NEXT:    v_add_co_u32 v2, vcc_lo, v4, v6
89 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v7, vcc_lo
90 ; GFX11-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v8
91 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
92 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v2, vcc_lo, v3, v9, vcc_lo
93 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v11, vcc_lo
94 ; GFX11-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v10
95 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
96 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
97 ; GFX11-NEXT:    v_cmp_ne_u64_e32 vcc_lo, 0, v[2:3]
98 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
99 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
101   %umulo = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %x, i64 %y)
102   ret { i64, i1 } %umulo
105 define { i64, i1 } @smulo_i64_v_v(i64 %x, i64 %y) {
106 ; SI-LABEL: smulo_i64_v_v:
107 ; SI:       ; %bb.0: ; %bb
108 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
109 ; SI-NEXT:    v_mul_hi_u32 v6, v1, v2
110 ; SI-NEXT:    v_mul_lo_u32 v5, v1, v2
111 ; SI-NEXT:    v_mul_hi_u32 v7, v0, v3
112 ; SI-NEXT:    v_mul_lo_u32 v8, v0, v3
113 ; SI-NEXT:    v_mul_hi_u32 v9, v0, v2
114 ; SI-NEXT:    v_mul_hi_i32 v10, v1, v3
115 ; SI-NEXT:    v_mul_lo_u32 v11, v1, v3
116 ; SI-NEXT:    v_mul_lo_u32 v4, v0, v2
117 ; SI-NEXT:    v_add_i32_e32 v8, vcc, v9, v8
118 ; SI-NEXT:    v_addc_u32_e32 v7, vcc, 0, v7, vcc
119 ; SI-NEXT:    v_add_i32_e32 v9, vcc, v8, v5
120 ; SI-NEXT:    v_add_i32_e64 v5, s[4:5], v8, v5
121 ; SI-NEXT:    v_addc_u32_e32 v8, vcc, v7, v6, vcc
122 ; SI-NEXT:    v_ashrrev_i32_e32 v6, 31, v5
123 ; SI-NEXT:    v_addc_u32_e32 v9, vcc, 0, v10, vcc
124 ; SI-NEXT:    v_mov_b32_e32 v7, v6
125 ; SI-NEXT:    v_add_i32_e32 v8, vcc, v8, v11
126 ; SI-NEXT:    v_addc_u32_e32 v9, vcc, 0, v9, vcc
127 ; SI-NEXT:    v_sub_i32_e32 v2, vcc, v8, v2
128 ; SI-NEXT:    v_subbrev_u32_e32 v10, vcc, 0, v9, vcc
129 ; SI-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v1
130 ; SI-NEXT:    v_cndmask_b32_e32 v1, v9, v10, vcc
131 ; SI-NEXT:    v_cndmask_b32_e32 v2, v8, v2, vcc
132 ; SI-NEXT:    v_sub_i32_e32 v0, vcc, v2, v0
133 ; SI-NEXT:    v_subbrev_u32_e32 v8, vcc, 0, v1, vcc
134 ; SI-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v3
135 ; SI-NEXT:    v_cndmask_b32_e32 v1, v1, v8, vcc
136 ; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc
137 ; SI-NEXT:    v_cmp_ne_u64_e32 vcc, v[0:1], v[6:7]
138 ; SI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
139 ; SI-NEXT:    v_mov_b32_e32 v0, v4
140 ; SI-NEXT:    v_mov_b32_e32 v1, v5
141 ; SI-NEXT:    s_setpc_b64 s[30:31]
143 ; GFX9-LABEL: smulo_i64_v_v:
144 ; GFX9:       ; %bb.0: ; %bb
145 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
146 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
147 ; GFX9-NEXT:    v_mov_b32_e32 v4, v1
148 ; GFX9-NEXT:    v_mad_u64_u32 v[0:1], s[4:5], v5, v2, 0
149 ; GFX9-NEXT:    v_mad_u64_u32 v[6:7], s[4:5], v5, v3, 0
150 ; GFX9-NEXT:    v_mad_u64_u32 v[8:9], s[4:5], v4, v2, 0
151 ; GFX9-NEXT:    v_mov_b32_e32 v10, v1
152 ; GFX9-NEXT:    v_add_co_u32_e32 v12, vcc, v10, v6
153 ; GFX9-NEXT:    v_mad_i64_i32 v[10:11], s[4:5], v4, v3, 0
154 ; GFX9-NEXT:    v_addc_co_u32_e32 v7, vcc, 0, v7, vcc
155 ; GFX9-NEXT:    v_add_co_u32_e32 v12, vcc, v12, v8
156 ; GFX9-NEXT:    v_addc_co_u32_e32 v7, vcc, v7, v9, vcc
157 ; GFX9-NEXT:    v_addc_co_u32_e32 v9, vcc, 0, v11, vcc
158 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, v7, v10
159 ; GFX9-NEXT:    v_addc_co_u32_e32 v9, vcc, 0, v9, vcc
160 ; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, v7, v2
161 ; GFX9-NEXT:    v_subbrev_co_u32_e32 v10, vcc, 0, v9, vcc
162 ; GFX9-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v4
163 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v7, v2, vcc
164 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v9, v10, vcc
165 ; GFX9-NEXT:    v_sub_co_u32_e32 v5, vcc, v2, v5
166 ; GFX9-NEXT:    v_subbrev_co_u32_e32 v7, vcc, 0, v4, vcc
167 ; GFX9-NEXT:    v_cmp_gt_i32_e32 vcc, 0, v3
168 ; GFX9-NEXT:    v_add3_u32 v1, v1, v6, v8
169 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v4, v7, vcc
170 ; GFX9-NEXT:    v_ashrrev_i32_e32 v4, 31, v1
171 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
172 ; GFX9-NEXT:    v_mov_b32_e32 v5, v4
173 ; GFX9-NEXT:    v_cmp_ne_u64_e32 vcc, v[2:3], v[4:5]
174 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
175 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
177 ; GFX10-LABEL: smulo_i64_v_v:
178 ; GFX10:       ; %bb.0: ; %bb
179 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
180 ; GFX10-NEXT:    v_mov_b32_e32 v4, v0
181 ; GFX10-NEXT:    v_mov_b32_e32 v5, v1
182 ; GFX10-NEXT:    v_mad_u64_u32 v[0:1], s4, v4, v2, 0
183 ; GFX10-NEXT:    v_mad_u64_u32 v[6:7], s4, v4, v3, 0
184 ; GFX10-NEXT:    v_mad_u64_u32 v[9:10], s4, v5, v2, 0
185 ; GFX10-NEXT:    v_mad_i64_i32 v[11:12], s4, v5, v3, 0
186 ; GFX10-NEXT:    v_mov_b32_e32 v8, v1
187 ; GFX10-NEXT:    v_add3_u32 v1, v1, v6, v9
188 ; GFX10-NEXT:    v_add_co_u32 v8, vcc_lo, v8, v6
189 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v7, vcc_lo, 0, v7, vcc_lo
190 ; GFX10-NEXT:    v_add_co_u32 v8, vcc_lo, v8, v9
191 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v7, vcc_lo, v7, v10, vcc_lo
192 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v8, vcc_lo, 0, v12, vcc_lo
193 ; GFX10-NEXT:    v_add_co_u32 v7, vcc_lo, v7, v11
194 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v8, vcc_lo, 0, v8, vcc_lo
195 ; GFX10-NEXT:    v_sub_co_u32 v2, vcc_lo, v7, v2
196 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v10, vcc_lo, 0, v8, vcc_lo
197 ; GFX10-NEXT:    v_cmp_gt_i32_e32 vcc_lo, 0, v5
198 ; GFX10-NEXT:    v_cndmask_b32_e32 v6, v7, v2, vcc_lo
199 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v8, v10, vcc_lo
200 ; GFX10-NEXT:    v_ashrrev_i32_e32 v2, 31, v1
201 ; GFX10-NEXT:    v_sub_co_u32 v4, vcc_lo, v6, v4
202 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v7, vcc_lo, 0, v5, vcc_lo
203 ; GFX10-NEXT:    v_cmp_gt_i32_e32 vcc_lo, 0, v3
204 ; GFX10-NEXT:    v_mov_b32_e32 v3, v2
205 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v5, v7, vcc_lo
206 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v6, v4, vcc_lo
207 ; GFX10-NEXT:    v_cmp_ne_u64_e32 vcc_lo, v[4:5], v[2:3]
208 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
209 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
211 ; GFX11-LABEL: smulo_i64_v_v:
212 ; GFX11:       ; %bb.0: ; %bb
213 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
214 ; GFX11-NEXT:    v_dual_mov_b32 v4, v0 :: v_dual_mov_b32 v5, v1
215 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_3)
216 ; GFX11-NEXT:    v_mad_u64_u32 v[0:1], null, v4, v2, 0
217 ; GFX11-NEXT:    v_mad_u64_u32 v[6:7], null, v4, v3, 0
218 ; GFX11-NEXT:    v_mad_u64_u32 v[9:10], null, v5, v2, 0
219 ; GFX11-NEXT:    v_mad_i64_i32 v[11:12], null, v5, v3, 0
220 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3)
221 ; GFX11-NEXT:    v_mov_b32_e32 v8, v1
222 ; GFX11-NEXT:    v_add3_u32 v1, v1, v6, v9
223 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
224 ; GFX11-NEXT:    v_add_co_u32 v8, vcc_lo, v8, v6
225 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v7, vcc_lo, 0, v7, vcc_lo
226 ; GFX11-NEXT:    v_add_co_u32 v8, vcc_lo, v8, v9
227 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
228 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v7, vcc_lo, v7, v10, vcc_lo
229 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v8, vcc_lo, 0, v12, vcc_lo
230 ; GFX11-NEXT:    v_add_co_u32 v7, vcc_lo, v7, v11
231 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
232 ; GFX11-NEXT:    v_add_co_ci_u32_e32 v8, vcc_lo, 0, v8, vcc_lo
233 ; GFX11-NEXT:    v_sub_co_u32 v2, vcc_lo, v7, v2
234 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
235 ; GFX11-NEXT:    v_subrev_co_ci_u32_e32 v10, vcc_lo, 0, v8, vcc_lo
236 ; GFX11-NEXT:    v_cmp_gt_i32_e32 vcc_lo, 0, v5
237 ; GFX11-NEXT:    v_cndmask_b32_e32 v6, v7, v2, vcc_lo
238 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3)
239 ; GFX11-NEXT:    v_cndmask_b32_e32 v5, v8, v10, vcc_lo
240 ; GFX11-NEXT:    v_ashrrev_i32_e32 v2, 31, v1
241 ; GFX11-NEXT:    v_sub_co_u32 v4, vcc_lo, v6, v4
242 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4)
243 ; GFX11-NEXT:    v_subrev_co_ci_u32_e32 v7, vcc_lo, 0, v5, vcc_lo
244 ; GFX11-NEXT:    v_cmp_gt_i32_e32 vcc_lo, 0, v3
245 ; GFX11-NEXT:    v_mov_b32_e32 v3, v2
246 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
247 ; GFX11-NEXT:    v_dual_cndmask_b32 v4, v6, v4 :: v_dual_cndmask_b32 v5, v5, v7
248 ; GFX11-NEXT:    v_cmp_ne_u64_e32 vcc_lo, v[4:5], v[2:3]
249 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
250 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
252   %smulo = tail call { i64, i1 } @llvm.smul.with.overflow.i64(i64 %x, i64 %y)
253   ret { i64, i1 } %smulo
256 define amdgpu_kernel void @umulo_i64_s(i64 %x, i64 %y) {
257 ; SI-LABEL: umulo_i64_s:
258 ; SI:       ; %bb.0: ; %bb
259 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
260 ; SI-NEXT:    s_mov_b32 s7, 0xf000
261 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
262 ; SI-NEXT:    v_mov_b32_e32 v0, s2
263 ; SI-NEXT:    v_mul_hi_u32 v1, s1, v0
264 ; SI-NEXT:    s_mul_i32 s4, s1, s2
265 ; SI-NEXT:    v_mov_b32_e32 v2, s3
266 ; SI-NEXT:    v_mul_hi_u32 v3, s0, v2
267 ; SI-NEXT:    s_mul_i32 s5, s0, s3
268 ; SI-NEXT:    v_mul_hi_u32 v0, s0, v0
269 ; SI-NEXT:    v_mul_hi_u32 v2, s1, v2
270 ; SI-NEXT:    s_mul_i32 s1, s1, s3
271 ; SI-NEXT:    s_mul_i32 s2, s0, s2
272 ; SI-NEXT:    v_add_i32_e32 v4, vcc, s5, v0
273 ; SI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
274 ; SI-NEXT:    v_add_i32_e32 v4, vcc, s4, v4
275 ; SI-NEXT:    v_addc_u32_e32 v1, vcc, v3, v1, vcc
276 ; SI-NEXT:    v_addc_u32_e32 v2, vcc, 0, v2, vcc
277 ; SI-NEXT:    v_add_i32_e32 v3, vcc, s5, v0
278 ; SI-NEXT:    v_add_i32_e32 v0, vcc, s1, v1
279 ; SI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
280 ; SI-NEXT:    v_add_i32_e32 v2, vcc, s4, v3
281 ; SI-NEXT:    v_cmp_ne_u64_e32 vcc, 0, v[0:1]
282 ; SI-NEXT:    v_cndmask_b32_e64 v1, v2, 0, vcc
283 ; SI-NEXT:    s_and_b64 s[0:1], vcc, exec
284 ; SI-NEXT:    s_cselect_b32 s0, 0, s2
285 ; SI-NEXT:    s_mov_b32 s6, -1
286 ; SI-NEXT:    v_mov_b32_e32 v0, s0
287 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
288 ; SI-NEXT:    s_endpgm
290 ; GFX9-LABEL: umulo_i64_s:
291 ; GFX9:       ; %bb.0: ; %bb
292 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
293 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
294 ; GFX9-NEXT:    s_mul_i32 s7, s0, s3
295 ; GFX9-NEXT:    s_mul_hi_u32 s8, s0, s2
296 ; GFX9-NEXT:    s_mul_hi_u32 s5, s0, s3
297 ; GFX9-NEXT:    s_add_u32 s9, s8, s7
298 ; GFX9-NEXT:    s_mul_i32 s6, s1, s2
299 ; GFX9-NEXT:    s_addc_u32 s5, 0, s5
300 ; GFX9-NEXT:    s_mul_hi_u32 s4, s1, s2
301 ; GFX9-NEXT:    s_add_u32 s9, s9, s6
302 ; GFX9-NEXT:    s_mul_hi_u32 s10, s1, s3
303 ; GFX9-NEXT:    s_addc_u32 s4, s5, s4
304 ; GFX9-NEXT:    s_addc_u32 s5, s10, 0
305 ; GFX9-NEXT:    s_mul_i32 s1, s1, s3
306 ; GFX9-NEXT:    s_add_u32 s4, s4, s1
307 ; GFX9-NEXT:    s_addc_u32 s5, 0, s5
308 ; GFX9-NEXT:    s_add_i32 s1, s8, s7
309 ; GFX9-NEXT:    s_add_i32 s1, s1, s6
310 ; GFX9-NEXT:    s_mul_i32 s0, s0, s2
311 ; GFX9-NEXT:    s_cmp_lg_u64 s[4:5], 0
312 ; GFX9-NEXT:    s_cselect_b32 s1, 0, s1
313 ; GFX9-NEXT:    s_cselect_b32 s0, 0, s0
314 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
315 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
316 ; GFX9-NEXT:    global_store_dwordx2 v[0:1], v[0:1], off
317 ; GFX9-NEXT:    s_endpgm
319 ; GFX10-LABEL: umulo_i64_s:
320 ; GFX10:       ; %bb.0: ; %bb
321 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
322 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
323 ; GFX10-NEXT:    s_mul_i32 s7, s0, s3
324 ; GFX10-NEXT:    s_mul_hi_u32 s8, s0, s2
325 ; GFX10-NEXT:    s_mul_hi_u32 s5, s0, s3
326 ; GFX10-NEXT:    s_mul_hi_u32 s4, s1, s2
327 ; GFX10-NEXT:    s_mul_i32 s6, s1, s2
328 ; GFX10-NEXT:    s_mul_hi_u32 s9, s1, s3
329 ; GFX10-NEXT:    s_mul_i32 s1, s1, s3
330 ; GFX10-NEXT:    s_add_u32 s3, s8, s7
331 ; GFX10-NEXT:    s_addc_u32 s5, 0, s5
332 ; GFX10-NEXT:    s_add_u32 s3, s3, s6
333 ; GFX10-NEXT:    s_addc_u32 s3, s5, s4
334 ; GFX10-NEXT:    s_addc_u32 s5, s9, 0
335 ; GFX10-NEXT:    s_add_u32 s4, s3, s1
336 ; GFX10-NEXT:    s_addc_u32 s5, 0, s5
337 ; GFX10-NEXT:    s_add_i32 s1, s8, s7
338 ; GFX10-NEXT:    s_mul_i32 s0, s0, s2
339 ; GFX10-NEXT:    s_add_i32 s1, s1, s6
340 ; GFX10-NEXT:    s_cmp_lg_u64 s[4:5], 0
341 ; GFX10-NEXT:    s_cselect_b32 s0, 0, s0
342 ; GFX10-NEXT:    s_cselect_b32 s1, 0, s1
343 ; GFX10-NEXT:    v_mov_b32_e32 v0, s0
344 ; GFX10-NEXT:    v_mov_b32_e32 v1, s1
345 ; GFX10-NEXT:    global_store_dwordx2 v[0:1], v[0:1], off
346 ; GFX10-NEXT:    s_endpgm
348 ; GFX11-LABEL: umulo_i64_s:
349 ; GFX11:       ; %bb.0: ; %bb
350 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
351 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
352 ; GFX11-NEXT:    s_mul_i32 s7, s0, s3
353 ; GFX11-NEXT:    s_mul_hi_u32 s8, s0, s2
354 ; GFX11-NEXT:    s_mul_hi_u32 s5, s0, s3
355 ; GFX11-NEXT:    s_mul_hi_u32 s4, s1, s2
356 ; GFX11-NEXT:    s_mul_i32 s6, s1, s2
357 ; GFX11-NEXT:    s_mul_hi_u32 s9, s1, s3
358 ; GFX11-NEXT:    s_mul_i32 s1, s1, s3
359 ; GFX11-NEXT:    s_add_u32 s3, s8, s7
360 ; GFX11-NEXT:    s_addc_u32 s5, 0, s5
361 ; GFX11-NEXT:    s_add_u32 s3, s3, s6
362 ; GFX11-NEXT:    s_addc_u32 s3, s5, s4
363 ; GFX11-NEXT:    s_addc_u32 s5, s9, 0
364 ; GFX11-NEXT:    s_add_u32 s4, s3, s1
365 ; GFX11-NEXT:    s_addc_u32 s5, 0, s5
366 ; GFX11-NEXT:    s_add_i32 s1, s8, s7
367 ; GFX11-NEXT:    s_mul_i32 s0, s0, s2
368 ; GFX11-NEXT:    s_add_i32 s1, s1, s6
369 ; GFX11-NEXT:    s_cmp_lg_u64 s[4:5], 0
370 ; GFX11-NEXT:    s_cselect_b32 s0, 0, s0
371 ; GFX11-NEXT:    s_cselect_b32 s1, 0, s1
372 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
373 ; GFX11-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1
374 ; GFX11-NEXT:    global_store_b64 v[0:1], v[0:1], off
375 ; GFX11-NEXT:    s_nop 0
376 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
377 ; GFX11-NEXT:    s_endpgm
379   %umulo = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %x, i64 %y)
380   %mul = extractvalue { i64, i1 } %umulo, 0
381   %overflow = extractvalue { i64, i1 } %umulo, 1
382   %res = select i1 %overflow, i64 0, i64 %mul
383   store i64 %res, ptr addrspace(1) undef
384   ret void
387 define amdgpu_kernel void @smulo_i64_s(i64 %x, i64 %y) {
388 ; SI-LABEL: smulo_i64_s:
389 ; SI:       ; %bb.0: ; %bb
390 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
391 ; SI-NEXT:    s_mov_b32 s7, 0xf000
392 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
393 ; SI-NEXT:    v_mov_b32_e32 v0, s2
394 ; SI-NEXT:    v_mul_hi_u32 v1, s1, v0
395 ; SI-NEXT:    s_mul_i32 s4, s1, s2
396 ; SI-NEXT:    v_mov_b32_e32 v2, s3
397 ; SI-NEXT:    v_mul_hi_u32 v3, s0, v2
398 ; SI-NEXT:    s_mul_i32 s5, s0, s3
399 ; SI-NEXT:    v_mul_hi_u32 v0, s0, v0
400 ; SI-NEXT:    v_mul_hi_i32 v2, s1, v2
401 ; SI-NEXT:    s_mul_i32 s6, s1, s3
402 ; SI-NEXT:    s_mul_i32 s8, s0, s2
403 ; SI-NEXT:    v_readfirstlane_b32 s9, v1
404 ; SI-NEXT:    v_readfirstlane_b32 s10, v3
405 ; SI-NEXT:    v_readfirstlane_b32 s11, v0
406 ; SI-NEXT:    v_readfirstlane_b32 s12, v2
407 ; SI-NEXT:    v_add_i32_e32 v0, vcc, s5, v0
408 ; SI-NEXT:    s_add_u32 s5, s11, s5
409 ; SI-NEXT:    v_add_i32_e32 v2, vcc, s4, v0
410 ; SI-NEXT:    s_addc_u32 s10, 0, s10
411 ; SI-NEXT:    v_ashrrev_i32_e32 v0, 31, v2
412 ; SI-NEXT:    s_add_u32 s4, s5, s4
413 ; SI-NEXT:    v_mov_b32_e32 v1, v0
414 ; SI-NEXT:    s_addc_u32 s4, s10, s9
415 ; SI-NEXT:    s_addc_u32 s5, s12, 0
416 ; SI-NEXT:    s_add_u32 s4, s4, s6
417 ; SI-NEXT:    s_addc_u32 s5, 0, s5
418 ; SI-NEXT:    s_sub_u32 s2, s4, s2
419 ; SI-NEXT:    s_subb_u32 s6, s5, 0
420 ; SI-NEXT:    s_cmp_lt_i32 s1, 0
421 ; SI-NEXT:    s_cselect_b32 s1, s6, s5
422 ; SI-NEXT:    s_cselect_b32 s2, s2, s4
423 ; SI-NEXT:    s_sub_u32 s0, s2, s0
424 ; SI-NEXT:    s_subb_u32 s4, s1, 0
425 ; SI-NEXT:    s_cmp_lt_i32 s3, 0
426 ; SI-NEXT:    s_cselect_b32 s1, s4, s1
427 ; SI-NEXT:    s_cselect_b32 s0, s0, s2
428 ; SI-NEXT:    v_cmp_ne_u64_e32 vcc, s[0:1], v[0:1]
429 ; SI-NEXT:    v_cndmask_b32_e64 v1, v2, 0, vcc
430 ; SI-NEXT:    s_and_b64 s[0:1], vcc, exec
431 ; SI-NEXT:    s_cselect_b32 s0, 0, s8
432 ; SI-NEXT:    s_mov_b32 s6, -1
433 ; SI-NEXT:    v_mov_b32_e32 v0, s0
434 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
435 ; SI-NEXT:    s_endpgm
437 ; GFX9-LABEL: smulo_i64_s:
438 ; GFX9:       ; %bb.0: ; %bb
439 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
440 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
441 ; GFX9-NEXT:    s_mul_i32 s7, s0, s3
442 ; GFX9-NEXT:    s_mul_hi_u32 s8, s0, s2
443 ; GFX9-NEXT:    s_mul_hi_u32 s5, s0, s3
444 ; GFX9-NEXT:    s_add_u32 s9, s8, s7
445 ; GFX9-NEXT:    s_mul_i32 s6, s1, s2
446 ; GFX9-NEXT:    s_addc_u32 s5, 0, s5
447 ; GFX9-NEXT:    s_mul_hi_u32 s4, s1, s2
448 ; GFX9-NEXT:    s_add_u32 s9, s9, s6
449 ; GFX9-NEXT:    s_mul_hi_i32 s10, s1, s3
450 ; GFX9-NEXT:    s_addc_u32 s4, s5, s4
451 ; GFX9-NEXT:    s_addc_u32 s5, s10, 0
452 ; GFX9-NEXT:    s_mul_i32 s9, s1, s3
453 ; GFX9-NEXT:    s_add_u32 s4, s4, s9
454 ; GFX9-NEXT:    s_addc_u32 s5, 0, s5
455 ; GFX9-NEXT:    s_sub_u32 s9, s4, s2
456 ; GFX9-NEXT:    s_subb_u32 s10, s5, 0
457 ; GFX9-NEXT:    s_cmp_lt_i32 s1, 0
458 ; GFX9-NEXT:    s_cselect_b32 s4, s9, s4
459 ; GFX9-NEXT:    s_cselect_b32 s1, s10, s5
460 ; GFX9-NEXT:    s_sub_u32 s9, s4, s0
461 ; GFX9-NEXT:    s_subb_u32 s5, s1, 0
462 ; GFX9-NEXT:    s_cmp_lt_i32 s3, 0
463 ; GFX9-NEXT:    s_cselect_b32 s5, s5, s1
464 ; GFX9-NEXT:    s_cselect_b32 s4, s9, s4
465 ; GFX9-NEXT:    s_add_i32 s1, s8, s7
466 ; GFX9-NEXT:    s_add_i32 s1, s1, s6
467 ; GFX9-NEXT:    s_ashr_i32 s6, s1, 31
468 ; GFX9-NEXT:    s_mov_b32 s7, s6
469 ; GFX9-NEXT:    s_mul_i32 s0, s0, s2
470 ; GFX9-NEXT:    s_cmp_lg_u64 s[4:5], s[6:7]
471 ; GFX9-NEXT:    s_cselect_b32 s1, 0, s1
472 ; GFX9-NEXT:    s_cselect_b32 s0, 0, s0
473 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
474 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
475 ; GFX9-NEXT:    global_store_dwordx2 v[0:1], v[0:1], off
476 ; GFX9-NEXT:    s_endpgm
478 ; GFX10-LABEL: smulo_i64_s:
479 ; GFX10:       ; %bb.0: ; %bb
480 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
481 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
482 ; GFX10-NEXT:    s_mul_i32 s7, s0, s3
483 ; GFX10-NEXT:    s_mul_hi_u32 s8, s0, s2
484 ; GFX10-NEXT:    s_mul_hi_u32 s5, s0, s3
485 ; GFX10-NEXT:    s_mul_i32 s6, s1, s2
486 ; GFX10-NEXT:    s_add_u32 s11, s8, s7
487 ; GFX10-NEXT:    s_mul_hi_u32 s4, s1, s2
488 ; GFX10-NEXT:    s_addc_u32 s5, 0, s5
489 ; GFX10-NEXT:    s_mul_hi_i32 s9, s1, s3
490 ; GFX10-NEXT:    s_add_u32 s11, s11, s6
491 ; GFX10-NEXT:    s_mul_i32 s10, s1, s3
492 ; GFX10-NEXT:    s_addc_u32 s4, s5, s4
493 ; GFX10-NEXT:    s_addc_u32 s5, s9, 0
494 ; GFX10-NEXT:    s_add_u32 s4, s4, s10
495 ; GFX10-NEXT:    s_addc_u32 s5, 0, s5
496 ; GFX10-NEXT:    s_sub_u32 s9, s4, s2
497 ; GFX10-NEXT:    s_subb_u32 s10, s5, 0
498 ; GFX10-NEXT:    s_cmp_lt_i32 s1, 0
499 ; GFX10-NEXT:    s_cselect_b32 s1, s9, s4
500 ; GFX10-NEXT:    s_cselect_b32 s4, s10, s5
501 ; GFX10-NEXT:    s_sub_u32 s9, s1, s0
502 ; GFX10-NEXT:    s_subb_u32 s5, s4, 0
503 ; GFX10-NEXT:    s_cmp_lt_i32 s3, 0
504 ; GFX10-NEXT:    s_mul_i32 s0, s0, s2
505 ; GFX10-NEXT:    s_cselect_b32 s5, s5, s4
506 ; GFX10-NEXT:    s_cselect_b32 s4, s9, s1
507 ; GFX10-NEXT:    s_add_i32 s1, s8, s7
508 ; GFX10-NEXT:    s_add_i32 s1, s1, s6
509 ; GFX10-NEXT:    s_ashr_i32 s6, s1, 31
510 ; GFX10-NEXT:    s_mov_b32 s7, s6
511 ; GFX10-NEXT:    s_cmp_lg_u64 s[4:5], s[6:7]
512 ; GFX10-NEXT:    s_cselect_b32 s0, 0, s0
513 ; GFX10-NEXT:    s_cselect_b32 s1, 0, s1
514 ; GFX10-NEXT:    v_mov_b32_e32 v0, s0
515 ; GFX10-NEXT:    v_mov_b32_e32 v1, s1
516 ; GFX10-NEXT:    global_store_dwordx2 v[0:1], v[0:1], off
517 ; GFX10-NEXT:    s_endpgm
519 ; GFX11-LABEL: smulo_i64_s:
520 ; GFX11:       ; %bb.0: ; %bb
521 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
522 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
523 ; GFX11-NEXT:    s_mul_i32 s7, s0, s3
524 ; GFX11-NEXT:    s_mul_hi_u32 s8, s0, s2
525 ; GFX11-NEXT:    s_mul_hi_u32 s5, s0, s3
526 ; GFX11-NEXT:    s_mul_i32 s6, s1, s2
527 ; GFX11-NEXT:    s_add_u32 s11, s8, s7
528 ; GFX11-NEXT:    s_mul_hi_u32 s4, s1, s2
529 ; GFX11-NEXT:    s_addc_u32 s5, 0, s5
530 ; GFX11-NEXT:    s_mul_hi_i32 s9, s1, s3
531 ; GFX11-NEXT:    s_add_u32 s11, s11, s6
532 ; GFX11-NEXT:    s_mul_i32 s10, s1, s3
533 ; GFX11-NEXT:    s_addc_u32 s4, s5, s4
534 ; GFX11-NEXT:    s_addc_u32 s5, s9, 0
535 ; GFX11-NEXT:    s_add_u32 s4, s4, s10
536 ; GFX11-NEXT:    s_addc_u32 s5, 0, s5
537 ; GFX11-NEXT:    s_sub_u32 s9, s4, s2
538 ; GFX11-NEXT:    s_subb_u32 s10, s5, 0
539 ; GFX11-NEXT:    s_cmp_lt_i32 s1, 0
540 ; GFX11-NEXT:    s_cselect_b32 s1, s9, s4
541 ; GFX11-NEXT:    s_cselect_b32 s4, s10, s5
542 ; GFX11-NEXT:    s_sub_u32 s9, s1, s0
543 ; GFX11-NEXT:    s_subb_u32 s5, s4, 0
544 ; GFX11-NEXT:    s_cmp_lt_i32 s3, 0
545 ; GFX11-NEXT:    s_mul_i32 s0, s0, s2
546 ; GFX11-NEXT:    s_cselect_b32 s5, s5, s4
547 ; GFX11-NEXT:    s_cselect_b32 s4, s9, s1
548 ; GFX11-NEXT:    s_add_i32 s1, s8, s7
549 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
550 ; GFX11-NEXT:    s_add_i32 s1, s1, s6
551 ; GFX11-NEXT:    s_ashr_i32 s6, s1, 31
552 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
553 ; GFX11-NEXT:    s_mov_b32 s7, s6
554 ; GFX11-NEXT:    s_cmp_lg_u64 s[4:5], s[6:7]
555 ; GFX11-NEXT:    s_cselect_b32 s0, 0, s0
556 ; GFX11-NEXT:    s_cselect_b32 s1, 0, s1
557 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
558 ; GFX11-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1
559 ; GFX11-NEXT:    global_store_b64 v[0:1], v[0:1], off
560 ; GFX11-NEXT:    s_nop 0
561 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
562 ; GFX11-NEXT:    s_endpgm
564   %umulo = tail call { i64, i1 } @llvm.smul.with.overflow.i64(i64 %x, i64 %y)
565   %mul = extractvalue { i64, i1 } %umulo, 0
566   %overflow = extractvalue { i64, i1 } %umulo, 1
567   %res = select i1 %overflow, i64 0, i64 %mul
568   store i64 %res, ptr addrspace(1) undef
569   ret void
572 define { i64, i1 } @smulo_i64_v_4(i64 %i) {
573 ; SI-LABEL: smulo_i64_v_4:
574 ; SI:       ; %bb.0: ; %bb
575 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
576 ; SI-NEXT:    v_lshl_b64 v[5:6], v[0:1], 2
577 ; SI-NEXT:    v_alignbit_b32 v4, v1, v0, 30
578 ; SI-NEXT:    v_ashr_i64 v[2:3], v[5:6], 2
579 ; SI-NEXT:    v_cmp_ne_u64_e32 vcc, v[2:3], v[0:1]
580 ; SI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
581 ; SI-NEXT:    v_mov_b32_e32 v0, v5
582 ; SI-NEXT:    v_mov_b32_e32 v1, v4
583 ; SI-NEXT:    s_setpc_b64 s[30:31]
585 ; GFX9-LABEL: smulo_i64_v_4:
586 ; GFX9:       ; %bb.0: ; %bb
587 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
588 ; GFX9-NEXT:    v_lshlrev_b64 v[4:5], 2, v[0:1]
589 ; GFX9-NEXT:    v_alignbit_b32 v3, v1, v0, 30
590 ; GFX9-NEXT:    v_ashrrev_i64 v[5:6], 2, v[4:5]
591 ; GFX9-NEXT:    v_cmp_ne_u64_e32 vcc, v[5:6], v[0:1]
592 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
593 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
594 ; GFX9-NEXT:    v_mov_b32_e32 v1, v3
595 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
597 ; GFX10-LABEL: smulo_i64_v_4:
598 ; GFX10:       ; %bb.0: ; %bb
599 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
600 ; GFX10-NEXT:    v_lshlrev_b64 v[4:5], 2, v[0:1]
601 ; GFX10-NEXT:    v_alignbit_b32 v3, v1, v0, 30
602 ; GFX10-NEXT:    v_ashrrev_i64 v[5:6], 2, v[4:5]
603 ; GFX10-NEXT:    v_cmp_ne_u64_e32 vcc_lo, v[5:6], v[0:1]
604 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
605 ; GFX10-NEXT:    v_mov_b32_e32 v1, v3
606 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
607 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
609 ; GFX11-LABEL: smulo_i64_v_4:
610 ; GFX11:       ; %bb.0: ; %bb
611 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
612 ; GFX11-NEXT:    v_lshlrev_b64 v[4:5], 2, v[0:1]
613 ; GFX11-NEXT:    v_alignbit_b32 v3, v1, v0, 30
614 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
615 ; GFX11-NEXT:    v_ashrrev_i64 v[5:6], 2, v[4:5]
616 ; GFX11-NEXT:    v_cmp_ne_u64_e32 vcc_lo, v[5:6], v[0:1]
617 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3)
618 ; GFX11-NEXT:    v_dual_mov_b32 v0, v4 :: v_dual_mov_b32 v1, v3
619 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
620 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
622   %umulo = tail call { i64, i1 } @llvm.smul.with.overflow.i64(i64 %i, i64 4)
623   ret { i64, i1 } %umulo
626 define { i64, i1 } @umulo_i64_v_4(i64 %i) {
627 ; SI-LABEL: umulo_i64_v_4:
628 ; SI:       ; %bb.0: ; %bb
629 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
630 ; SI-NEXT:    v_and_b32_e32 v7, 0x3fffffff, v1
631 ; SI-NEXT:    v_mov_b32_e32 v6, v0
632 ; SI-NEXT:    v_lshl_b64 v[4:5], v[0:1], 2
633 ; SI-NEXT:    v_alignbit_b32 v3, v1, v0, 30
634 ; SI-NEXT:    v_cmp_ne_u64_e32 vcc, v[6:7], v[0:1]
635 ; SI-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
636 ; SI-NEXT:    v_mov_b32_e32 v0, v4
637 ; SI-NEXT:    v_mov_b32_e32 v1, v3
638 ; SI-NEXT:    s_setpc_b64 s[30:31]
640 ; GFX9-LABEL: umulo_i64_v_4:
641 ; GFX9:       ; %bb.0: ; %bb
642 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
643 ; GFX9-NEXT:    v_and_b32_e32 v7, 0x3fffffff, v1
644 ; GFX9-NEXT:    v_mov_b32_e32 v6, v0
645 ; GFX9-NEXT:    v_lshlrev_b64 v[4:5], 2, v[0:1]
646 ; GFX9-NEXT:    v_cmp_ne_u64_e32 vcc, v[6:7], v[0:1]
647 ; GFX9-NEXT:    v_alignbit_b32 v3, v1, v0, 30
648 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
649 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
650 ; GFX9-NEXT:    v_mov_b32_e32 v1, v3
651 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
653 ; GFX10-LABEL: umulo_i64_v_4:
654 ; GFX10:       ; %bb.0: ; %bb
655 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
656 ; GFX10-NEXT:    v_and_b32_e32 v7, 0x3fffffff, v1
657 ; GFX10-NEXT:    v_mov_b32_e32 v6, v0
658 ; GFX10-NEXT:    v_lshlrev_b64 v[4:5], 2, v[0:1]
659 ; GFX10-NEXT:    v_alignbit_b32 v3, v1, v0, 30
660 ; GFX10-NEXT:    v_cmp_ne_u64_e32 vcc_lo, v[6:7], v[0:1]
661 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
662 ; GFX10-NEXT:    v_mov_b32_e32 v1, v3
663 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
664 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
666 ; GFX11-LABEL: umulo_i64_v_4:
667 ; GFX11:       ; %bb.0: ; %bb
668 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
669 ; GFX11-NEXT:    v_dual_mov_b32 v6, v0 :: v_dual_and_b32 v7, 0x3fffffff, v1
670 ; GFX11-NEXT:    v_lshlrev_b64 v[4:5], 2, v[0:1]
671 ; GFX11-NEXT:    v_alignbit_b32 v3, v1, v0, 30
672 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
673 ; GFX11-NEXT:    v_cmp_ne_u64_e32 vcc_lo, v[6:7], v[0:1]
674 ; GFX11-NEXT:    v_dual_mov_b32 v0, v4 :: v_dual_mov_b32 v1, v3
675 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
676 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
678   %umulo = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %i, i64 4)
679   ret { i64, i1 } %umulo
682 declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64)
683 declare { i64, i1 } @llvm.smul.with.overflow.i64(i64, i64)