diff options
author | Roland McGrath <roland@gnu.org> | 1996-03-14 11:20:03 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1996-03-14 11:20:03 +0000 |
commit | 52e9a9d1187e1a2a7357f3a0f353058e14667d62 (patch) | |
tree | d898bcf42f7d0a756d27f8386c093f338699a6c8 | |
parent | 6c46dada59a56f8748f6d956ef5d318155195840 (diff) | |
download | glibc-52e9a9d1187e1a2a7357f3a0f353058e14667d62.zip glibc-52e9a9d1187e1a2a7357f3a0f353058e14667d62.tar.gz glibc-52e9a9d1187e1a2a7357f3a0f353058e14667d62.tar.bz2 |
Thu Mar 14 06:01:07 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* string/strnlen.c: New file.
* string/Makefile (routines): Add strnlen.
* string/string.h [__USE_GNU] (strnlen): Declare new function.
[__OPTIMIZE__]: Define extern inline implementation of it.
* stdlib/erand48_r.c: Use __mpn_construct_double instead of ldexp and
addition, to avoid using anything from -lm.
Mon Mar 4 21:57:14 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/m68k/Makefile: New file.
* sysdeps/unix/sysv/linux/m68k/sysdep.h (SYS_ify): Redefine.
(CALL_MCOUNT): New macro, empty unless [PROF].
(ENTRY): Do CALL_MCOUNT just after the label.
(JUMPTARGET): New macro.
(SYSCALL_ERROR_HANDLER): Fix syntax.
Thu Mar 14 04:20:48 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* sysdeps/unix/sysv/linux/init-first.c (init): Call `__personality'
function instead of using inline asm i386 syscall.
* sysdeps/unix/sysv/linux/syscalls.list: Add personality syscall.
* posix/unistd.h [__USE_BSD]: Declare usleep.
* misc/efgcvt.c (MAXDIG): New macro computed from <floats.h> constants.
(fcvt, ecvt): Use it for buffer size.
* stdlib/drand48-iter.c (__drand48_iterate): Use u_int64_t instead of
conditionalizing long vs long long.
* stdlib/drand48-iter.c (__drand48_iterate): Don't check for null
pointers; never return EFAULT.
* stdlib/drand48_r.c (drand48_r): Likewise.
* stdlib/erand48_r.c (erand48_r): Likewise.
-rw-r--r-- | ChangeLog | 39 | ||||
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | misc/efgcvt.c | 9 | ||||
-rw-r--r-- | posix/unistd.h | 8 | ||||
-rw-r--r-- | setjmp/jmpbug.c | 20 | ||||
-rw-r--r-- | stdlib/drand48-iter.c | 57 | ||||
-rw-r--r-- | stdlib/drand48_r.c | 9 | ||||
-rw-r--r-- | stdlib/erand48_r.c | 42 | ||||
-rw-r--r-- | sysdeps/m68k/m68020/add_n.S | 76 | ||||
-rw-r--r-- | sysdeps/m68k/m68020/asm-syntax.h | 105 | ||||
-rw-r--r-- | sysdeps/m68k/m68020/sub_n.S | 76 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/m68k/Makefile | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/m68k/sysdep.h | 34 |
13 files changed, 151 insertions, 332 deletions
@@ -1,5 +1,44 @@ +Thu Mar 14 06:01:07 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu> + + * string/strnlen.c: New file. + * string/Makefile (routines): Add strnlen. + * string/string.h [__USE_GNU] (strnlen): Declare new function. + [__OPTIMIZE__]: Define extern inline implementation of it. + + * stdlib/erand48_r.c: Use __mpn_construct_double instead of ldexp and + addition, to avoid using anything from -lm. + +Mon Mar 4 21:57:14 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/unix/sysv/linux/m68k/Makefile: New file. + + * sysdeps/unix/sysv/linux/m68k/sysdep.h (SYS_ify): Redefine. + (CALL_MCOUNT): New macro, empty unless [PROF]. + (ENTRY): Do CALL_MCOUNT just after the label. + (JUMPTARGET): New macro. + (SYSCALL_ERROR_HANDLER): Fix syntax. + +Thu Mar 14 04:20:48 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu> + + * sysdeps/unix/sysv/linux/init-first.c (init): Call `__personality' + function instead of using inline asm i386 syscall. + * sysdeps/unix/sysv/linux/syscalls.list: Add personality syscall. + + * posix/unistd.h [__USE_BSD]: Declare usleep. + Tue Mar 12 04:57:57 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu> + * misc/efgcvt.c (MAXDIG): New macro computed from <floats.h> constants. + (fcvt, ecvt): Use it for buffer size. + + * stdlib/drand48-iter.c (__drand48_iterate): Use u_int64_t instead of + conditionalizing long vs long long. + + * stdlib/drand48-iter.c (__drand48_iterate): Don't check for null + pointers; never return EFAULT. + * stdlib/drand48_r.c (drand48_r): Likewise. + * stdlib/erand48_r.c (erand48_r): Likewise. + * setjmp/Makefile (tests): Add jmpbug. * setjmp/jmpbug.c: New file. @@ -1,4 +1,4 @@ -GNU C Library NEWS -- history of user-visible changes. 2 January 1996 +GNU C Library NEWS -- history of user-visible changes. 14 March 1996 Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. See the end for copying conditions. @@ -179,6 +179,9 @@ Version 1.10 * New macro `strdupa' copies a string like `strdup', but uses local stack space from `alloca' instead of dynamic heap space from `malloc'. + +* New function `strnlen' is like `strlen' but searches only a given maximum + number of characters for the null terminator. Version 1.09 diff --git a/misc/efgcvt.c b/misc/efgcvt.c index 95b0b0d..e8a0517 100644 --- a/misc/efgcvt.c +++ b/misc/efgcvt.c @@ -1,5 +1,5 @@ /* [efg]cvt -- compatibility functions for floating point formatting. -Copyright (C) 1995 Free Software Foundation, Inc. +Copyright (C) 1995, 1996 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,13 +19,16 @@ Cambridge, MA 02139, USA. */ #include <stdio.h> #include <stdlib.h> +#include <float.h> + +#define MAXDIG (DBL_DIG + DBL_MAX_10_EXP) char * fcvt (value, ndigit, decpt, sign) double value; int ndigit, *decpt, *sign; { - static char buf[100]; + static char buf[MAXDIG]; (void) fcvt_r (value, ndigit, decpt, sign, buf, sizeof buf); @@ -37,7 +40,7 @@ ecvt (value, ndigit, decpt, sign) double value; int ndigit, *decpt, *sign; { - static char buf[100]; + static char buf[MAXDIG]; (void) ecvt_r (value, ndigit, decpt, sign, buf, sizeof buf); diff --git a/posix/unistd.h b/posix/unistd.h index 55d66a6..516f288 100644 --- a/posix/unistd.h +++ b/posix/unistd.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -180,6 +180,12 @@ extern unsigned int alarm __P ((unsigned int __seconds)); error, but if `sleep' returns SECONDS, it probably didn't work. */ extern unsigned int sleep __P ((unsigned int __seconds)); +#ifdef __USE_BSD +/* Sleep USECONDS microseconds, or until a signal arrives that is not blocked + or ignored. Return value is not necessarily useful. */ +extern unsigned int usleep __P ((unsigned __useconds)); +#endif + /* Suspend the process until a signal arrives. This always returns -1 and sets `errno' to EINTR. */ diff --git a/setjmp/jmpbug.c b/setjmp/jmpbug.c index 57a1de0..0dbf7f9 100644 --- a/setjmp/jmpbug.c +++ b/setjmp/jmpbug.c @@ -10,23 +10,31 @@ sub5 (jmp_buf buf) longjmp (buf, 1); } -int -main (void) +void +test (int x) { jmp_buf buf; char *foo; int arr[100]; - arr[77] = 76; + arr[77] = x; if (setjmp (buf)) { printf ("made it ok; %d\n", arr[77]); - exit (0); + return; } foo = (char *) alloca (128); sub5 (buf); +} + +int +main (void) +{ + int i; + + for (i = 123; i < 345; ++i) + test (i); - /* NOTREACHED */ - return 1; + return 0; } diff --git a/stdlib/drand48-iter.c b/stdlib/drand48-iter.c index 967c404..65e78eb 100644 --- a/stdlib/drand48-iter.c +++ b/stdlib/drand48-iter.c @@ -20,7 +20,7 @@ Boston, MA 02111-1307, USA. */ #include <errno.h> #include <stdlib.h> #include <limits.h> - +#include <sys/types.h> /* Global state for non-reentrent functions. */ struct drand48_data __libc_drand48_data; @@ -31,12 +31,7 @@ __drand48_iterate (xsubi, buffer) unsigned short int xsubi[3]; struct drand48_data *buffer; { - /* Be generous for the arguments, detect some errors. */ - if (xsubi == NULL || buffer == NULL) - { - errno = EFAULT; - return -1; - } + u_int64_t X, a, result; /* Initialize buffer, if not yet done. */ if (!buffer->init) @@ -58,42 +53,28 @@ __drand48_iterate (xsubi, buffer) 48 bits. Because we compute the modulus it does not care how many bits really are computed. */ - if (sizeof (long int) >= 6) + if (sizeof (unsigned short int) == 2) { - /* The `long' data type is sufficent. */ - unsigned long int X, a, result; + X = (xsubi[2] << 16 | xsubi[1]) << 16 | xsubi[0]; + a = (buffer->a[2] << 16 | buffer->a[1]) << 16 | buffer->a[0]; -#define ONE_STEP \ - if (sizeof (unsigned short int) == 2) \ - { \ - X = (xsubi[2] << 16 | xsubi[1]) << 16 | xsubi[0]; \ - a = (buffer->a[2] << 16 | buffer->a[1]) << 16 | buffer->a[0]; \ - \ - result = X * a + buffer->c; \ - \ - xsubi[0] = result & 0xffff; \ - result >>= 16; \ - xsubi[1] = result & 0xffff; \ - result >>= 16; \ - xsubi[2] = result & 0xffff; \ - } \ - else \ - { \ - X = xsubi[2] << 16 | xsubi[1] >> 16; \ - a = buffer->a[2] << 16 | buffer->a[1] >> 16; \ - \ - result = X * a + buffer->c; \ - \ - xsubi[0] = result >> 16 & 0xffffffffl; \ - xsubi[1] = result << 16 & 0xffff0000l; \ - } - ONE_STEP; + result = X * a + buffer->c; + + xsubi[0] = result & 0xffff; + result >>= 16; + xsubi[1] = result & 0xffff; + result >>= 16; + xsubi[2] = result & 0xffff; } else { - /* We have to use the `long long' data type. */ - unsigned long long int X, a, result; - ONE_STEP; + X = xsubi[2] << 16 | xsubi[1] >> 16; + a = buffer->a[2] << 16 | buffer->a[1] >> 16; + + result = X * a + buffer->c; + + xsubi[0] = result >> 16 & 0xffffffffl; + xsubi[1] = result << 16 & 0xffff0000l; } return 0; diff --git a/stdlib/drand48_r.c b/stdlib/drand48_r.c index eaba057..3b77486 100644 --- a/stdlib/drand48_r.c +++ b/stdlib/drand48_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -26,12 +26,5 @@ drand48_r (buffer, result) struct drand48_data *buffer; double *result; { - /* be generous for the arguments, detect some errors. */ - if (buffer == NULL) - { - errno = EFAULT; - return -1; - } - return erand48_r (buffer->X, buffer, result); } diff --git a/stdlib/erand48_r.c b/stdlib/erand48_r.c index 86d2f73..ab41474 100644 --- a/stdlib/erand48_r.c +++ b/stdlib/erand48_r.c @@ -17,9 +17,15 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <errno.h> -#include <math.h> #include <stdlib.h> +#include "gmp.h" +#include "gmp-mparam.h" +#include <float.h> + + +/* Function to construct a floating point number from an MP integer + containing the fraction bits, a base 2 exponent, and a sign flag. */ +extern double __mpn_construct_double (mp_srcptr mpn, int exponent, int neg); int erand48_r (xsubi, buffer, result) @@ -27,26 +33,30 @@ erand48_r (xsubi, buffer, result) struct drand48_data *buffer; double *result; { - int i; - - /* Be generous for the arguments, detect some errors. */ - if (result == NULL) - { - errno = EFAULT; - return -1; - } + mp_limb mpn[(3 * sizeof (unsigned short int) + sizeof (mp_limb) - 1) + / sizeof (mp_limb)]; /* Compute next state. */ if (__drand48_iterate (xsubi, buffer) < 0) return -1; - *result = 0.0; - for (i = 4 / sizeof (unsigned short int); i >= 0; --i) - { - double factor = ldexp (1.0, (i - 6) * sizeof (unsigned short int)); + /* Build a 48-bit mpn containing the 48 random bits. */ + +#if BITS_PER_MP_LIMB == 64 + mpn[0] = (xsubi[0] << 32) | (xsubi[1] << 16) | xsubi[2]; +#elif BITS_PER_MP_LIMB == 32 + mpn[0] = (xsubi[1] << 16) | xsubi[2]; + mpn[1] = xsubi[0]; +#else + #error "BITS_PER_MP_LIMB value not handled" +#endif + + /* Shift them up so they are most significant bits of the fraction. */ + __mpn_lshift (mpn, mpn, sizeof mpn / sizeof mpn[0], DBL_MANT_DIG - 48); - *result += factor * (double) xsubi[i]; - } + /* Construct a positive double using those bits for the fractional part, + and a zero exponent so the resulting FP number is [0.0,1.0). */ + *result = __mpn_construct_double (mpn, 0, 0); return 0; } diff --git a/sysdeps/m68k/m68020/add_n.S b/sysdeps/m68k/m68020/add_n.S deleted file mode 100644 index ea7a4458..0000000 --- a/sysdeps/m68k/m68020/add_n.S +++ /dev/null @@ -1,76 +0,0 @@ -/* mc68020 __mpn_add_n -- Add two limb vectors of the same length > 0 and store - sum in a third limb vector. - -Copyright (C) 1992, 1994 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP Library is free software; you can redistribute it and/or modify -it under the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -The GNU MP Library 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 Library General Public -License for more details. - -You should have received a copy of the GNU Library General Public License -along with the GNU MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s1_ptr (sp + 8) - s2_ptr (sp + 16) - size (sp + 12) -*/ - -#include "asm-syntax.h" - - TEXT - ALIGN - GLOBL ___mpn_add_n - -LAB(___mpn_add_n) -/* Save used registers on the stack. */ - INSN2(move,l ,MEM_PREDEC(sp),d2) - INSN2(move,l ,MEM_PREDEC(sp),a2) - -/* Copy the arguments to registers. Better use movem? */ - INSN2(move,l ,a2,MEM_DISP(sp,12)) - INSN2(move,l ,a0,MEM_DISP(sp,16)) - INSN2(move,l ,a1,MEM_DISP(sp,20)) - INSN2(move,l ,d2,MEM_DISP(sp,24)) - - INSN2(eor,w ,d2,#1) - INSN2(lsr,l ,d2,#1) - bcc L1 - INSN2(subq,l ,d2,#1) /* clears cy as side effect */ - -LAB(Loop) - INSN2(move,l ,d0,MEM_POSTINC(a0)) - INSN2(move,l ,d1,MEM_POSTINC(a1)) - INSN2(addx,l ,d0,d1) - INSN2(move,l ,MEM_POSTINC(a2),d0) -LAB(L1) INSN2(move,l ,d0,MEM_POSTINC(a0)) - INSN2(move,l ,d1,MEM_POSTINC(a1)) - INSN2(addx,l ,d0,d1) - INSN2(move,l ,MEM_POSTINC(a2),d0) - - dbf d2,Loop /* loop until 16 lsb of %4 == -1 */ - INSN2(subx,l ,d0,d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */ - INSN2(sub,l ,d2,#0x10000) - bcs L2 - INSN2(add,l ,d0,d0) /* restore cy */ - bra Loop - -LAB(L2) - INSN1(neg,l ,d0) - -/* Restore used registers from stack frame. */ - INSN2(move,l ,a2,MEM_POSTINC(sp)) - INSN2(move,l ,d2,MEM_POSTINC(sp)) - - rts diff --git a/sysdeps/m68k/m68020/asm-syntax.h b/sysdeps/m68k/m68020/asm-syntax.h deleted file mode 100644 index 394b3ca..0000000 --- a/sysdeps/m68k/m68020/asm-syntax.h +++ /dev/null @@ -1,105 +0,0 @@ -/* asm.h -- Definitions for 68k syntax variations. - -Copyright (C) 1992, 1994 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP Library is free software; you can redistribute it and/or modify -it under the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -The GNU MP Library 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 Library General Public -License for more details. - -You should have received a copy of the GNU Library General Public License -along with the GNU MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifdef MIT_SYNTAX -#define MEM(base)base@ -#define MEM_DISP(base,displacement)base@(displacement) -#define MEM_PREDEC(memory_base)memory_base@- -#define MEM_POSTINC(memory_base)memory_base@+ -#ifdef __STDC__ -#define INSN1(mnemonic,size_suffix,dst)mnemonic##size_suffix dst -#define INSN2(mnemonic,size_suffix,dst,src)mnemonic##size_suffix src,dst -#else -#define INSN1(mnemonic,size_suffix,dst)mnemonic/**/size_suffix dst -#define INSN2(mnemonic,size_suffix,dst,src)mnemonic/**/size_suffix src,dst -#endif -#define LAB(label) label: -#define TEXT .text -#define ALIGN .even -#define GLOBL .globl -#endif - -#ifdef SONY_SYNTAX -#define MEM(base)(base) -#define MEM_DISP(base,displacement)(displacement,base) -#define MEM_PREDEC(memory_base)-(memory_base) -#define MEM_POSTINC(memory_base)(memory_base)+ -#define INSN1(mnemonic,size_suffix,dst)mnemonic.size_suffix dst -#ifdef __STDC__ -#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src##,dst -#else -#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src/**/,dst -#endif -#define LAB(label) label: -#define TEXT .text -#define ALIGN .even -#define GLOBL .globl -#endif - -#ifdef MOTOROLA_SYNTAX -#define MEM(base)(base) -#define MEM_DISP(base,displacement)(displacement,base) -#define MEM_PREDEC(memory_base)-(memory_base) -#define MEM_POSTINC(memory_base)(memory_base)+ -#define INSN1(mnemonic,size_suffix,dst)mnemonic.size_suffix dst -#ifdef __STDC__ -#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src##,dst -#else -#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src/**/,dst -#endif -#define LAB(label) label -#define TEXT -#define ALIGN -#define GLOBL XDEF -#define l L -#define w W -#define move MOVE -#define eor EOR -#define lsr LSR -#define add ADD -#define addx ADDX -#define addq ADDQ -#define sub SUB -#define subx SUBX -#define subq SUBQ -#define neg NEG -#define bcc BCC -#define bcs BCS -#define bra BRA -#define dbf DBF -#define rts RTS -#define d0 D0 -#define d1 D1 -#define d2 D2 -#define d3 D3 -#define d4 D4 -#define d5 D5 -#define d6 D6 -#define d7 D7 -#define a0 A0 -#define a1 A1 -#define a2 A2 -#define a3 A3 -#define a4 A4 -#define a5 A5 -#define a6 A6 -#define a7 A7 -#define sp SP -#endif diff --git a/sysdeps/m68k/m68020/sub_n.S b/sysdeps/m68k/m68020/sub_n.S deleted file mode 100644 index 19f0ec1..0000000 --- a/sysdeps/m68k/m68020/sub_n.S +++ /dev/null @@ -1,76 +0,0 @@ -/* mc68020 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and - store difference in a third limb vector. - -Copyright (C) 1992, 1994 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP Library is free software; you can redistribute it and/or modify -it under the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -The GNU MP Library 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 Library General Public -License for more details. - -You should have received a copy of the GNU Library General Public License -along with the GNU MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - INPUT PARAMETERS - res_ptr (sp + 4) - s1_ptr (sp + 8) - s2_ptr (sp + 16) - size (sp + 12) -*/ - -#include "asm-syntax.h" - - TEXT - ALIGN - GLOBL ___mpn_sub_n - -LAB(___mpn_sub_n) -/* Save used registers on the stack. */ - INSN2(move,l ,MEM_PREDEC(sp),d2) - INSN2(move,l ,MEM_PREDEC(sp),a2) - -/* Copy the arguments to registers. Better use movem? */ - INSN2(move,l ,a2,MEM_DISP(sp,12)) - INSN2(move,l ,a0,MEM_DISP(sp,16)) - INSN2(move,l ,a1,MEM_DISP(sp,20)) - INSN2(move,l ,d2,MEM_DISP(sp,24)) - - INSN2(eor,w ,d2,#1) - INSN2(lsr,l ,d2,#1) - bcc L1 - INSN2(subq,l ,d2,#1) /* clears cy as side effect */ - -LAB(Loop) - INSN2(move,l ,d0,MEM_POSTINC(a0)) - INSN2(move,l ,d1,MEM_POSTINC(a1)) - INSN2(subx,l ,d0,d1) - INSN2(move,l ,MEM_POSTINC(a2),d0) -LAB(L1) INSN2(move,l ,d0,MEM_POSTINC(a0)) - INSN2(move,l ,d1,MEM_POSTINC(a1)) - INSN2(subx,l ,d0,d1) - INSN2(move,l ,MEM_POSTINC(a2),d0) - - dbf d2,Loop /* loop until 16 lsb of %4 == -1 */ - INSN2(subx,l ,d0,d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */ - INSN2(sub,l ,d2,#0x10000) - bcs L2 - INSN2(add,l ,d0,d0) /* restore cy */ - bra Loop - -LAB(L2) - INSN1(neg,l ,d0) - -/* Restore used registers from stack frame. */ - INSN2(move,l ,a2,MEM_POSTINC(sp)) - INSN2(move,l ,d2,MEM_POSTINC(sp)) - - rts diff --git a/sysdeps/unix/sysv/linux/m68k/Makefile b/sysdeps/unix/sysv/linux/m68k/Makefile new file mode 100644 index 0000000..bdbd105 --- /dev/null +++ b/sysdeps/unix/sysv/linux/m68k/Makefile @@ -0,0 +1,3 @@ +# Linux/m68k uses Motorola asm syntax and the ELF format. + +m68k-syntax-flag = -DMOTOROLA_SYNTAX diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.h b/sysdeps/unix/sysv/linux/m68k/sysdep.h index 9b6c8e1..ee48117 100644 --- a/sysdeps/unix/sysv/linux/m68k/sysdep.h +++ b/sysdeps/unix/sysv/linux/m68k/sysdep.h @@ -23,6 +23,17 @@ Cambridge, MA 02139, USA. */ #include <sysdeps/unix/sysdep.h> +/* For Linux we can use the system call table in the header file + /usr/include/asm/unistd.h + of the kernel. But these symbols do not follow the SYS_* syntax + so we have to redefine the `SYS_ify' macro here. */ +#undef SYS_ify +#ifdef __STDC__ +# define SYS_ify(syscall_name) __NR_##syscall_name +#else +# define SYS_ify(syscall_name) __NR_/**/syscall_name +#endif + #ifdef ASSEMBLER #define POUND # @@ -32,7 +43,26 @@ Cambridge, MA 02139, USA. */ .globl name; \ .type name, @function; \ .align 4; \ - name##: + C_LABEL(name) \ + CALL_MCOUNT + +/* If compiled for profiling, call `_mcount' at the start of each function. */ +#ifdef PROF +/* The mcount code relies on a normal frame pointer being on the stack + to locate our caller, so push one just for its benefit. */ +#define CALL_MCOUNT \ + move.l %fp, -(%sp); move.l %sp, %fp; \ + jbsr JUMPTARGET (_mcount); \ + move.l (%sp)+, %fp; +#else +#define CALL_MCOUNT /* Do nothing. */ +#endif + +#ifdef PIC +#define JUMPTARGET(name) name##@PLTPC +#else +#define JUMPTARGET(name) name +#endif /* Since C identifiers are not normally prefixed with an underscore on this system, the asm identifier `syscall_error' intrudes on the @@ -53,7 +83,7 @@ Cambridge, MA 02139, USA. */ /* Store (- %d0) into errno through the GOT. */ #define SYSCALL_ERROR_HANDLER \ syscall_error: \ - move.l (errno@GOTPC.l, %pc), %a0; \ + move.l (errno@GOTPC, %pc), %a0; \ neg.l %d0; \ move.l %d0, (%a0); \ move.l POUND -1, %d0; \ |