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