Home | History | Annotate | Line # | Download | only in arm
bpabi.S revision 1.1.1.1
      1 /* Miscellaneous BPABI functions.
      2 
      3    Copyright (C) 2003-2013 Free Software Foundation, Inc.
      4    Contributed by CodeSourcery, LLC.
      5 
      6    This file is free software; you can redistribute it and/or modify it
      7    under the terms of the GNU General Public License as published by the
      8    Free Software Foundation; either version 3, or (at your option) any
      9    later version.
     10 
     11    This file is distributed in the hope that it will be useful, but
     12    WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14    General Public License for more details.
     15 
     16    Under Section 7 of GPL version 3, you are granted additional
     17    permissions described in the GCC Runtime Library Exception, version
     18    3.1, as published by the Free Software Foundation.
     19 
     20    You should have received a copy of the GNU General Public License and
     21    a copy of the GCC Runtime Library Exception along with this program;
     22    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23    <http://www.gnu.org/licenses/>.  */
     24 
     25 #ifdef __ARM_EABI__
     26 /* Some attributes that are common to all routines in this file.  */
     27 	/* Tag_ABI_align_needed: This code does not require 8-byte
     28 	   alignment from the caller.  */
     29 	/* .eabi_attribute 24, 0  -- default setting.  */
     30 	/* Tag_ABI_align_preserved: This code preserves 8-byte
     31 	   alignment in any callee.  */
     32 	.eabi_attribute 25, 1
     33 #endif /* __ARM_EABI__ */
     34 
     35 #ifdef L_aeabi_lcmp
     36 
     37 ARM_FUNC_START aeabi_lcmp
     38 	cmp	xxh, yyh
     39 	do_it	lt
     40 	movlt	r0, #-1
     41 	do_it	gt
     42 	movgt	r0, #1
     43 	do_it	ne
     44 	RETc(ne)
     45 	subs	r0, xxl, yyl
     46 	do_it	lo
     47 	movlo	r0, #-1
     48 	do_it	hi
     49 	movhi	r0, #1
     50 	RET
     51 	FUNC_END aeabi_lcmp
     52 
     53 #endif /* L_aeabi_lcmp */
     54 
     55 #ifdef L_aeabi_ulcmp
     56 
     57 ARM_FUNC_START aeabi_ulcmp
     58 	cmp	xxh, yyh
     59 	do_it	lo
     60 	movlo	r0, #-1
     61 	do_it	hi
     62 	movhi	r0, #1
     63 	do_it	ne
     64 	RETc(ne)
     65 	cmp	xxl, yyl
     66 	do_it	lo
     67 	movlo	r0, #-1
     68 	do_it	hi
     69 	movhi	r0, #1
     70 	do_it	eq
     71 	moveq	r0, #0
     72 	RET
     73 	FUNC_END aeabi_ulcmp
     74 
     75 #endif /* L_aeabi_ulcmp */
     76 
     77 .macro test_div_by_zero signed
     78 /* Tail-call to divide-by-zero handlers which may be overridden by the user,
     79    so unwinding works properly.  */
     80 #if defined(__thumb2__)
     81 	cbnz	yyh, 1f
     82 	cbnz	yyl, 1f
     83 	cmp	xxh, #0
     84 	do_it	eq
     85 	cmpeq	xxl, #0
     86 	.ifc \signed, unsigned
     87 	beq	2f
     88 	mov	xxh, #0xffffffff
     89 	mov	xxl, xxh
     90 2:
     91 	.else
     92 	do_it	lt, t
     93 	movlt	xxl, #0
     94 	movlt	xxh, #0x80000000
     95 	do_it	gt, t
     96 	movgt	xxh, #0x7fffffff
     97 	movgt	xxl, #0xffffffff
     98 	.endif
     99 	b	SYM (__aeabi_ldiv0) __PLT__
    100 1:
    101 #else
    102 	/* Note: Thumb-1 code calls via an ARM shim on processors which
    103 	   support ARM mode.  */
    104 	cmp	yyh, #0
    105 	cmpeq	yyl, #0
    106 	bne	2f
    107 	cmp	xxh, #0
    108 	cmpeq	xxl, #0
    109 	.ifc \signed, unsigned
    110 	movne	xxh, #0xffffffff
    111 	movne	xxl, #0xffffffff
    112 	.else
    113 	movlt	xxh, #0x80000000
    114 	movlt	xxl, #0
    115 	movgt	xxh, #0x7fffffff
    116 	movgt	xxl, #0xffffffff
    117 	.endif
    118 	b	SYM (__aeabi_ldiv0) __PLT__
    119 2:
    120 #endif
    121 .endm
    122 
    123 #ifdef L_aeabi_ldivmod
    124 
    125 ARM_FUNC_START aeabi_ldivmod
    126 	test_div_by_zero signed
    127 
    128 	sub sp, sp, #8
    129 #if defined(__thumb2__)
    130 	mov ip, sp
    131 	push {ip, lr}
    132 #else
    133 	do_push {sp, lr}
    134 #endif
    135 	bl SYM(__gnu_ldivmod_helper) __PLT__
    136 	ldr lr, [sp, #4]
    137 	add sp, sp, #8
    138 	do_pop {r2, r3}
    139 	RET
    140 
    141 #endif /* L_aeabi_ldivmod */
    142 
    143 #ifdef L_aeabi_uldivmod
    144 
    145 ARM_FUNC_START aeabi_uldivmod
    146 	test_div_by_zero unsigned
    147 
    148 	sub sp, sp, #8
    149 #if defined(__thumb2__)
    150 	mov ip, sp
    151 	push {ip, lr}
    152 #else
    153 	do_push {sp, lr}
    154 #endif
    155 	bl SYM(__gnu_uldivmod_helper) __PLT__
    156 	ldr lr, [sp, #4]
    157 	add sp, sp, #8
    158 	do_pop {r2, r3}
    159 	RET
    160 
    161 #endif /* L_aeabi_divmod */
    162 
    163