Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / SPARC / smulo-128-legalisation-lowering.ll
blobae1de443bce05f183392968ecdb6ef15e08a903d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=sparc-unknown-linux-gnu | FileCheck %s --check-prefixes=SPARC
3 ; RUN: llc < %s -mtriple=sparc64-unknown-linux-gnu | FileCheck %s --check-prefixes=SPARC64
5 define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
6 ; SPARC-LABEL: muloti_test:
7 ; SPARC:         .cfi_startproc
8 ; SPARC-NEXT:  ! %bb.0: ! %start
9 ; SPARC-NEXT:    save %sp, -96, %sp
10 ; SPARC-NEXT:    .cfi_def_cfa_register %fp
11 ; SPARC-NEXT:    .cfi_window_save
12 ; SPARC-NEXT:    .cfi_register %o7, %i7
13 ; SPARC-NEXT:    ld [%fp+96], %l1
14 ; SPARC-NEXT:    mov %i3, %g4
15 ; SPARC-NEXT:    mov %i2, %g2
16 ; SPARC-NEXT:    umul %i3, %l1, %i3
17 ; SPARC-NEXT:    rd %y, %i2
18 ; SPARC-NEXT:    ld [%fp+92], %l2
19 ; SPARC-NEXT:    umul %g2, %l1, %g3
20 ; SPARC-NEXT:    rd %y, %l0
21 ; SPARC-NEXT:    addcc %g3, %i2, %i2
22 ; SPARC-NEXT:    addxcc %l0, 0, %g3
23 ; SPARC-NEXT:    umul %g4, %l2, %l0
24 ; SPARC-NEXT:    rd %y, %l3
25 ; SPARC-NEXT:    addcc %l0, %i2, %i2
26 ; SPARC-NEXT:    addxcc %l3, 0, %l0
27 ; SPARC-NEXT:    addcc %g3, %l0, %g3
28 ; SPARC-NEXT:    addxcc %g0, 0, %l0
29 ; SPARC-NEXT:    umul %g2, %l2, %l3
30 ; SPARC-NEXT:    rd %y, %l4
31 ; SPARC-NEXT:    addcc %l3, %g3, %g3
32 ; SPARC-NEXT:    umul %i1, %l1, %l3
33 ; SPARC-NEXT:    rd %y, %l5
34 ; SPARC-NEXT:    addxcc %l4, %l0, %l0
35 ; SPARC-NEXT:    umul %i0, %l1, %l4
36 ; SPARC-NEXT:    rd %y, %l6
37 ; SPARC-NEXT:    addcc %l4, %l5, %l4
38 ; SPARC-NEXT:    addxcc %l6, 0, %l5
39 ; SPARC-NEXT:    umul %i1, %l2, %l6
40 ; SPARC-NEXT:    rd %y, %l7
41 ; SPARC-NEXT:    addcc %l6, %l4, %l4
42 ; SPARC-NEXT:    addxcc %l7, 0, %l6
43 ; SPARC-NEXT:    addcc %l5, %l6, %l5
44 ; SPARC-NEXT:    addxcc %g0, 0, %l6
45 ; SPARC-NEXT:    umul %i0, %l2, %l7
46 ; SPARC-NEXT:    rd %y, %o0
47 ; SPARC-NEXT:    addcc %l7, %l5, %l5
48 ; SPARC-NEXT:    addxcc %o0, %l6, %l6
49 ; SPARC-NEXT:    addcc %l3, %g3, %g3
50 ; SPARC-NEXT:    addxcc %l4, %l0, %l0
51 ; SPARC-NEXT:    addxcc %l5, 0, %l3
52 ; SPARC-NEXT:    umul %g4, %i5, %l4
53 ; SPARC-NEXT:    rd %y, %l5
54 ; SPARC-NEXT:    addxcc %l6, 0, %l6
55 ; SPARC-NEXT:    umul %g2, %i5, %l7
56 ; SPARC-NEXT:    rd %y, %o0
57 ; SPARC-NEXT:    addcc %l7, %l5, %l5
58 ; SPARC-NEXT:    addxcc %o0, 0, %l7
59 ; SPARC-NEXT:    umul %g4, %i4, %o0
60 ; SPARC-NEXT:    rd %y, %o1
61 ; SPARC-NEXT:    addcc %o0, %l5, %l5
62 ; SPARC-NEXT:    addxcc %o1, 0, %o0
63 ; SPARC-NEXT:    addcc %l7, %o0, %l7
64 ; SPARC-NEXT:    addxcc %g0, 0, %o0
65 ; SPARC-NEXT:    umul %g2, %i4, %o1
66 ; SPARC-NEXT:    rd %y, %o2
67 ; SPARC-NEXT:    addcc %o1, %l7, %l7
68 ; SPARC-NEXT:    addxcc %o2, %o0, %o0
69 ; SPARC-NEXT:    addcc %l4, %g3, %g3
70 ; SPARC-NEXT:    addxcc %l5, %l0, %l0
71 ; SPARC-NEXT:    addxcc %l7, 0, %l4
72 ; SPARC-NEXT:    addxcc %o0, 0, %l5
73 ; SPARC-NEXT:    addcc %l3, %l4, %l3
74 ; SPARC-NEXT:    addxcc %l6, %l5, %l4
75 ; SPARC-NEXT:    addxcc %g0, 0, %l5
76 ; SPARC-NEXT:    umul %i1, %i5, %l6
77 ; SPARC-NEXT:    rd %y, %l7
78 ; SPARC-NEXT:    addxcc %g0, 0, %o0
79 ; SPARC-NEXT:    umul %i0, %i5, %o1
80 ; SPARC-NEXT:    rd %y, %o2
81 ; SPARC-NEXT:    addcc %o1, %l7, %l7
82 ; SPARC-NEXT:    addxcc %o2, 0, %o1
83 ; SPARC-NEXT:    umul %i1, %i4, %o2
84 ; SPARC-NEXT:    rd %y, %o3
85 ; SPARC-NEXT:    addcc %o2, %l7, %l7
86 ; SPARC-NEXT:    addxcc %o3, 0, %o2
87 ; SPARC-NEXT:    addcc %o1, %o2, %o1
88 ; SPARC-NEXT:    addxcc %g0, 0, %o2
89 ; SPARC-NEXT:    umul %i0, %i4, %o3
90 ; SPARC-NEXT:    rd %y, %o4
91 ; SPARC-NEXT:    addcc %o3, %o1, %o1
92 ; SPARC-NEXT:    addxcc %o4, %o2, %o2
93 ; SPARC-NEXT:    addcc %l6, %l3, %l3
94 ; SPARC-NEXT:    addxcc %l7, %l4, %l4
95 ; SPARC-NEXT:    addxcc %o1, %l5, %l5
96 ; SPARC-NEXT:    sra %i0, 31, %l6
97 ; SPARC-NEXT:    smul %l6, %i4, %l7
98 ; SPARC-NEXT:    umul %l6, %i5, %o1
99 ; SPARC-NEXT:    rd %y, %o3
100 ; SPARC-NEXT:    addxcc %o2, %o0, %i5
101 ; SPARC-NEXT:    umul %l2, %l6, %l2
102 ; SPARC-NEXT:    rd %y, %o0
103 ; SPARC-NEXT:    add %o3, %l7, %l7
104 ; SPARC-NEXT:    umul %l1, %l6, %l1
105 ; SPARC-NEXT:    rd %y, %l6
106 ; SPARC-NEXT:    add %l7, %o1, %l7
107 ; SPARC-NEXT:    add %l6, %l2, %o2
108 ; SPARC-NEXT:    add %o2, %l1, %o2
109 ; SPARC-NEXT:    addcc %l1, %o1, %o1
110 ; SPARC-NEXT:    addxcc %o2, %l7, %l7
111 ; SPARC-NEXT:    addcc %l2, %l6, %o2
112 ; SPARC-NEXT:    addxcc %o0, 0, %o3
113 ; SPARC-NEXT:    addcc %l1, %o2, %o2
114 ; SPARC-NEXT:    addxcc %l6, 0, %l6
115 ; SPARC-NEXT:    addcc %o3, %l6, %l6
116 ; SPARC-NEXT:    addxcc %g0, 0, %o3
117 ; SPARC-NEXT:    addcc %l2, %l6, %l2
118 ; SPARC-NEXT:    addxcc %o0, %o3, %l6
119 ; SPARC-NEXT:    addcc %l2, %o1, %l2
120 ; SPARC-NEXT:    sra %i4, 31, %i4
121 ; SPARC-NEXT:    umul %g4, %i4, %g4
122 ; SPARC-NEXT:    rd %y, %o0
123 ; SPARC-NEXT:    addxcc %l6, %l7, %l6
124 ; SPARC-NEXT:    umul %i4, %g2, %g2
125 ; SPARC-NEXT:    rd %y, %l7
126 ; SPARC-NEXT:    add %o0, %g4, %o1
127 ; SPARC-NEXT:    smul %i0, %i4, %i0
128 ; SPARC-NEXT:    umul %i1, %i4, %i1
129 ; SPARC-NEXT:    rd %y, %i4
130 ; SPARC-NEXT:    add %o1, %g2, %o1
131 ; SPARC-NEXT:    add %i4, %i1, %i4
132 ; SPARC-NEXT:    add %i4, %i0, %i0
133 ; SPARC-NEXT:    addcc %i1, %g4, %i1
134 ; SPARC-NEXT:    addxcc %i0, %o1, %i0
135 ; SPARC-NEXT:    addcc %g4, %o0, %i4
136 ; SPARC-NEXT:    addxcc %o0, 0, %o0
137 ; SPARC-NEXT:    addcc %g2, %i4, %i4
138 ; SPARC-NEXT:    addxcc %l7, 0, %o1
139 ; SPARC-NEXT:    addcc %o0, %o1, %o0
140 ; SPARC-NEXT:    addxcc %g0, 0, %o1
141 ; SPARC-NEXT:    addcc %g2, %o0, %g2
142 ; SPARC-NEXT:    addxcc %l7, %o1, %l7
143 ; SPARC-NEXT:    addcc %g2, %i1, %i1
144 ; SPARC-NEXT:    addxcc %l7, %i0, %i0
145 ; SPARC-NEXT:    addcc %g4, %l1, %g2
146 ; SPARC-NEXT:    addxcc %i4, %o2, %i4
147 ; SPARC-NEXT:    addxcc %i1, %l2, %i1
148 ; SPARC-NEXT:    addxcc %i0, %l6, %i0
149 ; SPARC-NEXT:    addcc %l3, %g2, %g2
150 ; SPARC-NEXT:    addxcc %l4, %i4, %i4
151 ; SPARC-NEXT:    addxcc %l5, %i1, %i1
152 ; SPARC-NEXT:    addxcc %i5, %i0, %i0
153 ; SPARC-NEXT:    sra %l0, 31, %i5
154 ; SPARC-NEXT:    xor %i0, %i5, %i0
155 ; SPARC-NEXT:    xor %i4, %i5, %i4
156 ; SPARC-NEXT:    or %i4, %i0, %i0
157 ; SPARC-NEXT:    xor %i1, %i5, %i1
158 ; SPARC-NEXT:    xor %g2, %i5, %i4
159 ; SPARC-NEXT:    or %i4, %i1, %i1
160 ; SPARC-NEXT:    or %i1, %i0, %i0
161 ; SPARC-NEXT:    cmp %i0, 0
162 ; SPARC-NEXT:    bne .LBB0_2
163 ; SPARC-NEXT:    nop
164 ; SPARC-NEXT:  ! %bb.1: ! %start
165 ; SPARC-NEXT:    ba .LBB0_3
166 ; SPARC-NEXT:    mov %g0, %i4
167 ; SPARC-NEXT:  .LBB0_2:
168 ; SPARC-NEXT:    mov 1, %i4
169 ; SPARC-NEXT:  .LBB0_3: ! %start
170 ; SPARC-NEXT:    mov %l0, %i0
171 ; SPARC-NEXT:    ret
172 ; SPARC-NEXT:    restore %g0, %g3, %o1
174 ; SPARC64-LABEL: muloti_test:
175 ; SPARC64:         .cfi_startproc
176 ; SPARC64-NEXT:    .register %g2, #scratch
177 ; SPARC64-NEXT:    .register %g3, #scratch
178 ; SPARC64-NEXT:  ! %bb.0: ! %start
179 ; SPARC64-NEXT:    save %sp, -176, %sp
180 ; SPARC64-NEXT:    .cfi_def_cfa_register %fp
181 ; SPARC64-NEXT:    .cfi_window_save
182 ; SPARC64-NEXT:    .cfi_register %o7, %i7
183 ; SPARC64-NEXT:    mov %i3, %i4
184 ; SPARC64-NEXT:    mov %i1, %i3
185 ; SPARC64-NEXT:    srax %i0, 63, %o2
186 ; SPARC64-NEXT:    mov %i2, %o0
187 ; SPARC64-NEXT:    mov %i4, %o1
188 ; SPARC64-NEXT:    call __multi3
189 ; SPARC64-NEXT:    mov %o2, %o3
190 ; SPARC64-NEXT:    mov %o0, %i1
191 ; SPARC64-NEXT:    mov %o1, %i5
192 ; SPARC64-NEXT:    srax %i2, 63, %o0
193 ; SPARC64-NEXT:    mov %o0, %o1
194 ; SPARC64-NEXT:    mov %i0, %o2
195 ; SPARC64-NEXT:    call __multi3
196 ; SPARC64-NEXT:    mov %i3, %o3
197 ; SPARC64-NEXT:    srlx %i5, 32, %g2
198 ; SPARC64-NEXT:    srlx %o1, 32, %g3
199 ; SPARC64-NEXT:    srlx %i1, 32, %g4
200 ; SPARC64-NEXT:    srlx %o0, 32, %g5
201 ; SPARC64-NEXT:    addcc %o1, %i5, %l0
202 ; SPARC64-NEXT:    addxcc %g3, %g2, %l1
203 ; SPARC64-NEXT:    addxcc %o0, %i1, %l2
204 ; SPARC64-NEXT:    addxcc %g5, %g4, %l3
205 ; SPARC64-NEXT:    mov %g0, %o0
206 ; SPARC64-NEXT:    mov %i3, %o1
207 ; SPARC64-NEXT:    mov %g0, %o2
208 ; SPARC64-NEXT:    call __multi3
209 ; SPARC64-NEXT:    mov %i4, %o3
210 ; SPARC64-NEXT:    mov %o0, %i5
211 ; SPARC64-NEXT:    mov %o1, %i1
212 ; SPARC64-NEXT:    mov %g0, %o0
213 ; SPARC64-NEXT:    mov %i0, %o1
214 ; SPARC64-NEXT:    mov %g0, %o2
215 ; SPARC64-NEXT:    call __multi3
216 ; SPARC64-NEXT:    mov %i4, %o3
217 ; SPARC64-NEXT:    srlx %i5, 32, %i4
218 ; SPARC64-NEXT:    srlx %o1, 32, %g2
219 ; SPARC64-NEXT:    srlx %o0, 32, %g3
220 ; SPARC64-NEXT:    addcc %o1, %i5, %i5
221 ; SPARC64-NEXT:    addxcc %g2, %i4, %i4
222 ; SPARC64-NEXT:    addxcc %o0, 0, %l4
223 ; SPARC64-NEXT:    addxcc %g3, 0, %l5
224 ; SPARC64-NEXT:    mov %g0, %o0
225 ; SPARC64-NEXT:    mov %i3, %o1
226 ; SPARC64-NEXT:    mov %g0, %o2
227 ; SPARC64-NEXT:    call __multi3
228 ; SPARC64-NEXT:    mov %i2, %o3
229 ; SPARC64-NEXT:    srlx %o1, 32, %g2
230 ; SPARC64-NEXT:    srlx %o0, 32, %g3
231 ; SPARC64-NEXT:    addcc %o1, %i5, %i3
232 ; SPARC64-NEXT:    addxcc %g2, %i4, %i4
233 ; SPARC64-NEXT:    addxcc %o0, 0, %i5
234 ; SPARC64-NEXT:    addxcc %g3, 0, %g2
235 ; SPARC64-NEXT:    addcc %l4, %i5, %i5
236 ; SPARC64-NEXT:    addxcc %l5, %g2, %l4
237 ; SPARC64-NEXT:    addxcc %g0, 0, %l5
238 ; SPARC64-NEXT:    addxcc %g0, 0, %l6
239 ; SPARC64-NEXT:    mov %g0, %o0
240 ; SPARC64-NEXT:    mov %i0, %o1
241 ; SPARC64-NEXT:    mov %g0, %o2
242 ; SPARC64-NEXT:    call __multi3
243 ; SPARC64-NEXT:    mov %i2, %o3
244 ; SPARC64-NEXT:    mov %g0, %i2
245 ; SPARC64-NEXT:    srlx %o1, 32, %i0
246 ; SPARC64-NEXT:    addcc %o1, %i5, %i5
247 ; SPARC64-NEXT:    srlx %o0, 32, %g2
248 ; SPARC64-NEXT:    addxcc %i0, %l4, %i0
249 ; SPARC64-NEXT:    addxcc %o0, %l5, %g3
250 ; SPARC64-NEXT:    addxcc %g2, %l6, %g2
251 ; SPARC64-NEXT:    addcc %i5, %l0, %i5
252 ; SPARC64-NEXT:    addxcc %i0, %l1, %i0
253 ; SPARC64-NEXT:    addxcc %g3, %l2, %g3
254 ; SPARC64-NEXT:    addxcc %g2, %l3, %g2
255 ; SPARC64-NEXT:    srl %g3, 0, %g3
256 ; SPARC64-NEXT:    sllx %g2, 32, %g2
257 ; SPARC64-NEXT:    or %g2, %g3, %g2
258 ; SPARC64-NEXT:    sllx %i4, 32, %i4
259 ; SPARC64-NEXT:    srax %i4, 63, %g3
260 ; SPARC64-NEXT:    xor %g2, %g3, %g2
261 ; SPARC64-NEXT:    srl %i5, 0, %i5
262 ; SPARC64-NEXT:    sllx %i0, 32, %i0
263 ; SPARC64-NEXT:    or %i0, %i5, %i0
264 ; SPARC64-NEXT:    xor %i0, %g3, %i0
265 ; SPARC64-NEXT:    or %i0, %g2, %i0
266 ; SPARC64-NEXT:    movrnz %i0, 1, %i2
267 ; SPARC64-NEXT:    srl %i3, 0, %i0
268 ; SPARC64-NEXT:    or %i4, %i0, %i0
269 ; SPARC64-NEXT:    srl %i2, 0, %i2
270 ; SPARC64-NEXT:    ret
271 ; SPARC64-NEXT:    restore
272 start:
273   %0 = tail call { i128, i1 } @llvm.smul.with.overflow.i128(i128 %l, i128 %r) #2
274   %1 = extractvalue { i128, i1 } %0, 0
275   %2 = extractvalue { i128, i1 } %0, 1
276   %3 = zext i1 %2 to i8
277   %4 = insertvalue { i128, i8 } undef, i128 %1, 0
278   %5 = insertvalue { i128, i8 } %4, i8 %3, 1
279   ret { i128, i8 } %5
282 ; Function Attrs: nounwind readnone speculatable
283 declare { i128, i1 } @llvm.smul.with.overflow.i128(i128, i128) #1
285 attributes #0 = { nounwind readnone uwtable }
286 attributes #1 = { nounwind readnone speculatable }
287 attributes #2 = { nounwind }