1 /* $NetBSD: uldiv.S,v 1.1.1.1 2018/08/16 18:17:47 jmcneill Exp $ */ 2 3 //------------------------------------------------------------------------------ 4 // 5 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 6 // 7 // This program and the accompanying materials 8 // are licensed and made available under the terms and conditions of the BSD License 9 // which accompanies this distribution. The full text of the license may be found at 10 // http://opensource.org/licenses/bsd-license.php 11 // 12 // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 14 // 15 //------------------------------------------------------------------------------ 16 17 #include "edk2asm.h" 18 19 .text 20 .align 2 21 GCC_ASM_EXPORT(__aeabi_uldivmod) 22 23 // 24 //UINT64 25 //EFIAPI 26 //__aeabi_uldivmod ( 27 // IN UINT64 Dividend 28 // IN UINT64 Divisor 29 // ) 30 // 31 ASM_PFX(__aeabi_uldivmod): 32 stmdb sp!, {r4, r5, r6, lr} 33 mov r4, r1 34 mov r5, r0 35 mov r6, #0 // 0x0 36 orrs ip, r3, r2, lsr #31 37 bne ASM_PFX(__aeabi_uldivmod_label1) 38 tst r2, r2 39 beq ASM_PFX(_ll_div0) 40 movs ip, r2, lsr #15 41 addeq r6, r6, #16 // 0x10 42 mov ip, r2, lsl r6 43 movs lr, ip, lsr #23 44 moveq ip, ip, lsl #8 45 addeq r6, r6, #8 // 0x8 46 movs lr, ip, lsr #27 47 moveq ip, ip, lsl #4 48 addeq r6, r6, #4 // 0x4 49 movs lr, ip, lsr #29 50 moveq ip, ip, lsl #2 51 addeq r6, r6, #2 // 0x2 52 movs lr, ip, lsr #30 53 moveq ip, ip, lsl #1 54 addeq r6, r6, #1 // 0x1 55 b ASM_PFX(_ll_udiv_small) 56 ASM_PFX(__aeabi_uldivmod_label1): 57 tst r3, #-2147483648 // 0x80000000 58 bne ASM_PFX(__aeabi_uldivmod_label2) 59 movs ip, r3, lsr #15 60 addeq r6, r6, #16 // 0x10 61 mov ip, r3, lsl r6 62 movs lr, ip, lsr #23 63 moveq ip, ip, lsl #8 64 addeq r6, r6, #8 // 0x8 65 movs lr, ip, lsr #27 66 moveq ip, ip, lsl #4 67 addeq r6, r6, #4 // 0x4 68 movs lr, ip, lsr #29 69 moveq ip, ip, lsl #2 70 addeq r6, r6, #2 // 0x2 71 movs lr, ip, lsr #30 72 addeq r6, r6, #1 // 0x1 73 rsb r3, r6, #32 // 0x20 74 moveq ip, ip, lsl #1 75 orr ip, ip, r2, lsr r3 76 mov lr, r2, lsl r6 77 b ASM_PFX(_ll_udiv_big) 78 ASM_PFX(__aeabi_uldivmod_label2): 79 mov ip, r3 80 mov lr, r2 81 b ASM_PFX(_ll_udiv_ginormous) 82 83 ASM_PFX(_ll_udiv_small): 84 cmp r4, ip, lsl #1 85 mov r3, #0 // 0x0 86 subcs r4, r4, ip, lsl #1 87 addcs r3, r3, #2 // 0x2 88 cmp r4, ip 89 subcs r4, r4, ip 90 adcs r3, r3, #0 // 0x0 91 add r2, r6, #32 // 0x20 92 cmp r2, #32 // 0x20 93 rsb ip, ip, #0 // 0x0 94 bcc ASM_PFX(_ll_udiv_small_label1) 95 orrs r0, r4, r5, lsr #30 96 moveq r4, r5 97 moveq r5, #0 // 0x0 98 subeq r2, r2, #32 // 0x20 99 ASM_PFX(_ll_udiv_small_label1): 100 mov r1, #0 // 0x0 101 cmp r2, #16 // 0x10 102 bcc ASM_PFX(_ll_udiv_small_label2) 103 movs r0, r4, lsr #14 104 moveq r4, r4, lsl #16 105 addeq r1, r1, #16 // 0x10 106 ASM_PFX(_ll_udiv_small_label2): 107 sub lr, r2, r1 108 cmp lr, #8 // 0x8 109 bcc ASM_PFX(_ll_udiv_small_label3) 110 movs r0, r4, lsr #22 111 moveq r4, r4, lsl #8 112 addeq r1, r1, #8 // 0x8 113 ASM_PFX(_ll_udiv_small_label3): 114 rsb r0, r1, #32 // 0x20 115 sub r2, r2, r1 116 orr r4, r4, r5, lsr r0 117 mov r5, r5, lsl r1 118 cmp r2, #1 // 0x1 119 bcc ASM_PFX(_ll_udiv_small_label5) 120 sub r2, r2, #1 // 0x1 121 and r0, r2, #7 // 0x7 122 eor r0, r0, #7 // 0x7 123 adds r0, r0, r0, lsl #1 124 add pc, pc, r0, lsl #2 125 nop // (mov r0,r0) 126 ASM_PFX(_ll_udiv_small_label4): 127 adcs r5, r5, r5 128 adcs r4, ip, r4, lsl #1 129 rsbcc r4, ip, r4 130 adcs r5, r5, r5 131 adcs r4, ip, r4, lsl #1 132 rsbcc r4, ip, r4 133 adcs r5, r5, r5 134 adcs r4, ip, r4, lsl #1 135 rsbcc r4, ip, r4 136 adcs r5, r5, r5 137 adcs r4, ip, r4, lsl #1 138 rsbcc r4, ip, r4 139 adcs r5, r5, r5 140 adcs r4, ip, r4, lsl #1 141 rsbcc r4, ip, r4 142 adcs r5, r5, r5 143 adcs r4, ip, r4, lsl #1 144 rsbcc r4, ip, r4 145 adcs r5, r5, r5 146 adcs r4, ip, r4, lsl #1 147 rsbcc r4, ip, r4 148 adcs r5, r5, r5 149 adcs r4, ip, r4, lsl #1 150 sub r2, r2, #8 // 0x8 151 tst r2, r2 152 rsbcc r4, ip, r4 153 bpl ASM_PFX(_ll_udiv_small_label4) 154 ASM_PFX(_ll_udiv_small_label5): 155 mov r2, r4, lsr r6 156 bic r4, r4, r2, lsl r6 157 adcs r0, r5, r5 158 adc r1, r4, r4 159 add r1, r1, r3, lsl r6 160 mov r3, #0 // 0x0 161 ldmia sp!, {r4, r5, r6, pc} 162 163 ASM_PFX(_ll_udiv_big): 164 subs r0, r5, lr 165 mov r3, #0 // 0x0 166 sbcs r1, r4, ip 167 movcs r5, r0 168 movcs r4, r1 169 adcs r3, r3, #0 // 0x0 170 subs r0, r5, lr 171 sbcs r1, r4, ip 172 movcs r5, r0 173 movcs r4, r1 174 adcs r3, r3, #0 // 0x0 175 subs r0, r5, lr 176 sbcs r1, r4, ip 177 movcs r5, r0 178 movcs r4, r1 179 adcs r3, r3, #0 // 0x0 180 mov r1, #0 // 0x0 181 rsbs lr, lr, #0 // 0x0 182 rsc ip, ip, #0 // 0x0 183 cmp r6, #16 // 0x10 184 bcc ASM_PFX(_ll_udiv_big_label1) 185 movs r0, r4, lsr #14 186 moveq r4, r4, lsl #16 187 addeq r1, r1, #16 // 0x10 188 ASM_PFX(_ll_udiv_big_label1): 189 sub r2, r6, r1 190 cmp r2, #8 // 0x8 191 bcc ASM_PFX(_ll_udiv_big_label2) 192 movs r0, r4, lsr #22 193 moveq r4, r4, lsl #8 194 addeq r1, r1, #8 // 0x8 195 ASM_PFX(_ll_udiv_big_label2): 196 rsb r0, r1, #32 // 0x20 197 sub r2, r6, r1 198 orr r4, r4, r5, lsr r0 199 mov r5, r5, lsl r1 200 cmp r2, #1 // 0x1 201 bcc ASM_PFX(_ll_udiv_big_label4) 202 sub r2, r2, #1 // 0x1 203 and r0, r2, #3 // 0x3 204 rsb r0, r0, #3 // 0x3 205 adds r0, r0, r0, lsl #1 206 add pc, pc, r0, lsl #3 207 nop // (mov r0,r0) 208 ASM_PFX(_ll_udiv_big_label3): 209 adcs r5, r5, r5 210 adcs r4, r4, r4 211 adcs r0, lr, r5 212 adcs r1, ip, r4 213 movcs r5, r0 214 movcs r4, r1 215 adcs r5, r5, r5 216 adcs r4, r4, r4 217 adcs r0, lr, r5 218 adcs r1, ip, r4 219 movcs r5, r0 220 movcs r4, r1 221 adcs r5, r5, r5 222 adcs r4, r4, r4 223 adcs r0, lr, r5 224 adcs r1, ip, r4 225 movcs r5, r0 226 movcs r4, r1 227 sub r2, r2, #4 // 0x4 228 adcs r5, r5, r5 229 adcs r4, r4, r4 230 adcs r0, lr, r5 231 adcs r1, ip, r4 232 tst r2, r2 233 movcs r5, r0 234 movcs r4, r1 235 bpl ASM_PFX(_ll_udiv_big_label3) 236 ASM_PFX(_ll_udiv_big_label4): 237 mov r1, #0 // 0x0 238 mov r2, r5, lsr r6 239 bic r5, r5, r2, lsl r6 240 adcs r0, r5, r5 241 adc r1, r1, #0 // 0x0 242 movs lr, r3, lsl r6 243 mov r3, r4, lsr r6 244 bic r4, r4, r3, lsl r6 245 adc r1, r1, #0 // 0x0 246 adds r0, r0, lr 247 orr r2, r2, r4, ror r6 248 adc r1, r1, #0 // 0x0 249 ldmia sp!, {r4, r5, r6, pc} 250 251 ASM_PFX(_ll_udiv_ginormous): 252 subs r2, r5, lr 253 mov r1, #0 // 0x0 254 sbcs r3, r4, ip 255 adc r0, r1, r1 256 movcc r2, r5 257 movcc r3, r4 258 ldmia sp!, {r4, r5, r6, pc} 259 260 ASM_PFX(_ll_div0): 261 ldmia sp!, {r4, r5, r6, lr} 262 mov r0, #0 // 0x0 263 mov r1, #0 // 0x0 264 b ASM_PFX(__aeabi_ldiv0) 265 266 ASM_PFX(__aeabi_ldiv0): 267 bx r14 268 269 270