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