div.S revision 1.1 1 1.1 jmcneill /* $NetBSD: div.S,v 1.1 2018/08/16 18:17:47 jmcneill Exp $ */
2 1.1 jmcneill
3 1.1 jmcneill #------------------------------------------------------------------------------
4 1.1 jmcneill #
5 1.1 jmcneill # Copyright (c) 2011, ARM. All rights reserved.<BR>
6 1.1 jmcneill #
7 1.1 jmcneill # This program and the accompanying materials
8 1.1 jmcneill # are licensed and made available under the terms and conditions of the BSD License
9 1.1 jmcneill # which accompanies this distribution. The full text of the license may be found at
10 1.1 jmcneill # http://opensource.org/licenses/bsd-license.php
11 1.1 jmcneill #
12 1.1 jmcneill # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 1.1 jmcneill # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 1.1 jmcneill #
15 1.1 jmcneill #------------------------------------------------------------------------------
16 1.1 jmcneill
17 1.1 jmcneill #include "edk2asm.h"
18 1.1 jmcneill
19 1.1 jmcneill .text
20 1.1 jmcneill .align 2
21 1.1 jmcneill GCC_ASM_EXPORT(__aeabi_uidiv)
22 1.1 jmcneill GCC_ASM_EXPORT(__aeabi_uidivmod)
23 1.1 jmcneill GCC_ASM_EXPORT(__aeabi_idiv)
24 1.1 jmcneill GCC_ASM_EXPORT(__aeabi_idivmod)
25 1.1 jmcneill
26 1.1 jmcneill # AREA Math, CODE, READONLY
27 1.1 jmcneill
28 1.1 jmcneill #
29 1.1 jmcneill #UINT32
30 1.1 jmcneill #EFIAPI
31 1.1 jmcneill #__aeabi_uidivmode (
32 1.1 jmcneill # IN UINT32 Dividen
33 1.1 jmcneill # IN UINT32 Divisor
34 1.1 jmcneill # );
35 1.1 jmcneill #
36 1.1 jmcneill
37 1.1 jmcneill ASM_PFX(__aeabi_uidiv):
38 1.1 jmcneill ASM_PFX(__aeabi_uidivmod):
39 1.1 jmcneill rsbs r12, r1, r0, LSR #4
40 1.1 jmcneill mov r2, #0
41 1.1 jmcneill bcc ASM_PFX(__arm_div4)
42 1.1 jmcneill rsbs r12, r1, r0, LSR #8
43 1.1 jmcneill bcc ASM_PFX(__arm_div8)
44 1.1 jmcneill mov r3, #0
45 1.1 jmcneill b ASM_PFX(__arm_div_large)
46 1.1 jmcneill
47 1.1 jmcneill #
48 1.1 jmcneill #INT32
49 1.1 jmcneill #EFIAPI
50 1.1 jmcneill #__aeabi_idivmode (
51 1.1 jmcneill # IN INT32 Dividen
52 1.1 jmcneill # IN INT32 Divisor
53 1.1 jmcneill # );
54 1.1 jmcneill #
55 1.1 jmcneill ASM_PFX(__aeabi_idiv):
56 1.1 jmcneill ASM_PFX(__aeabi_idivmod):
57 1.1 jmcneill orrs r12, r0, r1
58 1.1 jmcneill bmi ASM_PFX(__arm_div_negative)
59 1.1 jmcneill rsbs r12, r1, r0, LSR #1
60 1.1 jmcneill mov r2, #0
61 1.1 jmcneill bcc ASM_PFX(__arm_div1)
62 1.1 jmcneill rsbs r12, r1, r0, LSR #4
63 1.1 jmcneill bcc ASM_PFX(__arm_div4)
64 1.1 jmcneill rsbs r12, r1, r0, LSR #8
65 1.1 jmcneill bcc ASM_PFX(__arm_div8)
66 1.1 jmcneill mov r3, #0
67 1.1 jmcneill b ASM_PFX(__arm_div_large)
68 1.1 jmcneill ASM_PFX(__arm_div8):
69 1.1 jmcneill rsbs r12, r1, r0, LSR #7
70 1.1 jmcneill subcs r0, r0, r1, LSL #7
71 1.1 jmcneill adc r2, r2, r2
72 1.1 jmcneill rsbs r12, r1, r0,LSR #6
73 1.1 jmcneill subcs r0, r0, r1, LSL #6
74 1.1 jmcneill adc r2, r2, r2
75 1.1 jmcneill rsbs r12, r1, r0, LSR #5
76 1.1 jmcneill subcs r0, r0, r1, LSL #5
77 1.1 jmcneill adc r2, r2, r2
78 1.1 jmcneill rsbs r12, r1, r0, LSR #4
79 1.1 jmcneill subcs r0, r0, r1, LSL #4
80 1.1 jmcneill adc r2, r2, r2
81 1.1 jmcneill ASM_PFX(__arm_div4):
82 1.1 jmcneill rsbs r12, r1, r0, LSR #3
83 1.1 jmcneill subcs r0, r0, r1, LSL #3
84 1.1 jmcneill adc r2, r2, r2
85 1.1 jmcneill rsbs r12, r1, r0, LSR #2
86 1.1 jmcneill subcs r0, r0, r1, LSL #2
87 1.1 jmcneill adcs r2, r2, r2
88 1.1 jmcneill rsbs r12, r1, r0, LSR #1
89 1.1 jmcneill subcs r0, r0, r1, LSL #1
90 1.1 jmcneill adc r2, r2, r2
91 1.1 jmcneill ASM_PFX(__arm_div1):
92 1.1 jmcneill subs r1, r0, r1
93 1.1 jmcneill movcc r1, r0
94 1.1 jmcneill adc r0, r2, r2
95 1.1 jmcneill bx r14
96 1.1 jmcneill ASM_PFX(__arm_div_negative):
97 1.1 jmcneill ands r2, r1, #0x80000000
98 1.1 jmcneill rsbmi r1, r1, #0
99 1.1 jmcneill eors r3, r2, r0, ASR #32
100 1.1 jmcneill rsbcs r0, r0, #0
101 1.1 jmcneill rsbs r12, r1, r0, LSR #4
102 1.1 jmcneill bcc label1
103 1.1 jmcneill rsbs r12, r1, r0, LSR #8
104 1.1 jmcneill bcc label2
105 1.1 jmcneill ASM_PFX(__arm_div_large):
106 1.1 jmcneill lsl r1, r1, #6
107 1.1 jmcneill rsbs r12, r1, r0, LSR #8
108 1.1 jmcneill orr r2, r2, #0xfc000000
109 1.1 jmcneill bcc label2
110 1.1 jmcneill lsl r1, r1, #6
111 1.1 jmcneill rsbs r12, r1, r0, LSR #8
112 1.1 jmcneill orr r2, r2, #0x3f00000
113 1.1 jmcneill bcc label2
114 1.1 jmcneill lsl r1, r1, #6
115 1.1 jmcneill rsbs r12, r1, r0, LSR #8
116 1.1 jmcneill orr r2, r2, #0xfc000
117 1.1 jmcneill orrcs r2, r2, #0x3f00
118 1.1 jmcneill lslcs r1, r1, #6
119 1.1 jmcneill rsbs r12, r1, #0
120 1.1 jmcneill bcs ASM_PFX(__aeabi_idiv0)
121 1.1 jmcneill label3:
122 1.1 jmcneill lsrcs r1, r1, #6
123 1.1 jmcneill label2:
124 1.1 jmcneill rsbs r12, r1, r0, LSR #7
125 1.1 jmcneill subcs r0, r0, r1, LSL #7
126 1.1 jmcneill adc r2, r2, r2
127 1.1 jmcneill rsbs r12, r1, r0, LSR #6
128 1.1 jmcneill subcs r0, r0, r1, LSL #6
129 1.1 jmcneill adc r2, r2, r2
130 1.1 jmcneill rsbs r12, r1, r0, LSR #5
131 1.1 jmcneill subcs r0, r0, r1, LSL #5
132 1.1 jmcneill adc r2, r2, r2
133 1.1 jmcneill rsbs r12, r1, r0, LSR #4
134 1.1 jmcneill subcs r0, r0, r1, LSL #4
135 1.1 jmcneill adc r2, r2, r2
136 1.1 jmcneill label1:
137 1.1 jmcneill rsbs r12, r1, r0, LSR #3
138 1.1 jmcneill subcs r0, r0, r1, LSL #3
139 1.1 jmcneill adc r2, r2, r2
140 1.1 jmcneill rsbs r12, r1, r0, LSR #2
141 1.1 jmcneill subcs r0, r0, r1, LSL #2
142 1.1 jmcneill adcs r2, r2, r2
143 1.1 jmcneill bcs label3
144 1.1 jmcneill rsbs r12, r1, r0, LSR #1
145 1.1 jmcneill subcs r0, r0, r1, LSL #1
146 1.1 jmcneill adc r2, r2, r2
147 1.1 jmcneill subs r1, r0, r1
148 1.1 jmcneill movcc r1, r0
149 1.1 jmcneill adc r0, r2, r2
150 1.1 jmcneill asrs r3, r3, #31
151 1.1 jmcneill rsbmi r0, r0, #0
152 1.1 jmcneill rsbcs r1, r1, #0
153 1.1 jmcneill bx r14
154 1.1 jmcneill
155 1.1 jmcneill @ What to do about division by zero? For now, just return.
156 1.1 jmcneill ASM_PFX(__aeabi_idiv0):
157 1.1 jmcneill bx r14
158