https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
		
			
				
	
	
		
			283 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			283 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| //
 | |
| // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
 | |
| // Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 | |
| //
 | |
| // SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| //
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
|     EXPORT  __aeabi_uldivmod
 | |
|     EXPORT  __rt_udiv64
 | |
| 
 | |
|     AREA  s___aeabi_uldivmod, CODE, READONLY, ARM
 | |
| 
 | |
|     ARM
 | |
| 
 | |
| ;
 | |
| ;UINT64
 | |
| ;EFIAPI
 | |
| ;__rt_udiv64 (
 | |
| ;  IN  UINT64   Divisor
 | |
| ;  IN  UINT64   Dividend
 | |
| ;  )
 | |
| ;
 | |
| __rt_udiv64
 | |
|   ; Swap r0-r1 and r2-r3
 | |
|   mov     r12, r0
 | |
|   mov     r0, r2
 | |
|   mov     r2, r12
 | |
|   mov     r12, r1
 | |
|   mov     r1, r3
 | |
|   mov     r3, r12
 | |
|   b       __aeabi_uldivmod
 | |
| 
 | |
| ;
 | |
| ;UINT64
 | |
| ;EFIAPI
 | |
| ;__aeabi_uldivmod (
 | |
| ;  IN  UINT64   Dividend
 | |
| ;  IN  UINT64   Divisor
 | |
| ;  )
 | |
| ;
 | |
| __aeabi_uldivmod
 | |
|   stmdb   sp!, {r4, r5, r6, lr}
 | |
|   mov     r4, r1
 | |
|   mov     r5, r0
 | |
|   mov     r6, #0  ; 0x0
 | |
|   orrs    ip, r3, r2, lsr #31
 | |
|   bne     __aeabi_uldivmod_label1
 | |
|   tst     r2, r2
 | |
|   beq     _ll_div0
 | |
|   movs    ip, r2, lsr #15
 | |
|   addeq   r6, r6, #16     ; 0x10
 | |
|   mov     ip, r2, lsl r6
 | |
|   movs    lr, ip, lsr #23
 | |
|   moveq   ip, ip, lsl #8
 | |
|   addeq   r6, r6, #8      ; 0x8
 | |
|   movs    lr, ip, lsr #27
 | |
|   moveq   ip, ip, lsl #4
 | |
|   addeq   r6, r6, #4      ; 0x4
 | |
|   movs    lr, ip, lsr #29
 | |
|   moveq   ip, ip, lsl #2
 | |
|   addeq   r6, r6, #2      ; 0x2
 | |
|   movs    lr, ip, lsr #30
 | |
|   moveq   ip, ip, lsl #1
 | |
|   addeq   r6, r6, #1      ; 0x1
 | |
|   b       _ll_udiv_small
 | |
| __aeabi_uldivmod_label1
 | |
|   tst     r3, #-2147483648        ; 0x80000000
 | |
|   bne     __aeabi_uldivmod_label2
 | |
|   movs    ip, r3, lsr #15
 | |
|   addeq   r6, r6, #16     ; 0x10
 | |
|   mov     ip, r3, lsl r6
 | |
|   movs    lr, ip, lsr #23
 | |
|   moveq   ip, ip, lsl #8
 | |
|   addeq   r6, r6, #8      ; 0x8
 | |
|   movs    lr, ip, lsr #27
 | |
|   moveq   ip, ip, lsl #4
 | |
|   addeq   r6, r6, #4      ; 0x4
 | |
|   movs    lr, ip, lsr #29
 | |
|   moveq   ip, ip, lsl #2
 | |
|   addeq   r6, r6, #2      ; 0x2
 | |
|   movs    lr, ip, lsr #30
 | |
|   addeq   r6, r6, #1      ; 0x1
 | |
|   rsb     r3, r6, #32     ; 0x20
 | |
|   moveq   ip, ip, lsl #1
 | |
|   orr     ip, ip, r2, lsr r3
 | |
|   mov     lr, r2, lsl r6
 | |
|   b       _ll_udiv_big
 | |
| __aeabi_uldivmod_label2
 | |
|   mov     ip, r3
 | |
|   mov     lr, r2
 | |
|   b       _ll_udiv_ginormous
 | |
| 
 | |
| _ll_udiv_small
 | |
