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