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