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