Commit 9bd05108 by Richard Sandiford Committed by Richard Sandiford

lib1funcs.asm (__aeabi_uidiv, [...]): New aliases.

	* config/arm/lib1funcs.asm (__aeabi_uidiv, __aeabi_idiv): New aliases.
	* config/arm/libgcc-bpabi.ver (GCC_3.5): Add __aeabi_idiv,
	__aeabi_uidiv, __aeabi_uread4, __aeabi_uread8, __aeabi_uwrite4
	and __aeabi_uwrite8.
	* config/arm/unaligned-funcs.c: New file.
	* config/arm/t-bpabi (LIB2FUNCS_EXTRA): Add unaligned-funcs.c.

From-SVN: r102947
parent defb77dc
2005-08-10 Richard Sandiford <richard@codesourcery.com>
* config/arm/lib1funcs.asm (__aeabi_uidiv, __aeabi_idiv): New aliases.
* config/arm/libgcc-bpabi.ver (GCC_3.5): Add __aeabi_idiv,
__aeabi_uidiv, __aeabi_uread4, __aeabi_uread8, __aeabi_uwrite4
and __aeabi_uwrite8.
* config/arm/unaligned-funcs.c: New file.
* config/arm/t-bpabi (LIB2FUNCS_EXTRA): Add unaligned-funcs.c.
2005-08-09 Paolo Bonzini <bonzini@gnu.org> 2005-08-09 Paolo Bonzini <bonzini@gnu.org>
* bb-reorder.c (pass_duplicate_computed_gotos, pass_partition_blocks): * bb-reorder.c (pass_duplicate_computed_gotos, pass_partition_blocks):
......
...@@ -702,6 +702,7 @@ LSYM(Lgot_result): ...@@ -702,6 +702,7 @@ LSYM(Lgot_result):
#ifdef L_udivsi3 #ifdef L_udivsi3
FUNC_START udivsi3 FUNC_START udivsi3
FUNC_ALIAS aeabi_uidiv udivsi3
#ifdef __thumb__ #ifdef __thumb__
...@@ -812,6 +813,7 @@ LSYM(Lover10): ...@@ -812,6 +813,7 @@ LSYM(Lover10):
#ifdef L_divsi3 #ifdef L_divsi3
FUNC_START divsi3 FUNC_START divsi3
FUNC_ALIAS aeabi_idiv divsi3
#ifdef __thumb__ #ifdef __thumb__
cmp divisor, #0 cmp divisor, #0
......
...@@ -42,6 +42,7 @@ GCC_3.5 { ...@@ -42,6 +42,7 @@ GCC_3.5 {
__aeabi_fsub __aeabi_fsub
__aeabi_i2d __aeabi_i2d
__aeabi_i2f __aeabi_i2f
__aeabi_idiv
__aeabi_idiv0 __aeabi_idiv0
__aeabi_idivmod __aeabi_idivmod
__aeabi_l2d __aeabi_l2d
...@@ -55,11 +56,16 @@ GCC_3.5 { ...@@ -55,11 +56,16 @@ GCC_3.5 {
__aeabi_lmul __aeabi_lmul
__aeabi_ui2d __aeabi_ui2d
__aeabi_ui2f __aeabi_ui2f
__aeabi_uidiv
__aeabi_uidivmod __aeabi_uidivmod
__aeabi_uldivmod __aeabi_uldivmod
__aeabi_ulcmp __aeabi_ulcmp
__aeabi_ul2d __aeabi_ul2d
__aeabi_ul2f __aeabi_ul2f
__aeabi_uread4
__aeabi_uread8
__aeabi_uwrite4
__aeabi_uwrite8
# Exception-Handling # Exception-Handling
# \S 7.5 # \S 7.5
......
...@@ -3,7 +3,8 @@ LIB1ASMFUNCS += _aeabi_lcmp _aeabi_ulcmp _aeabi_ldivmod _aeabi_uldivmod \ ...@@ -3,7 +3,8 @@ LIB1ASMFUNCS += _aeabi_lcmp _aeabi_ulcmp _aeabi_ldivmod _aeabi_uldivmod \
_unwind _unwind
# Add the BPABI C functions. # Add the BPABI C functions.
LIB2FUNCS_EXTRA = $(srcdir)/config/arm/bpabi.c LIB2FUNCS_EXTRA = $(srcdir)/config/arm/bpabi.c \
$(srcdir)/config/arm/unaligned-funcs.c
UNWIND_H = $(srcdir)/config/arm/unwind-arm.h UNWIND_H = $(srcdir)/config/arm/unwind-arm.h
LIB2ADDEH = $(srcdir)/config/arm/unwind-arm.c \ LIB2ADDEH = $(srcdir)/config/arm/unwind-arm.c \
......
/* EABI unaligned read/write functions.
Copyright (C) 2005 Free Software Foundation, Inc.
Contributed by CodeSourcery, LLC.
This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
In addition to the permissions in the GNU General Public License, the
Free Software Foundation gives you unlimited permission to link the
compiled version of this file into combinations with other programs,
and to distribute those combinations without any restriction coming
from the use of this file. (The General Public License restrictions
do apply in other respects; for example, they cover modification of
the file, and distribution when not linked into a combine
executable.)
This file is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
int __aeabi_uread4 (void *);
int __aeabi_uwrite4 (int, void *);
long long __aeabi_uread8 (void *);
long long __aeabi_uwrite8 (long long, void *);
struct __attribute__((packed)) u4 { int data; };
struct __attribute__((packed)) u8 { long long data; };
int
__aeabi_uread4 (void *ptr)
{
return ((struct u4 *) ptr)->data;
}
int
__aeabi_uwrite4 (int data, void *ptr)
{
((struct u4 *) ptr)->data = data;
return data;
}
long long
__aeabi_uread8 (void *ptr)
{
return ((struct u8 *) ptr)->data;
}
long long
__aeabi_uwrite8 (long long data, void *ptr)
{
((struct u8 *) ptr)->data = data;
return data;
}
2005-08-10 Richard Sandiford <richard@codesourcery.com>
* gcc.dg/arm-eabi1.c: Test aeabi_idiv, __aeabi_uidiv, __aeabi_uread4,
__aeabi_uread8, __aeabi_uwrite4 and __aeabi_uwrite8.
2005-08-10 Volker Reichelt <reichelt@igpm.rwth-aachen.de> 2005-08-10 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/20646 PR c++/20646
......
...@@ -23,9 +23,8 @@ ...@@ -23,9 +23,8 @@
require the use of inline assembly to test. It would be good to require the use of inline assembly to test. It would be good to
add such tests, but they have not yet been implemented. add such tests, but they have not yet been implemented.
There are also no tests for the "division by zero", "unaligned There are also no tests for the "division by zero", "memory copying,
memory access", "memory copying, clearing, and setting" clearing, and setting" functions. */
functions. */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -74,6 +73,12 @@ extern long long __aeabi_llsr (long long, int); ...@@ -74,6 +73,12 @@ extern long long __aeabi_llsr (long long, int);
extern long long __aeabi_lasr (long long, int); extern long long __aeabi_lasr (long long, int);
extern int __aeabi_lcmp (long long, long long); extern int __aeabi_lcmp (long long, long long);
extern int __aeabi_ulcmp (unsigned long long, unsigned long long); extern int __aeabi_ulcmp (unsigned long long, unsigned long long);
extern int __aeabi_idiv (int, int);
extern unsigned int __aeabi_uidiv (unsigned int, unsigned int);
extern int __eabi_uread4 (void *);
extern int __eabi_uwrite4 (int, void *);
extern long long __eabi_uread8 (void *);
extern long long __eabi_uwrite8 (long long, void *);
#define eq(a, b, type, abs, epsilon, format) \ #define eq(a, b, type, abs, epsilon, format) \
{ \ { \
...@@ -99,6 +104,9 @@ extern int __aeabi_ulcmp (unsigned long long, unsigned long long); ...@@ -99,6 +104,9 @@ extern int __aeabi_ulcmp (unsigned long long, unsigned long long);
#define deq(a, b) eq (a, b, double, fabs, depsilon, "%g") #define deq(a, b) eq (a, b, double, fabs, depsilon, "%g")
int main () { int main () {
unsigned char bytes[256];
int i;
/* Table 2. Double-precision floating-point arithmetic. */ /* Table 2. Double-precision floating-point arithmetic. */
deq (__aeabi_dadd (dzero, done), done); deq (__aeabi_dadd (dzero, done), done);
deq (__aeabi_dadd (done, done), dtwo); deq (__aeabi_dadd (done, done), dtwo);
...@@ -232,4 +240,30 @@ int main () { ...@@ -232,4 +240,30 @@ int main () {
ieq (__aeabi_ulcmp (0LL, 1LL), -1); ieq (__aeabi_ulcmp (0LL, 1LL), -1);
ieq (__aeabi_ulcmp (0LL, 0LL), 0); ieq (__aeabi_ulcmp (0LL, 0LL), 0);
ieq (__aeabi_ulcmp (1LL, 0LL), 1); ieq (__aeabi_ulcmp (1LL, 0LL), 1);
ieq (__aeabi_idiv (-550, 11), -50);
ueq (__aeabi_uidiv (4000000000U, 1000000U), 4000U);
for (i = 0; i < 256; i++)
bytes[i] = i;
#ifdef __ARMEB__
ieq (__aeabi_uread4 (bytes + 1), 0x01020304U);
leq (__aeabi_uread8 (bytes + 3), 0x030405060708090aLL);
ieq (__aeabi_uwrite4 (0x66778899U, bytes + 5), 0x66778899U);
leq (__aeabi_uwrite8 (0x2030405060708090LL, bytes + 15),
0x2030405060708090LL);
#else
ieq (__aeabi_uread4 (bytes + 1), 0x04030201U);
leq (__aeabi_uread8 (bytes + 3), 0x0a09080706050403LL);
ieq (__aeabi_uwrite4 (0x99887766U, bytes + 5), 0x99887766U);
leq (__aeabi_uwrite8 (0x9080706050403020LL, bytes + 15),
0x9080706050403020LL);
#endif
for (i = 0; i < 4; i++)
ieq (bytes[5 + i], (6 + i) * 0x11);
for (i = 0; i < 8; i++)
ieq (bytes[15 + i], (2 + i) * 0x10);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment