File: umulo-128-legalisation-lowering.ll

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (225 lines) | stat: -rw-r--r-- 7,513 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=sparc-unknown-linux-gnu | FileCheck %s --check-prefixes=SPARC
; RUN: llc < %s -mtriple=sparc64-unknown-linux-gnu | FileCheck %s --check-prefixes=SPARC64

define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {
; SPARC-LABEL: muloti_test:
; SPARC:         .cfi_startproc
; SPARC-NEXT:  ! %bb.0: ! %start
; SPARC-NEXT:    save %sp, -96, %sp
; SPARC-NEXT:    .cfi_def_cfa_register %fp
; SPARC-NEXT:    .cfi_window_save
; SPARC-NEXT:    .cfi_register %o7, %i7
; SPARC-NEXT:    mov %i3, %g2
; SPARC-NEXT:    mov %i2, %g4
; SPARC-NEXT:    umul %i2, %i5, %i2
; SPARC-NEXT:    rd %y, %l7
; SPARC-NEXT:    ld [%fp+92], %l4
; SPARC-NEXT:    umul %i4, %i3, %i3
; SPARC-NEXT:    rd %y, %o1
; SPARC-NEXT:    ld [%fp+96], %g3
; SPARC-NEXT:    umul %i5, %g2, %l3
; SPARC-NEXT:    rd %y, %o0
; SPARC-NEXT:    umul %l4, %i1, %l2
; SPARC-NEXT:    rd %y, %l1
; SPARC-NEXT:    add %i3, %i2, %i2
; SPARC-NEXT:    umul %i0, %g3, %i3
; SPARC-NEXT:    rd %y, %l6
; SPARC-NEXT:    add %o0, %i2, %o2
; SPARC-NEXT:    umul %i1, %g3, %i2
; SPARC-NEXT:    rd %y, %l0
; SPARC-NEXT:    add %i3, %l2, %i3
; SPARC-NEXT:    add %l0, %i3, %l2
; SPARC-NEXT:    addcc %i2, %l3, %l3
; SPARC-NEXT:    umul %g2, %g3, %i3
; SPARC-NEXT:    rd %y, %i2
; SPARC-NEXT:    addxcc %l2, %o2, %o4
; SPARC-NEXT:    umul %g4, %g3, %g3
; SPARC-NEXT:    rd %y, %l5
; SPARC-NEXT:    addcc %g3, %i2, %i2
; SPARC-NEXT:    addxcc %l5, 0, %g3
; SPARC-NEXT:    umul %g2, %l4, %g2
; SPARC-NEXT:    rd %y, %l5
; SPARC-NEXT:    addcc %g2, %i2, %i2
; SPARC-NEXT:    addxcc %l5, 0, %g2
; SPARC-NEXT:    addcc %g3, %g2, %g2
; SPARC-NEXT:    addxcc %g0, 0, %g3
; SPARC-NEXT:    umul %g4, %l4, %l5
; SPARC-NEXT:    rd %y, %o3
; SPARC-NEXT:    addcc %l5, %g2, %l5
; SPARC-NEXT:    addxcc %o3, %g3, %o3
; SPARC-NEXT:    addcc %l5, %l3, %g2
; SPARC-NEXT:    addxcc %o3, %o4, %g3
; SPARC-NEXT:    mov 1, %l3
; SPARC-NEXT:    cmp %g3, %o3
; SPARC-NEXT:    bcs .LBB0_2
; SPARC-NEXT:    mov %l3, %o4
; SPARC-NEXT:  ! %bb.1: ! %start
; SPARC-NEXT:    mov %g0, %o4
; SPARC-NEXT:  .LBB0_2: ! %start
; SPARC-NEXT:    cmp %g2, %l5
; SPARC-NEXT:    bcs .LBB0_4
; SPARC-NEXT:    mov %l3, %l5
; SPARC-NEXT:  ! %bb.3: ! %start
; SPARC-NEXT:    mov %g0, %l5
; SPARC-NEXT:  .LBB0_4: ! %start
; SPARC-NEXT:    cmp %g3, %o3
; SPARC-NEXT:    be .LBB0_6
; SPARC-NEXT:    nop
; SPARC-NEXT:  ! %bb.5: ! %start
; SPARC-NEXT:    mov %o4, %l5
; SPARC-NEXT:  .LBB0_6: ! %start
; SPARC-NEXT:    cmp %g4, 0
; SPARC-NEXT:    bne .LBB0_8
; SPARC-NEXT:    mov %l3, %o3
; SPARC-NEXT:  ! %bb.7: ! %start
; SPARC-NEXT:    mov %g0, %o3
; SPARC-NEXT:  .LBB0_8: ! %start
; SPARC-NEXT:    cmp %i4, 0
; SPARC-NEXT:    bne .LBB0_10
; SPARC-NEXT:    mov %l3, %o4
; SPARC-NEXT:  ! %bb.9: ! %start
; SPARC-NEXT:    mov %g0, %o4
; SPARC-NEXT:  .LBB0_10: ! %start
; SPARC-NEXT:    cmp %o1, 0
; SPARC-NEXT:    bne .LBB0_12
; SPARC-NEXT:    mov %l3, %o1
; SPARC-NEXT:  ! %bb.11: ! %start
; SPARC-NEXT:    mov %g0, %o1
; SPARC-NEXT:  .LBB0_12: ! %start
; SPARC-NEXT:    cmp %l7, 0
; SPARC-NEXT:    bne .LBB0_14
; SPARC-NEXT:    mov %l3, %l7
; SPARC-NEXT:  ! %bb.13: ! %start
; SPARC-NEXT:    mov %g0, %l7
; SPARC-NEXT:  .LBB0_14: ! %start
; SPARC-NEXT:    cmp %o2, %o0
; SPARC-NEXT:    bcs .LBB0_16
; SPARC-NEXT:    mov %l3, %g4
; SPARC-NEXT:  ! %bb.15: ! %start
; SPARC-NEXT:    mov %g0, %g4
; SPARC-NEXT:  .LBB0_16: ! %start
; SPARC-NEXT:    cmp %l4, 0
; SPARC-NEXT:    bne .LBB0_18
; SPARC-NEXT:    mov %l3, %l4
; SPARC-NEXT:  ! %bb.17: ! %start
; SPARC-NEXT:    mov %g0, %l4
; SPARC-NEXT:  .LBB0_18: ! %start
; SPARC-NEXT:    cmp %i0, 0
; SPARC-NEXT:    bne .LBB0_20
; SPARC-NEXT:    mov %l3, %o0
; SPARC-NEXT:  ! %bb.19: ! %start
; SPARC-NEXT:    mov %g0, %o0
; SPARC-NEXT:  .LBB0_20: ! %start
; SPARC-NEXT:    cmp %l6, 0
; SPARC-NEXT:    bne .LBB0_22
; SPARC-NEXT:    mov %l3, %l6
; SPARC-NEXT:  ! %bb.21: ! %start
; SPARC-NEXT:    mov %g0, %l6
; SPARC-NEXT:  .LBB0_22: ! %start
; SPARC-NEXT:    and %o4, %o3, %o2
; SPARC-NEXT:    cmp %l1, 0
; SPARC-NEXT:    and %o0, %l4, %l4
; SPARC-NEXT:    bne .LBB0_24
; SPARC-NEXT:    mov %l3, %l1
; SPARC-NEXT:  ! %bb.23: ! %start
; SPARC-NEXT:    mov %g0, %l1
; SPARC-NEXT:  .LBB0_24: ! %start
; SPARC-NEXT:    or %o2, %o1, %o0
; SPARC-NEXT:    cmp %l2, %l0
; SPARC-NEXT:    or %l4, %l6, %l4
; SPARC-NEXT:    bcs .LBB0_26
; SPARC-NEXT:    mov %l3, %l0
; SPARC-NEXT:  ! %bb.25: ! %start
; SPARC-NEXT:    mov %g0, %l0
; SPARC-NEXT:  .LBB0_26: ! %start
; SPARC-NEXT:    or %o0, %l7, %l2
; SPARC-NEXT:    or %i5, %i4, %i4
; SPARC-NEXT:    cmp %i4, 0
; SPARC-NEXT:    or %l4, %l1, %l1
; SPARC-NEXT:    bne .LBB0_28
; SPARC-NEXT:    mov %l3, %i4
; SPARC-NEXT:  ! %bb.27: ! %start
; SPARC-NEXT:    mov %g0, %i4
; SPARC-NEXT:  .LBB0_28: ! %start
; SPARC-NEXT:    or %l2, %g4, %i5
; SPARC-NEXT:    or %i1, %i0, %i0
; SPARC-NEXT:    cmp %i0, 0
; SPARC-NEXT:    bne .LBB0_30
; SPARC-NEXT:    or %l1, %l0, %i0
; SPARC-NEXT:  ! %bb.29: ! %start
; SPARC-NEXT:    mov %g0, %l3
; SPARC-NEXT:  .LBB0_30: ! %start
; SPARC-NEXT:    and %l3, %i4, %i1
; SPARC-NEXT:    or %i1, %i0, %i0
; SPARC-NEXT:    or %i0, %i5, %i0
; SPARC-NEXT:    or %i0, %l5, %i0
; SPARC-NEXT:    and %i0, 1, %i4
; SPARC-NEXT:    mov %g3, %i0
; SPARC-NEXT:    ret
; SPARC-NEXT:    restore %g0, %g2, %o1
;
; SPARC64-LABEL: muloti_test:
; SPARC64:         .cfi_startproc
; SPARC64-NEXT:    .register %g2, #scratch
; SPARC64-NEXT:    .register %g3, #scratch
; SPARC64-NEXT:  ! %bb.0: ! %start
; SPARC64-NEXT:    save %sp, -176, %sp
; SPARC64-NEXT:    .cfi_def_cfa_register %fp
; SPARC64-NEXT:    .cfi_window_save
; SPARC64-NEXT:    .cfi_register %o7, %i7
; SPARC64-NEXT:    mov %g0, %o0
; SPARC64-NEXT:    mov %i2, %o1
; SPARC64-NEXT:    mov %g0, %o2
; SPARC64-NEXT:    call __multi3
; SPARC64-NEXT:    mov %i1, %o3
; SPARC64-NEXT:    mov %o0, %i4
; SPARC64-NEXT:    mov %o1, %i5
; SPARC64-NEXT:    mov %g0, %o0
; SPARC64-NEXT:    mov %i0, %o1
; SPARC64-NEXT:    mov %g0, %o2
; SPARC64-NEXT:    call __multi3
; SPARC64-NEXT:    mov %i3, %o3
; SPARC64-NEXT:    mov %o0, %l0
; SPARC64-NEXT:    add %o1, %i5, %i5
; SPARC64-NEXT:    mov %g0, %o0
; SPARC64-NEXT:    mov %i1, %o1
; SPARC64-NEXT:    mov %g0, %o2
; SPARC64-NEXT:    call __multi3
; SPARC64-NEXT:    mov %i3, %o3
; SPARC64-NEXT:    mov %g0, %i3
; SPARC64-NEXT:    mov %g0, %g2
; SPARC64-NEXT:    mov %g0, %g3
; SPARC64-NEXT:    mov %g0, %g4
; SPARC64-NEXT:    mov %g0, %g5
; SPARC64-NEXT:    add %o0, %i5, %i1
; SPARC64-NEXT:    cmp %i1, %o0
; SPARC64-NEXT:    movrnz %l0, 1, %g2
; SPARC64-NEXT:    movrnz %i2, 1, %g3
; SPARC64-NEXT:    movrnz %i0, 1, %g4
; SPARC64-NEXT:    movcs %xcc, 1, %i3
; SPARC64-NEXT:    and %g4, %g3, %i0
; SPARC64-NEXT:    or %i0, %g2, %i0
; SPARC64-NEXT:    movrnz %i4, 1, %g5
; SPARC64-NEXT:    or %i0, %g5, %i0
; SPARC64-NEXT:    or %i0, %i3, %i0
; SPARC64-NEXT:    srl %i0, 0, %i2
; SPARC64-NEXT:    mov %i1, %i0
; SPARC64-NEXT:    ret
; SPARC64-NEXT:    restore %g0, %o1, %o1
start:
  %0 = tail call { i128, i1 } @llvm.umul.with.overflow.i128(i128 %l, i128 %r) #2
  %1 = extractvalue { i128, i1 } %0, 0
  %2 = extractvalue { i128, i1 } %0, 1
  %3 = zext i1 %2 to i8
  %4 = insertvalue { i128, i8 } undef, i128 %1, 0
  %5 = insertvalue { i128, i8 } %4, i8 %3, 1
  ret { i128, i8 } %5
}

; Function Attrs: nounwind readnone speculatable
declare { i128, i1 } @llvm.umul.with.overflow.i128(i128, i128) #1

attributes #0 = { nounwind readnone uwtable }
attributes #1 = { nounwind readnone speculatable }
attributes #2 = { nounwind }