summaryrefslogtreecommitdiffstats
path: root/ArmPkg/Library/CompilerIntrinsicsLib/Arm/udivmoddi4.S
blob: 1c0f2eae672266e725ac56ff68c77f22f82d55a3 (plain)
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#------------------------------------------------------------------------------ 
#
# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
#------------------------------------------------------------------------------

  .text
  .align 2
  GCC_ASM_EXPORT(__udivmoddi4)
  
ASM_PFX(__udivmoddi4):
  stmfd  sp!, {r4, r5, r6, r7, lr}
  add  r7, sp, #12
  stmfd  sp!, {r10, r11}
  sub  sp, sp, #20
  stmia  sp, {r2-r3}
  ldr  r6, [sp, #48]
  orrs  r2, r2, r3
  mov  r10, r0
  mov  r11, r1
  beq  L2
  subs  ip, r1, #0
  bne  L4
  cmp  r3, #0
  bne  L6
  cmp  r6, #0
  beq  L8
  mov  r1, r2
  bl  ASM_PFX(__umodsi3)
  mov  r1, #0
  stmia  r6, {r0-r1}
L8:
  ldr  r1, [sp, #0]
  mov  r0, r10
  b  L45
L6:
  cmp  r6, #0
  movne  r1, #0
  stmneia  r6, {r0-r1}
  b  L2
L4:
  ldr  r1, [sp, #0]
  cmp  r1, #0
  bne  L12
  ldr  r2, [sp, #4]
  cmp  r2, #0
  bne  L14
  cmp  r6, #0
  beq  L16
  mov  r1, r2
  mov  r0, r11
  bl  ASM_PFX(__umodsi3)
  mov  r1, #0
  stmia  r6, {r0-r1}
L16:
  ldr  r1, [sp, #4]
  mov  r0, r11
L45:
  bl  ASM_PFX(__udivsi3)
L46:
  mov  r10, r0
  mov  r11, #0
  b  L10
L14:
  subs  r1, r0, #0
  bne  L18
  cmp  r6, #0
  beq  L16
  ldr  r1, [sp, #4]
  mov  r0, r11
  bl  ASM_PFX(__umodsi3)
  mov  r4, r10
  mov  r5, r0
  stmia  r6, {r4-r5}
  b  L16
L18:
  sub  r3, r2, #1
  tst  r2, r3
  bne  L22
  cmp  r6, #0
  movne  r4, r0
  andne  r5, ip, r3
  stmneia  r6, {r4-r5}
L24:
  rsb  r3, r2, #0
  and  r3, r2, r3
  clz  r3, r3
  rsb  r3, r3, #31
  mov  r0, ip, lsr r3
  b  L46
L22:
  clz  r2, r2
  clz  r3, ip
  rsb  r3, r3, r2
  cmp  r3, #30
  bhi  L48
  rsb  r2, r3, #31
  add  lr, r3, #1
  mov  r3, r1, asl r2
  str  r3, [sp, #12]
  mov  r3, r1, lsr lr
  ldr  r0, [sp, #0]
  mov  r5, ip, lsr lr
  orr  r4, r3, ip, asl r2
  str  r0, [sp, #8]
  b  L29
L12:
  ldr  r3, [sp, #4]
  cmp  r3, #0
  bne  L30
  sub  r3, r1, #1
  tst  r1, r3
  bne  L32
  cmp  r6, #0
  andne  r3, r3, r0
  movne  r2, r3
  movne  r3, #0
  stmneia  r6, {r2-r3}
L34:
  cmp  r1, #1
  beq  L10
  rsb  r3, r1, #0
  and  r3, r1, r3
  clz  r3, r3
  rsb  r0, r3, #31
  mov  r1, ip, lsr r0
  rsb  r3, r0, #32
  mov  r0, r10, lsr r0
  orr  ip, r0, ip, asl r3
  str  r1, [sp, #12]
  str  ip, [sp, #8]
  ldrd  r10, [sp, #8]
  b  L10
L32:
  clz  r2, r1
  clz  r3, ip
  rsb  r3, r3, r2
  rsb  r4, r3, #31
  mov  r2, r0, asl r4
  mvn  r1, r3
  and  r2, r2, r1, asr #31
  add  lr, r3, #33
  str  r2, [sp, #8]
  add  r2, r3, #1
  mov  r3, r3, asr #31
  and  r0, r3, r0, asl r1
  mov  r3, r10, lsr r2
  orr  r3, r3, ip, asl r4
  and  r3, r3, r1, asr #31
  orr  r0, r0, r3
  mov  r3, ip, lsr lr
  str  r0, [sp, #12]
  mov  r0, r10, lsr lr
  and  r5, r3, r2, asr #31
  rsb  r3, lr, #31
  mov  r3, r3, asr #31
  orr  r0, r0, ip, asl r1
  and  r3, r3, ip, lsr r2
  and  r0, r0, r2, asr #31
  orr  r4, r3, r0
  b  L29
L30:
  clz  r2, r3
  clz  r3, ip
  rsb  r3, r3, r2
  cmp  r3, #31
  bls  L37
L48:
  cmp  r6, #0
  stmneia  r6, {r10-r11}
  b  L2
L37:
  rsb  r1, r3, #31
  mov  r0, r0, asl r1
  add  lr, r3, #1
  mov  r2, #0
  str  r0, [sp, #12]
  mov  r0, r10, lsr lr
  str  r2, [sp, #8]
  sub  r2, r3, #31
  and  r0, r0, r2, asr #31
  mov  r3, ip, lsr lr
  orr  r4, r0, ip, asl r1
  and  r5, r3, r2, asr #31
L29:
  mov  ip, #0
  mov  r10, ip
  b  L40
L41:
  ldr  r1, [sp, #12]
  ldr  r2, [sp, #8]
  mov  r3, r4, lsr #31
  orr  r5, r3, r5, asl #1
  mov  r3, r1, lsr #31
  orr  r4, r3, r4, asl #1
  mov  r3, r2, lsr #31
  orr  r0, r3, r1, asl #1
  orr  r1, ip, r2, asl #1
  ldmia  sp, {r2-r3}
  str  r0, [sp, #12]
  subs  r2, r2, r4
  sbc  r3, r3, r5
  str  r1, [sp, #8]
  subs  r0, r2, #1
  sbc  r1, r3, #0
  mov  r2, r1, asr #31
  ldmia  sp, {r0-r1}
  mov  r3, r2
  and  ip, r2, #1
  and  r3, r3, r1
  and  r2, r2, r0
  subs  r4, r4, r2
  sbc  r5, r5, r3
  add  r10, r10, #1
L40:
  cmp  r10, lr
  bne  L41
  ldrd  r0, [sp, #8]
  adds  r0, r0, r0
  adc  r1, r1, r1
  cmp  r6, #0
  orr  r10, r0, ip
  mov  r11, r1
  stmneia  r6, {r4-r5}
  b  L10
L2:
  mov  r10, #0
  mov  r11, #0
L10:
  mov  r0, r10
  mov  r1, r11
  sub  sp, r7, #20
  ldmfd  sp!, {r10, r11}
  ldmfd  sp!, {r4, r5, r6, r7, pc}