|   cmp     r4, ip, lsl #1
 | |
|   mov     r3, #0  ; 0x0
 | |
|   subcs   r4, r4, ip, lsl #1
 | |
|   addcs   r3, r3, #2      ; 0x2
 | |
|   cmp     r4, ip
 | |
|   subcs   r4, r4, ip
 | |
|   adcs    r3, r3, #0      ; 0x0
 | |
|   add     r2, r6, #32     ; 0x20
 | |
|   cmp     r2, #32 ; 0x20
 | |
|   rsb     ip, ip, #0      ; 0x0
 | |
|   bcc     _ll_udiv_small_label1
 | |
|   orrs    r0, r4, r5, lsr #30
 | |
|   moveq   r4, r5
 | |
|   moveq   r5, #0  ; 0x0
 | |
|   subeq   r2, r2, #32     ; 0x20
 | |
| _ll_udiv_small_label1
 | |
|   mov     r1, #0  ; 0x0
 | |
|   cmp     r2, #16 ; 0x10
 | |
|   bcc     _ll_udiv_small_label2
 | |
|   movs    r0, r4, lsr #14
 | |
|   moveq   r4, r4, lsl #16
 | |
|   addeq   r1, r1, #16     ; 0x10
 | |
| _ll_udiv_small_label2
 | |
|   sub     lr, r2, r1
 | |
|   cmp     lr, #8  ; 0x8
 | |
|   bcc     _ll_udiv_small_label3
 | |
|   movs    r0, r4, lsr #22
 | |
|   moveq   r4, r4, lsl #8
 | |
|   addeq   r1, r1, #8      ; 0x8
 | |
| _ll_udiv_small_label3
 | |
|   rsb     r0, r1, #32     ; 0x20
 | |
|   sub     r2, r2, r1
 | |
|   orr     r4, r4, r5, lsr r0
 | |
|   mov     r5, r5, lsl r1
 | |
|   cmp     r2, #1  ; 0x1
 | |
|   bcc     _ll_udiv_small_label5
 | |
|   sub     r2, r2, #1      ; 0x1
 | |
|   and     r0, r2, #7      ; 0x7
 | |
|   eor     r0, r0, #7      ; 0x7
 | |
|   adds    r0, r0, r0, lsl #1
 | |
|   add     pc, pc, r0, lsl #2
 | |
|   nop                     ; (mov r0,r0)
 | |
| _ll_udiv_small_label4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   rsbcc   r4, ip, r4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   rsbcc   r4, ip, r4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   rsbcc   r4, ip, r4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   rsbcc   r4, ip, r4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   rsbcc   r4, ip, r4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   rsbcc   r4, ip, r4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   rsbcc   r4, ip, r4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, ip, r4, lsl #1
 | |
|   sub     r2, r2, #8      ; 0x8
 | |
|   tst     r2, r2
 | |
|   rsbcc   r4, ip, r4
 | |
|   bpl     _ll_udiv_small_label4
 | |
| _ll_udiv_small_label5
 | |
|   mov     r2, r4, lsr r6
 | |
|   bic     r4, r4, r2, lsl r6
 | |
|   adcs    r0, r5, r5
 | |
|   adc     r1, r4, r4
 | |
|   add     r1, r1, r3, lsl r6
 | |
|   mov     r3, #0  ; 0x0
 | |
|   ldmia   sp!, {r4, r5, r6, pc}
 | |
| 
 | |
| _ll_udiv_big
 | |
|   subs    r0, r5, lr
 | |
|   mov     r3, #0  ; 0x0
 | |
|   sbcs    r1, r4, ip
 | |
|   movcs   r5, r0
 | |
|   movcs   r4, r1
 | |
|   adcs    r3, r3, #0      ; 0x0
 | |
|   subs    r0, r5, lr
 | |
|   sbcs    r1, r4, ip
 | |
|   movcs   r5, r0
 | |
|   movcs   r4, r1
 | |
|   adcs    r3, r3, #0      ; 0x0
 | |
|   subs    r0, r5, lr
 | |
|   sbcs    r1, r4, ip
 | |
|   movcs   r5, r0
 | |
|   movcs   r4, r1
 | |
|   adcs    r3, r3, #0      ; 0x0
 | |
