bpabi.S revision 1.1.1.1.4.2
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 37ARM_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 57ARM_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 902: 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__ 1001: 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__ 1192: 120#endif 121.endm 122 123#ifdef L_aeabi_ldivmod 124 125ARM_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 145ARM_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