| //------------------------------------------------------------------------------ |
| // |
| // Copyright (c) 2008-2009 Apple Inc. All rights reserved. |
| // |
| // All rights reserved. This program and the accompanying materials |
| // are licensed and made available under the terms and conditions of the BSD License |
| // which accompanies this distribution. The full text of the license may be found at |
| // http://opensource.org/licenses/bsd-license.php |
| // |
| // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. |
| // |
| //------------------------------------------------------------------------------ |
| |
| |
| EXPORT __aeabi_uidiv |
| EXPORT __aeabi_uidivmod |
| EXPORT __aeabi_idiv |
| EXPORT __aeabi_idivmod |
| |
| AREA Math, CODE, READONLY |
| |
| ; |
| ;UINT32 |
| ;EFIAPI |
| ;__aeabi_uidivmode ( |
| ; IN UINT32 Dividen |
| ; IN UINT32 Divisor |
| ; ); |
| ; |
| |
| __aeabi_uidiv |
| __aeabi_uidivmod |
| RSBS r12, r1, r0, LSR #4 |
| MOV r2, #0 |
| BCC __arm_div4 |
| RSBS r12, r1, r0, LSR #8 |
| BCC __arm_div8 |
| MOV r3, #0 |
| B __arm_div_large |
| |
| ; |
| ;INT32 |
| ;EFIAPI |
| ;__aeabi_idivmode ( |
| ; IN INT32 Dividen |
| ; IN INT32 Divisor |
| ; ); |
| ; |
| __aeabi_idiv |
| __aeabi_idivmod |
| ORRS r12, r0, r1 |
| BMI __arm_div_negative |
| RSBS r12, r1, r0, LSR #1 |
| MOV r2, #0 |
| BCC __arm_div1 |
| RSBS r12, r1, r0, LSR #4 |
| BCC __arm_div4 |
| RSBS r12, r1, r0, LSR #8 |
| BCC __arm_div8 |
| MOV r3, #0 |
| B __arm_div_large |
| __arm_div8 |
| RSBS r12, r1, r0, LSR #7 |
| SUBCS r0, r0, r1, LSL #7 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0,LSR #6 |
| SUBCS r0, r0, r1, LSL #6 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0, LSR #5 |
| SUBCS r0, r0, r1, LSL #5 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0, LSR #4 |
| SUBCS r0, r0, r1, LSL #4 |
| ADC r2, r2, r2 |
| __arm_div4 |
| RSBS r12, r1, r0, LSR #3 |
| SUBCS r0, r0, r1, LSL #3 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0, LSR #2 |
| SUBCS r0, r0, r1, LSL #2 |
| ADCS r2, r2, r2 |
| RSBS r12, r1, r0, LSR #1 |
| SUBCS r0, r0, r1, LSL #1 |
| ADC r2, r2, r2 |
| __arm_div1 |
| SUBS r1, r0, r1 |
| MOVCC r1, r0 |
| ADC r0, r2, r2 |
| BX r14 |
| __arm_div_negative |
| ANDS r2, r1, #0x80000000 |
| RSBMI r1, r1, #0 |
| EORS r3, r2, r0, ASR #32 |
| RSBCS r0, r0, #0 |
| RSBS r12, r1, r0, LSR #4 |
| BCC label1 |
| RSBS r12, r1, r0, LSR #8 |
| BCC label2 |
| __arm_div_large |
| LSL r1, r1, #6 |
| RSBS r12, r1, r0, LSR #8 |
| ORR r2, r2, #0xfc000000 |
| BCC label2 |
| LSL r1, r1, #6 |
| RSBS r12, r1, r0, LSR #8 |
| ORR r2, r2, #0x3f00000 |
| BCC label2 |
| LSL r1, r1, #6 |
| RSBS r12, r1, r0, LSR #8 |
| ORR r2, r2, #0xfc000 |
| ORRCS r2, r2, #0x3f00 |
| LSLCS r1, r1, #6 |
| RSBS r12, r1, #0 |
| BCS __aeabi_idiv0 |
| label3 |
| LSRCS r1, r1, #6 |
| label2 |
| RSBS r12, r1, r0, LSR #7 |
| SUBCS r0, r0, r1, LSL #7 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0, LSR #6 |
| SUBCS r0, r0, r1, LSL #6 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0, LSR #5 |
| SUBCS r0, r0, r1, LSL #5 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0, LSR #4 |
| SUBCS r0, r0, r1, LSL #4 |
| ADC r2, r2, r2 |
| label1 |
| RSBS r12, r1, r0, LSR #3 |
| SUBCS r0, r0, r1, LSL #3 |
| ADC r2, r2, r2 |
| RSBS r12, r1, r0, LSR #2 |
| SUBCS r0, r0, r1, LSL #2 |
| ADCS r2, r2, r2 |
| BCS label3 |
| RSBS r12, r1, r0, LSR #1 |
| SUBCS r0, r0, r1, LSL #1 |
| ADC r2, r2, r2 |
| SUBS r1, r0, r1 |
| MOVCC r1, r0 |
| ADC r0, r2, r2 |
| ASRS r3, r3, #31 |
| RSBMI r0, r0, #0 |
| RSBCS r1, r1, #0 |
| BX r14 |
| |
| ; What to do about division by zero? For now, just return. |
| __aeabi_idiv0 |
| BX r14 |
| |
| END |
| |