Home | History | Annotate | Line # | Download | only in arm
div.S revision 1.1.1.1.6.2
      1  1.1.1.1.6.2  christos /*	$NetBSD: div.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) 2011, ARM. 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_uidiv)
     22  1.1.1.1.6.2  christos GCC_ASM_EXPORT(__aeabi_uidivmod)
     23  1.1.1.1.6.2  christos GCC_ASM_EXPORT(__aeabi_idiv)
     24  1.1.1.1.6.2  christos GCC_ASM_EXPORT(__aeabi_idivmod)
     25  1.1.1.1.6.2  christos 
     26  1.1.1.1.6.2  christos #    AREA  Math, CODE, READONLY
     27  1.1.1.1.6.2  christos 
     28  1.1.1.1.6.2  christos #
     29  1.1.1.1.6.2  christos #UINT32
     30  1.1.1.1.6.2  christos #EFIAPI
     31  1.1.1.1.6.2  christos #__aeabi_uidivmode (
     32  1.1.1.1.6.2  christos #  IN UINT32  Dividen
     33  1.1.1.1.6.2  christos #  IN UINT32  Divisor
     34  1.1.1.1.6.2  christos #  );
     35  1.1.1.1.6.2  christos #
     36  1.1.1.1.6.2  christos 
     37  1.1.1.1.6.2  christos ASM_PFX(__aeabi_uidiv):
     38  1.1.1.1.6.2  christos ASM_PFX(__aeabi_uidivmod):
     39  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #4
     40  1.1.1.1.6.2  christos   mov     r2, #0
     41  1.1.1.1.6.2  christos   bcc     ASM_PFX(__arm_div4)
     42  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #8
     43  1.1.1.1.6.2  christos   bcc     ASM_PFX(__arm_div8)
     44  1.1.1.1.6.2  christos   mov     r3, #0
     45  1.1.1.1.6.2  christos   b       ASM_PFX(__arm_div_large)
     46  1.1.1.1.6.2  christos 
     47  1.1.1.1.6.2  christos #
     48  1.1.1.1.6.2  christos #INT32
     49  1.1.1.1.6.2  christos #EFIAPI
     50  1.1.1.1.6.2  christos #__aeabi_idivmode (
     51  1.1.1.1.6.2  christos #  IN INT32  Dividen
     52  1.1.1.1.6.2  christos #  IN INT32  Divisor
     53  1.1.1.1.6.2  christos #  );
     54  1.1.1.1.6.2  christos #
     55  1.1.1.1.6.2  christos ASM_PFX(__aeabi_idiv):
     56  1.1.1.1.6.2  christos ASM_PFX(__aeabi_idivmod):
     57  1.1.1.1.6.2  christos   orrs    r12, r0, r1
     58  1.1.1.1.6.2  christos   bmi     ASM_PFX(__arm_div_negative)
     59  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #1
     60  1.1.1.1.6.2  christos   mov     r2, #0
     61  1.1.1.1.6.2  christos   bcc     ASM_PFX(__arm_div1)
     62  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #4
     63  1.1.1.1.6.2  christos   bcc     ASM_PFX(__arm_div4)
     64  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #8
     65  1.1.1.1.6.2  christos   bcc     ASM_PFX(__arm_div8)
     66  1.1.1.1.6.2  christos   mov     r3, #0
     67  1.1.1.1.6.2  christos   b       ASM_PFX(__arm_div_large)
     68  1.1.1.1.6.2  christos ASM_PFX(__arm_div8):
     69  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #7
     70  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #7
     71  1.1.1.1.6.2  christos   adc     r2, r2, r2
     72  1.1.1.1.6.2  christos   rsbs    r12, r1, r0,LSR #6
     73  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #6
     74  1.1.1.1.6.2  christos   adc     r2, r2, r2
     75  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #5
     76  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #5
     77  1.1.1.1.6.2  christos   adc     r2, r2, r2
     78  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #4
     79  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #4
     80  1.1.1.1.6.2  christos   adc     r2, r2, r2
     81  1.1.1.1.6.2  christos ASM_PFX(__arm_div4):
     82  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #3
     83  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #3
     84  1.1.1.1.6.2  christos   adc     r2, r2, r2
     85  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #2
     86  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #2
     87  1.1.1.1.6.2  christos   adcs    r2, r2, r2
     88  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #1
     89  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #1
     90  1.1.1.1.6.2  christos   adc     r2, r2, r2
     91  1.1.1.1.6.2  christos ASM_PFX(__arm_div1):
     92  1.1.1.1.6.2  christos   subs    r1, r0, r1
     93  1.1.1.1.6.2  christos   movcc   r1, r0
     94  1.1.1.1.6.2  christos   adc     r0, r2, r2
     95  1.1.1.1.6.2  christos   bx      r14
     96  1.1.1.1.6.2  christos ASM_PFX(__arm_div_negative):
     97  1.1.1.1.6.2  christos   ands    r2, r1, #0x80000000
     98  1.1.1.1.6.2  christos   rsbmi   r1, r1, #0
     99  1.1.1.1.6.2  christos   eors    r3, r2, r0, ASR #32
    100  1.1.1.1.6.2  christos   rsbcs   r0, r0, #0
    101  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #4
    102  1.1.1.1.6.2  christos   bcc     label1
    103  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #8
    104  1.1.1.1.6.2  christos   bcc     label2
    105  1.1.1.1.6.2  christos ASM_PFX(__arm_div_large):
    106  1.1.1.1.6.2  christos   lsl     r1, r1, #6
    107  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #8
    108  1.1.1.1.6.2  christos   orr     r2, r2, #0xfc000000
    109  1.1.1.1.6.2  christos   bcc     label2
    110  1.1.1.1.6.2  christos   lsl     r1, r1, #6
    111  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #8
    112  1.1.1.1.6.2  christos   orr     r2, r2, #0x3f00000
    113  1.1.1.1.6.2  christos   bcc     label2
    114  1.1.1.1.6.2  christos   lsl     r1, r1, #6
    115  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #8
    116  1.1.1.1.6.2  christos   orr     r2, r2, #0xfc000
    117  1.1.1.1.6.2  christos   orrcs   r2, r2, #0x3f00
    118  1.1.1.1.6.2  christos   lslcs   r1, r1, #6
    119  1.1.1.1.6.2  christos   rsbs    r12, r1, #0
    120  1.1.1.1.6.2  christos   bcs     ASM_PFX(__aeabi_idiv0)
    121  1.1.1.1.6.2  christos label3:
    122  1.1.1.1.6.2  christos   lsrcs   r1, r1, #6
    123  1.1.1.1.6.2  christos label2:
    124  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #7
    125  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #7
    126  1.1.1.1.6.2  christos   adc     r2, r2, r2
    127  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #6
    128  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #6
    129  1.1.1.1.6.2  christos   adc     r2, r2, r2
    130  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #5
    131  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #5
    132  1.1.1.1.6.2  christos   adc     r2, r2, r2
    133  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #4
    134  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #4
    135  1.1.1.1.6.2  christos   adc     r2, r2, r2
    136  1.1.1.1.6.2  christos label1:
    137  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #3
    138  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #3
    139  1.1.1.1.6.2  christos   adc     r2, r2, r2
    140  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #2
    141  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #2
    142  1.1.1.1.6.2  christos   adcs    r2, r2, r2
    143  1.1.1.1.6.2  christos   bcs     label3
    144  1.1.1.1.6.2  christos   rsbs    r12, r1, r0, LSR #1
    145  1.1.1.1.6.2  christos   subcs   r0, r0, r1, LSL #1
    146  1.1.1.1.6.2  christos   adc     r2, r2, r2
    147  1.1.1.1.6.2  christos   subs    r1, r0, r1
    148  1.1.1.1.6.2  christos   movcc   r1, r0
    149  1.1.1.1.6.2  christos   adc     r0, r2, r2
    150  1.1.1.1.6.2  christos   asrs    r3, r3, #31
    151  1.1.1.1.6.2  christos   rsbmi   r0, r0, #0
    152  1.1.1.1.6.2  christos   rsbcs   r1, r1, #0
    153  1.1.1.1.6.2  christos   bx      r14
    154  1.1.1.1.6.2  christos 
    155  1.1.1.1.6.2  christos   @ What to do about division by zero?  For now, just return.
    156  1.1.1.1.6.2  christos ASM_PFX(__aeabi_idiv0):
    157  1.1.1.1.6.2  christos   bx      r14
    158