]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
Updating ArmLib.h to add functions needed to turn on paging in CpuDxe. Also added...
[mirror_edk2.git] / ArmPkg / Library / CompilerIntrinsicsLib / Arm / div.asm
CommitLineData
2ef2b01e
A
1//------------------------------------------------------------------------------
2//
3// Copyright (c) 2008-2009 Apple Inc. All rights reserved.
4//
5// All rights reserved. This program and the accompanying materials
6// are licensed and made available under the terms and conditions of the BSD License
7// which accompanies this distribution. The full text of the license may be found at
8// http://opensource.org/licenses/bsd-license.php
9//
10// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12//
13//------------------------------------------------------------------------------
14
15
16 EXPORT __aeabi_uidiv
17 EXPORT __aeabi_uidivmod
18 EXPORT __aeabi_idiv
19 EXPORT __aeabi_idivmod
20
21 AREA Math, CODE, READONLY
22
23;
24;UINT32
25;EFIAPI
26;__aeabi_uidivmode (
27; IN UINT32 Dividen
28; IN UINT32 Divisor
29; );
30;
31
32__aeabi_uidiv
33__aeabi_uidivmod
34 RSBS r12, r1, r0, LSR #4
35 MOV r2, #0
36 BCC __arm_div4
37 RSBS r12, r1, r0, LSR #8
38 BCC __arm_div8
39 MOV r3, #0
40 B __arm_div_large
41
42;
43;INT32
44;EFIAPI
45;__aeabi_idivmode (
46; IN INT32 Dividen
47; IN INT32 Divisor
48; );
49;
50__aeabi_idiv
51__aeabi_idivmod
52 ORRS r12, r0, r1
53 BMI __arm_div_negative
54 RSBS r12, r1, r0, LSR #1
55 MOV r2, #0
56 BCC __arm_div1
57 RSBS r12, r1, r0, LSR #4
58 BCC __arm_div4
59 RSBS r12, r1, r0, LSR #8
60 BCC __arm_div8
61 MOV r3, #0
62 B __arm_div_large
63__arm_div8
64 RSBS r12, r1, r0, LSR #7
65 SUBCS r0, r0, r1, LSL #7
66 ADC r2, r2, r2
67 RSBS r12, r1, r0,LSR #6
68 SUBCS r0, r0, r1, LSL #6
69 ADC r2, r2, r2
70 RSBS r12, r1, r0, LSR #5
71 SUBCS r0, r0, r1, LSL #5
72 ADC r2, r2, r2
73 RSBS r12, r1, r0, LSR #4
74 SUBCS r0, r0, r1, LSL #4
75 ADC r2, r2, r2
76__arm_div4
77 RSBS r12, r1, r0, LSR #3
78 SUBCS r0, r0, r1, LSL #3
79 ADC r2, r2, r2
80 RSBS r12, r1, r0, LSR #2
81 SUBCS r0, r0, r1, LSL #2
82 ADCS r2, r2, r2
83 RSBS r12, r1, r0, LSR #1
84 SUBCS r0, r0, r1, LSL #1
85 ADC r2, r2, r2
86__arm_div1
87 SUBS r1, r0, r1
88 MOVCC r1, r0
89 ADC r0, r2, r2
90 BX r14
91__arm_div_negative
92 ANDS r2, r1, #0x80000000
93 RSBMI r1, r1, #0
94 EORS r3, r2, r0, ASR #32
95 RSBCS r0, r0, #0
96 RSBS r12, r1, r0, LSR #4
97 BCC label1
98 RSBS r12, r1, r0, LSR #8
99 BCC label2
100__arm_div_large
101 LSL r1, r1, #6
102 RSBS r12, r1, r0, LSR #8
103 ORR r2, r2, #0xfc000000
104 BCC label2
105 LSL r1, r1, #6
106 RSBS r12, r1, r0, LSR #8
107 ORR r2, r2, #0x3f00000
108 BCC label2
109 LSL r1, r1, #6
110 RSBS r12, r1, r0, LSR #8
111 ORR r2, r2, #0xfc000
112 ORRCS r2, r2, #0x3f00
113 LSLCS r1, r1, #6
114 RSBS r12, r1, #0
115 BCS __aeabi_idiv0
116label3
117 LSRCS r1, r1, #6
118label2
119 RSBS r12, r1, r0, LSR #7
120 SUBCS r0, r0, r1, LSL #7
121 ADC r2, r2, r2
122 RSBS r12, r1, r0, LSR #6
123 SUBCS r0, r0, r1, LSL #6
124 ADC r2, r2, r2
125 RSBS r12, r1, r0, LSR #5
126 SUBCS r0, r0, r1, LSL #5
127 ADC r2, r2, r2
128 RSBS r12, r1, r0, LSR #4
129 SUBCS r0, r0, r1, LSL #4
130 ADC r2, r2, r2
131label1
132 RSBS r12, r1, r0, LSR #3
133 SUBCS r0, r0, r1, LSL #3
134 ADC r2, r2, r2
135 RSBS r12, r1, r0, LSR #2
136 SUBCS r0, r0, r1, LSL #2
137 ADCS r2, r2, r2
138 BCS label3
139 RSBS r12, r1, r0, LSR #1
140 SUBCS r0, r0, r1, LSL #1
141 ADC r2, r2, r2
142 SUBS r1, r0, r1
143 MOVCC r1, r0
144 ADC r0, r2, r2
145 ASRS r3, r3, #31
146 RSBMI r0, r0, #0
147 RSBCS r1, r1, #0
148 BX r14
149
150 ; What to do about division by zero? For now, just return.
151__aeabi_idiv0
152 BX r14
153
154 END
155