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