Home | History | Annotate | Line # | Download | only in arm
      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