|   mov     r1, #0  ; 0x0
 | |
|   rsbs    lr, lr, #0      ; 0x0
 | |
|   rsc     ip, ip, #0      ; 0x0
 | |
|   cmp     r6, #16 ; 0x10
 | |
|   bcc     _ll_udiv_big_label1
 | |
|   movs    r0, r4, lsr #14
 | |
|   moveq   r4, r4, lsl #16
 | |
|   addeq   r1, r1, #16     ; 0x10
 | |
| _ll_udiv_big_label1
 | |
|   sub     r2, r6, r1
 | |
|   cmp     r2, #8  ; 0x8
 | |
|   bcc     _ll_udiv_big_label2
 | |
|   movs    r0, r4, lsr #22
 | |
|   moveq   r4, r4, lsl #8
 | |
|   addeq   r1, r1, #8      ; 0x8
 | |
| _ll_udiv_big_label2
 | |
|   rsb     r0, r1, #32     ; 0x20
 | |
|   sub     r2, r6, r1
 | |
|   orr     r4, r4, r5, lsr r0
 | |
|   mov     r5, r5, lsl r1
 | |
|   cmp     r2, #1  ; 0x1
 | |
|   bcc     _ll_udiv_big_label4
 | |
|   sub     r2, r2, #1      ; 0x1
 | |
|   and     r0, r2, #3      ; 0x3
 | |
|   rsb     r0, r0, #3      ; 0x3
 | |
|   adds    r0, r0, r0, lsl #1
 | |
|   add     pc, pc, r0, lsl #3
 | |
|   nop                     ; (mov r0,r0)
 | |
| _ll_udiv_big_label3
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, r4, r4
 | |
|   adcs    r0, lr, r5
 | |
|   adcs    r1, ip, r4
 | |
|   movcs   r5, r0
 | |
|   movcs   r4, r1
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, r4, r4
 | |
|   adcs    r0, lr, r5
 | |
|   adcs    r1, ip, r4
 | |
|   movcs   r5, r0
 | |
|   movcs   r4, r1
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, r4, r4
 | |
|   adcs    r0, lr, r5
 | |
|   adcs    r1, ip, r4
 | |
|   movcs   r5, r0
 | |
|   movcs   r4, r1
 | |
|   sub     r2, r2, #4      ; 0x4
 | |
|   adcs    r5, r5, r5
 | |
|   adcs    r4, r4, r4
 | |
|   adcs    r0, lr, r5
 | |
|   adcs    r1, ip, r4
 | |
|   tst     r2, r2
 | |
|   movcs   r5, r0
 | |
|   movcs   r4, r1
 | |
|   bpl     _ll_udiv_big_label3
 | |
| _ll_udiv_big_label4
 | |
|   mov     r1, #0  ; 0x0
 | |
|   mov     r2, r5, lsr r6
 | |
|   bic     r5, r5, r2, lsl r6
 | |
|   adcs    r0, r5, r5
 | |
|   adc     r1, r1, #0      ; 0x0
 | |
|   movs    lr, r3, lsl r6
 | |
|   mov     r3, r4, lsr r6
 | |
|   bic     r4, r4, r3, lsl r6
 | |
|   adc     r1, r1, #0      ; 0x0
 | |
|   adds    r0, r0, lr
 | |
|   orr     r2, r2, r4, ror r6
 | |
|   adc     r1, r1, #0      ; 0x0
 | |
|   ldmia   sp!, {r4, r5, r6, pc}
 | |
| 
 | |
| _ll_udiv_ginormous
 | |
|   subs    r2, r5, lr
 | |
|   mov     r1, #0  ; 0x0
 | |
|   sbcs    r3, r4, ip
 | |
|   adc     r0, r1, r1
 | |
|   movcc   r2, r5
 | |
|   movcc   r3, r4
 | |
|   ldmia   sp!, {r4, r5, r6, pc}
 | |
| 
 | |
| _ll_div0
 | |
|   ldmia   sp!, {r4, r5, r6, lr}
 | |
|   mov     r0, #0  ; 0x0
 | |
|   mov     r1, #0  ; 0x0
 | |
|   b       __aeabi_ldiv0
 | |
| 
 | |
| __aeabi_ldiv0
 | |
|   bx        r14
 | |
| 
 | |
|   END
 |