diff options
author | Roland McGrath <roland@gnu.org> | 1995-02-18 01:27:10 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1995-02-18 01:27:10 +0000 |
commit | 28f540f45bbacd939bfd07f213bcad2bf730b1bf (patch) | |
tree | 15f07c4c43d635959c6afee96bde71fb1b3614ee /sysdeps/m68k | |
download | glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.tar.gz glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.tar.xz glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.zip |
initial import
Diffstat (limited to 'sysdeps/m68k')
53 files changed, 1683 insertions, 0 deletions
diff --git a/sysdeps/m68k/Implies b/sysdeps/m68k/Implies new file mode 100644 index 0000000000..a67e1c2741 --- /dev/null +++ b/sysdeps/m68k/Implies @@ -0,0 +1,2 @@ +# 68k uses IEEE 754 floating point. +ieee754 diff --git a/sysdeps/m68k/Makefile b/sysdeps/m68k/Makefile new file mode 100644 index 0000000000..ea0c7d5cbb --- /dev/null +++ b/sysdeps/m68k/Makefile @@ -0,0 +1,32 @@ +# Copyright (C) 1993, 1994 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 +# 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 C 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 C Library; see the file COPYING.LIB. If +# not, write to the Free Software Foundation, Inc., 675 Mass Ave, +# Cambridge, MA 02139, USA. + +# This uses MIT assembler syntax. We have no convenient +# way to choose a sysdep file based on MIT vs Motorola syntax. +# No existing m68k ports use Motorola syntax. + +crypt := crypt.sun3 # Use crypt/crypt.sun3.S. + +# The mpn functions need this. All existing 68k ports use MIT syntax. If +# a new port wants to use Motorola or Sony syntax, it can redefine this +# variable. +ifndef m68k-syntax-flag +m68k-syntax-flag = -DMIT_SYNTAX +endif + +asm-CPPFLAGS := $(asm-CPPFLAGS) $(m68k-syntax-flag) diff --git a/sysdeps/m68k/__longjmp.c b/sysdeps/m68k/__longjmp.c new file mode 100644 index 0000000000..4fc61084a0 --- /dev/null +++ b/sysdeps/m68k/__longjmp.c @@ -0,0 +1,56 @@ +/* Copyright (C) 1991, 1992, 1993, 1994, 1995 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <setjmp.h> +#include <stdlib.h> + +/* Jump to the position specified by ENV, causing the + setjmp call there to return VAL, or 1 if VAL is 0. */ +void +__longjmp (__jmp_buf env, int val) +{ + /* This restores the FP and SP that setjmp's caller had, + and puts the return address into A0 and VAL into D0. */ + +#if defined(__HAVE_68881__) || defined(__HAVE_FPU__) + /* Restore the floating-point registers. */ + asm volatile("fmovem%.x %0, fp0-fp7" : + /* No outputs. */ : "g" (env[0].__fpregs[0]) : + "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7"); +#endif + + /* Put VAL in D0. */ + asm volatile("move%.l %0, d0" : /* No outputs. */ : + "g" (val == 0 ? 1 : val) : "d0"); + + asm volatile(/* Restore the data and address registers. */ + "movem%.l %0, d1-d7/a0-a7\n" + /* Return to setjmp's caller. */ +#ifdef __motorola__ + "jmp (a0)" +#else + "jmp a0@" +#endif + : /* No outputs. */ : "g" (env[0].__dregs[0]) + /* We don't bother with the clobbers, + because this code always jumps out anyway. */ + ); + + /* This call avoids `volatile function does return' warnings. */ + abort (); +} diff --git a/sysdeps/m68k/bsd-_setjmp.S b/sysdeps/m68k/bsd-_setjmp.S new file mode 100644 index 0000000000..a0b639306d --- /dev/null +++ b/sysdeps/m68k/bsd-_setjmp.S @@ -0,0 +1,42 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. m68k version. +Copyright (C) 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 0)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +#ifdef MOTOROLA_SYNTAX +#define d0 %d0 +#define d1 %d1 +#define PUSH(reg) move.l reg, -(%esp) +#define POP(reg) move.l (%esp)+, reg +#else +#define PUSH(reg) movel reg, sp@- +#define POP(reg) movel sp@+, reg +#endif + +ENTRY (_setjmp) + POP (d0) /* Pop return PC. */ + POP (d1) /* Pop jmp_buf argument. */ + PUSH (#0) /* Push second argument of zero. */ + PUSH (d1) /* Push back first argument. */ + PUSH (d0) /* Push back return PC. */ + jmp C_SYMBOL_NAME (__sigsetjmp) diff --git a/sysdeps/m68k/bsd-setjmp.S b/sysdeps/m68k/bsd-setjmp.S new file mode 100644 index 0000000000..d218b44279 --- /dev/null +++ b/sysdeps/m68k/bsd-setjmp.S @@ -0,0 +1,42 @@ +/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. m68k version. +Copyright (C) 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 1)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +#ifdef MOTOROLA_SYNTAX +#define d0 %d0 +#define d1 %d1 +#define PUSH(reg) move.l reg, -(%esp) +#define POP(reg) move.l (%esp)+, reg +#else +#define PUSH(reg) movel reg, sp@- +#define POP(reg) movel sp@+, reg +#endif + +ENTRY (setjmp) + POP (d0) /* Pop return PC. */ + POP (d1) /* Pop jmp_buf argument. */ + PUSH (#1) /* Push second argument of one. */ + PUSH (d1) /* Push back first argument. */ + PUSH (d0) /* Push back return PC. */ + jmp C_SYMBOL_NAME (__sigsetjmp) diff --git a/sysdeps/m68k/bytesex.h b/sysdeps/m68k/bytesex.h new file mode 100644 index 0000000000..6f985293f2 --- /dev/null +++ b/sysdeps/m68k/bytesex.h @@ -0,0 +1,3 @@ +/* m68k is big-endian. */ + +#define __BYTE_ORDER __BIG_ENDIAN diff --git a/sysdeps/m68k/ffs.c b/sysdeps/m68k/ffs.c new file mode 100644 index 0000000000..d9ec2b1ced --- /dev/null +++ b/sysdeps/m68k/ffs.c @@ -0,0 +1,42 @@ +/* ffs -- find first set bit in a word, counted from least significant end. + For mc68020, mc68030, mc68040. + Copyright (C) 1991, 1992 Free Software Foundation, Inc. + Contributed by Torbjorn Granlund (tege@sics.se). + +The GNU C 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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#include <string.h> + +#undef ffs + +#if defined (__GNUC__) && defined (__mc68020__) + +int +DEFUN(ffs, (x), int x) +{ + int cnt; + + asm("bfffo %1{#0:#0},%0" : "=d" (cnt) : "rm" (x & -x)); + + return 32 - cnt; +} + +#else + +#include <sysdeps/generic/ffs.c> + +#endif diff --git a/sysdeps/m68k/fpu/Makefile b/sysdeps/m68k/fpu/Makefile new file mode 100644 index 0000000000..42db6381d3 --- /dev/null +++ b/sysdeps/m68k/fpu/Makefile @@ -0,0 +1,11 @@ +ifeq ($(subdir),math) +ifndef math-twiddled + +# Avoid twiddling in generic/Makefile. +math-twiddled := t + +endif + +bsdmath_dirs := $(bsdmath_dirs) mc68881 + +endif diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h new file mode 100644 index 0000000000..a9ae2d966c --- /dev/null +++ b/sysdeps/m68k/fpu/__math.h @@ -0,0 +1,168 @@ +/* Copyright (C) 1991, 1992, 1993, 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#ifdef __GNUC__ + +#include <sys/cdefs.h> + +#ifdef __NO_MATH_INLINES +/* This is used when defining the functions themselves. Define them with + __ names, and with `static inline' instead of `extern inline' so the + bodies will always be used, never an external function call. */ +#define __m81_u(x) __CONCAT(__,x) +#define __m81_inline static __inline +#else +#define __m81_u(x) x +#define __m81_inline exter __inline +#define __MATH_INLINES 1 +#endif + +#define __inline_mathop2(func, op) \ + __m81_inline __CONSTVALUE double \ + __m81_u(func)(double __mathop_x) \ + { \ + double __result; \ + __asm("f" __STRING(op) "%.x %1, %0" : "=f" (__result) : "f" (__mathop_x));\ + return __result; \ + } +#define __inline_mathop(op) __inline_mathop2(op, op) + +__inline_mathop(acos) +__inline_mathop(asin) +__inline_mathop(atan) +__inline_mathop(cos) +__inline_mathop(sin) +__inline_mathop(tan) +__inline_mathop(cosh) +__inline_mathop(sinh) +__inline_mathop(tanh) +__inline_mathop2(exp, etox) +__inline_mathop2(fabs, abs) +__inline_mathop(log10) +__inline_mathop2(log, logn) +__inline_mathop2(floor, intrz) +__inline_mathop(sqrt) + +__inline_mathop2(__rint, int) +__inline_mathop2(__expm1, etoxm1) + +#ifdef __USE_MISC +__inline_mathop2(rint, int) +__inline_mathop2(expm1, etoxm1) +__inline_mathop2(log1p, lognp1) +__inline_mathop(atanh) +#endif + +__m81_inline __CONSTVALUE double +__m81_u(__drem)(double __x, double __y) +{ + double __result; + __asm("frem%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); + return __result; +} + +__m81_inline __CONSTVALUE double +__m81_u(ldexp)(double __x, int __e) +{ + double __result; + double __double_e = (double) __e; + __asm("fscale%.x %1, %0" : "=f" (__result) : "f" (__double_e), "0" (__x)); + return __result; +} + +__m81_inline __CONSTVALUE double +__m81_u(fmod)(double __x, double __y) +{ + double __result; + __asm("fmod%.x %1, %0" : "=f" (__result) : "f" (__y), "0" (__x)); + return __result; +} + +__m81_inline double +__m81_u(frexp)(double __value, int *__expptr) +{ + double __mantissa, __exponent; + __asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); + __asm("fgetman%.x %1, %0" : "=f" (__mantissa) : "f" (__value)); + *__expptr = (int) __exponent; + return __mantissa; +} + +__m81_inline __CONSTVALUE double +__m81_u(pow)(double __x, double __y) +{ + double __result; + if (__y == 0.0 || __x == 1.0) + __result = 1.0; + else if (__y == 1.0) + __result = __x; + else if (__y == 2.0) + __result = __x * __x; + else if (__x == 10.0) + __asm("ftentox%.x %1, %0" : "=f" (__result) : "f" (__y)); + else if (__x == 2.0) + __asm("ftwotox%.x %1, %0" : "=f" (__result) : "f" (__y)); + else + __result = __m81_u(exp)(__y * __m81_u(log)(__x)); + return __result; +} + +__m81_inline __CONSTVALUE double +__m81_u(ceil)(double __x) +{ + double __result; + unsigned long int __ctrl_reg; + __asm("fmove%.l fpcr, %0" : "=g" (__ctrl_reg)); + /* Set rounding towards positive infinity. */ + __asm("fmove%.l %0, fpcr" : /* No outputs. */ : "g" (__ctrl_reg | 0x30)); + /* Convert X to an integer, using +Inf rounding. */ + __asm("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); + /* Restore the previous rounding mode. */ + __asm("fmove%.l %0, fpcr" : /* No outputs. */ : "g" (__ctrl_reg)); + return __result; +} + +__m81_inline double +__m81_u(modf)(double __value, double *__iptr) +{ + double __modf_int = __m81_u(floor)(__value); + *__iptr = __modf_int; + return __value - __modf_int; +} + +__m81_inline __CONSTVALUE int +__m81_u(__isinf)(double __value) +{ + /* There is no branch-condition for infinity, + so we must extract and examine the condition codes manually. */ + unsigned long int __fpsr; + __asm("ftst%.x %1\n" + "fmove%.l fpsr, %0" : "=g" (__fpsr) : "f" (__value)); + return (__fpsr & (2 << (3 * 8))) ? (__value < 0 ? -1 : 1) : 0; +} + +__m81_inline __CONSTVALUE int +__m81_u(__isnan)(double __value) +{ + char __result; + __asm("ftst%.x %1\n" + "fsun %0" : "=g" (__result) : "f" (__value)); + return __result; +} + +#endif /* GCC. */ diff --git a/sysdeps/m68k/fpu/acos.c b/sysdeps/m68k/fpu/acos.c new file mode 100644 index 0000000000..d4be88f17c --- /dev/null +++ b/sysdeps/m68k/fpu/acos.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1991, 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#define __NO_MATH_INLINES +#include <math.h> + +#ifndef FUNC +#define FUNC acos +#endif + + +__CONSTVALUE double +DEFUN(FUNC, (x), double x) +{ + return __m81_u(FUNC)(x); +} diff --git a/sysdeps/m68k/fpu/asin.c b/sysdeps/m68k/fpu/asin.c new file mode 100644 index 0000000000..0e3e58f697 --- /dev/null +++ b/sysdeps/m68k/fpu/asin.c @@ -0,0 +1,2 @@ +#define FUNC asin +#include <acos.c> diff --git a/sysdeps/m68k/fpu/atan.c b/sysdeps/m68k/fpu/atan.c new file mode 100644 index 0000000000..b9d428e170 --- /dev/null +++ b/sysdeps/m68k/fpu/atan.c @@ -0,0 +1,2 @@ +#define FUNC atan +#include <acos.c> diff --git a/sysdeps/m68k/fpu/atan2.c b/sysdeps/m68k/fpu/atan2.c new file mode 100644 index 0000000000..1efdb1f7a6 --- /dev/null +++ b/sysdeps/m68k/fpu/atan2.c @@ -0,0 +1,71 @@ +/* Copyright (C) 1991, 1992, 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#include <math.h> + +#ifdef __GNUC__ + +__CONSTVALUE double +DEFUN(atan2, (y, x), double y AND double x) +{ + static CONST double one = 1.0, zero = 0.0; + double signx, signy; + double pi, PIo4, PIo2; + + if (__isnan(x)) + return x; + if (__isnan(y)) + return y; + + signy = __copysign(one, y); + signx = __copysign(one, x); + + asm("fmovecr%.x %1, %0" : "=f" (pi) : "i" (0)); + PIo2 = pi / 2; + PIo4 = pi / 4; + + if (y == zero) + return signx == one ? y : __copysign(pi, signy); + + if (x == zero) + return __copysign(PIo2, signy); + + if (__isinf(x)) + { + if (__isinf(y)) + return __copysign(signx == one ? PIo4 : 3 * PIo4, signy); + else + return __copysign(signx == one ? zero : pi, signy); + } + + if (__isinf(y)) + return __copysign(PIo2, signy); + + y = fabs(y); + + if (x < 0.0) + /* X is negative. */ + return __copysign(pi - atan(y / -x), signy); + + return __copysign(atan(y / x), signy); +} + +#else +#include <sysdeps/generic/atan2.c> +#endif diff --git a/sysdeps/m68k/fpu/atanh.c b/sysdeps/m68k/fpu/atanh.c new file mode 100644 index 0000000000..d4636ec035 --- /dev/null +++ b/sysdeps/m68k/fpu/atanh.c @@ -0,0 +1,2 @@ +#define FUNC atanh +#include <acos.c> diff --git a/sysdeps/m68k/fpu/ceil.c b/sysdeps/m68k/fpu/ceil.c new file mode 100644 index 0000000000..b4605e1b29 --- /dev/null +++ b/sysdeps/m68k/fpu/ceil.c @@ -0,0 +1,4 @@ + +#define FUNC ceil + +#include <acos.c> diff --git a/sysdeps/m68k/fpu/cos.c b/sysdeps/m68k/fpu/cos.c new file mode 100644 index 0000000000..fa50130af7 --- /dev/null +++ b/sysdeps/m68k/fpu/cos.c @@ -0,0 +1,2 @@ +#define FUNC cos +#include <acos.c> diff --git a/sysdeps/m68k/fpu/cosh.c b/sysdeps/m68k/fpu/cosh.c new file mode 100644 index 0000000000..78a81943c6 --- /dev/null +++ b/sysdeps/m68k/fpu/cosh.c @@ -0,0 +1,2 @@ +#define FUNC cosh +#include <acos.c> diff --git a/sysdeps/m68k/fpu/drem.c b/sysdeps/m68k/fpu/drem.c new file mode 100644 index 0000000000..16caacfd81 --- /dev/null +++ b/sysdeps/m68k/fpu/drem.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1991, 1992, 1994, 1995 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#define __NO_MATH_INLINES +#include <math.h> + +#undef drem + +double +DEFUN(__drem, (x, y), double x AND double y) +{ + return ____drem(x, y); +} + +weak_alias (__drem, drem) diff --git a/sysdeps/m68k/fpu/exp.c b/sysdeps/m68k/fpu/exp.c new file mode 100644 index 0000000000..2649d72143 --- /dev/null +++ b/sysdeps/m68k/fpu/exp.c @@ -0,0 +1,3 @@ +#define FUNC exp +#define OP etox +#include <acos.c> diff --git a/sysdeps/m68k/fpu/expm1.c b/sysdeps/m68k/fpu/expm1.c new file mode 100644 index 0000000000..19f1802e56 --- /dev/null +++ b/sysdeps/m68k/fpu/expm1.c @@ -0,0 +1,3 @@ +#define FUNC __expm1 +#define OP expm1 +#include <acos.c> diff --git a/sysdeps/m68k/fpu/fabs.c b/sysdeps/m68k/fpu/fabs.c new file mode 100644 index 0000000000..f9538a599c --- /dev/null +++ b/sysdeps/m68k/fpu/fabs.c @@ -0,0 +1,3 @@ +#define FUNC fabs +#define OP abs +#include <acos.c> diff --git a/sysdeps/m68k/fpu/fl.h b/sysdeps/m68k/fpu/fl.h new file mode 100644 index 0000000000..098e880601 --- /dev/null +++ b/sysdeps/m68k/fpu/fl.h @@ -0,0 +1,41 @@ +/* Floating-point constants for the 68881. + Copyright (C) 1992 Free Software Foundation, Inc. */ + +/* IGNORE($ This is used internally in the library. */ +#include <sysdeps/ieee754/fl.h> +/* ansidecl.m4 here inserts the ieee file. Kludge o rama. + $) ENDCOMMENT INCLUDE($sysdeps/ieee754/fl.h$) STARTCOMMENT */ + +#ifndef __need_HUGE_VAL + +#ifdef __GNUC__ + +#undef FLT_ROUNDS + +/* Interrogate the 68881 to find the current rounding mode. */ + +static __const __inline int +DEFUN_VOID(__flt_rounds) +{ + unsigned long int __fpcr; + __asm("fmove%.l fpcr, %0" : "=g" (__fpcr)); + switch (__fpcr & (1 | 2)) + { + case 0: + return _FLT_ROUNDS_TONEAREST; + case 1: + return _FLT_ROUNDS_TOZERO; + case 2: + return _FLT_ROUNDS_TONEGINF; + case 3: + return _FLT_ROUNDS_TOPOSINF; + default: + return _FLT_ROUNDS_INDETERMINATE; + } +} + +#define FLT_ROUNDS (__flt_rounds()) + +#endif /* GCC. */ + +#endif /* Don't need HUGE_VAL. */ diff --git a/sysdeps/m68k/fpu/floor.c b/sysdeps/m68k/fpu/floor.c new file mode 100644 index 0000000000..92a2ca68bb --- /dev/null +++ b/sysdeps/m68k/fpu/floor.c @@ -0,0 +1,3 @@ +#define FUNC floor +#define OP intrz +#include <acos.c> diff --git a/sysdeps/m68k/fpu/fmod.c b/sysdeps/m68k/fpu/fmod.c new file mode 100644 index 0000000000..9a6c8cd162 --- /dev/null +++ b/sysdeps/m68k/fpu/fmod.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1991, 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#define __NO_MATH_INLINES +#include <math.h> + +__CONSTVALUE double +DEFUN(fmod, (x, y), double x AND double y) +{ + return __fmod(x, y); +} diff --git a/sysdeps/m68k/fpu/frexp.c b/sysdeps/m68k/fpu/frexp.c new file mode 100644 index 0000000000..de74851de9 --- /dev/null +++ b/sysdeps/m68k/fpu/frexp.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1991 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#define __NO_MATH_INLINES +#include <math.h> + +double +DEFUN(frexp, (value, expptr), double value AND int *expptr) +{ + return __frexp(value, expptr); +} diff --git a/sysdeps/m68k/fpu/isinf.c b/sysdeps/m68k/fpu/isinf.c new file mode 100644 index 0000000000..ab2cf0bb03 --- /dev/null +++ b/sysdeps/m68k/fpu/isinf.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1991, 1994, 1995 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#define __NO_MATH_INLINES +#include <math.h> + +#ifndef FUNC +#define FUNC __isinf +#endif + + +int +DEFUN(FUNC, (x), double x) +{ + return __m81_u(FUNC)(x); +} + +weak_alias (__isinf, isinf) diff --git a/sysdeps/m68k/fpu/isnan.c b/sysdeps/m68k/fpu/isnan.c new file mode 100644 index 0000000000..d0984911d2 --- /dev/null +++ b/sysdeps/m68k/fpu/isnan.c @@ -0,0 +1,4 @@ +#define FUNC __isnan +#include <isinf.c> + +weak_alias (__isnan, isnan) diff --git a/sysdeps/m68k/fpu/ldexp.c b/sysdeps/m68k/fpu/ldexp.c new file mode 100644 index 0000000000..ba912805d6 --- /dev/null +++ b/sysdeps/m68k/fpu/ldexp.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1991, 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#define __NO_MATH_INLINES +#include <math.h> + +__CONSTVALUE double +DEFUN(ldexp, (x, exp), double x AND int exp) +{ + return __ldexp(x, exp); +} diff --git a/sysdeps/m68k/fpu/log.c b/sysdeps/m68k/fpu/log.c new file mode 100644 index 0000000000..4de3346545 --- /dev/null +++ b/sysdeps/m68k/fpu/log.c @@ -0,0 +1,3 @@ +#define FUNC log +#define OP logn +#include <acos.c> diff --git a/sysdeps/m68k/fpu/log10.c b/sysdeps/m68k/fpu/log10.c new file mode 100644 index 0000000000..246b69a364 --- /dev/null +++ b/sysdeps/m68k/fpu/log10.c @@ -0,0 +1,2 @@ +#define FUNC log10 +#include <acos.c> diff --git a/sysdeps/m68k/fpu/log1p.c b/sysdeps/m68k/fpu/log1p.c new file mode 100644 index 0000000000..028783819b --- /dev/null +++ b/sysdeps/m68k/fpu/log1p.c @@ -0,0 +1,2 @@ +#define FUNC log1p +#include <acos.c> diff --git a/sysdeps/m68k/fpu/logb.c b/sysdeps/m68k/fpu/logb.c new file mode 100644 index 0000000000..8619c908c8 --- /dev/null +++ b/sysdeps/m68k/fpu/logb.c @@ -0,0 +1,46 @@ +/* Copyright (C) 1991, 1992, 1993, 1994, 1995 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#include <math.h> + +#ifdef __GNUC__ + +/* Return the base 2 signed integral exponent of X. */ + +double +DEFUN(__logb, (x), double x) +{ + if (__isnan (x)) + return x; + if (__isinf (x)) + return fabs (x); + + if (x == 0.0) + asm ("flog2%.x %0, %0" : "=f" (x) : "0" (x)); + else + asm ("fgetexp%.x %0, %0" : "=f" (x) : "0" (x)); + + return x; +} + +weak_alias (__logb, logb) + +#else +#include <sysdeps/ieee754/logb.c> +#endif diff --git a/sysdeps/m68k/fpu/pow.c b/sysdeps/m68k/fpu/pow.c new file mode 100644 index 0000000000..3360020f1d --- /dev/null +++ b/sysdeps/m68k/fpu/pow.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1991, 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#define __NO_MATH_INLINES +#include <math.h> + +__CONSTVALUE double +DEFUN(pow, (x, y), double x AND double y) +{ + return __pow(x, y); +} diff --git a/sysdeps/m68k/fpu/rint.c b/sysdeps/m68k/fpu/rint.c new file mode 100644 index 0000000000..f83a4e4c3f --- /dev/null +++ b/sysdeps/m68k/fpu/rint.c @@ -0,0 +1,5 @@ +#define FUNC __rint +#define OP intr +#include <acos.c> + +weak_alias (__rint, rint) diff --git a/sysdeps/m68k/fpu/sin.c b/sysdeps/m68k/fpu/sin.c new file mode 100644 index 0000000000..28ac9e50c3 --- /dev/null +++ b/sysdeps/m68k/fpu/sin.c @@ -0,0 +1,2 @@ +#define FUNC sin +#include <acos.c> diff --git a/sysdeps/m68k/fpu/sinh.c b/sysdeps/m68k/fpu/sinh.c new file mode 100644 index 0000000000..fae7c71459 --- /dev/null +++ b/sysdeps/m68k/fpu/sinh.c @@ -0,0 +1,2 @@ +#define FUNC sinh +#include <acos.c> diff --git a/sysdeps/m68k/fpu/sqrt.c b/sysdeps/m68k/fpu/sqrt.c new file mode 100644 index 0000000000..2365b61780 --- /dev/null +++ b/sysdeps/m68k/fpu/sqrt.c @@ -0,0 +1,2 @@ +#define FUNC sqrt +#include <acos.c> diff --git a/sysdeps/m68k/fpu/switch/68881-sw.h b/sysdeps/m68k/fpu/switch/68881-sw.h new file mode 100644 index 0000000000..3d7a3927f5 --- /dev/null +++ b/sysdeps/m68k/fpu/switch/68881-sw.h @@ -0,0 +1,64 @@ +/* Copyright (C) 1991, 1992 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#ifndef _68881_SWITCH_H + +#define _68881_SWITCH_H 1 +#include <sys/cdefs.h> + +/* This is the format of the data at the code label for a function which + wants to switch depending on whether or not a 68881 is present. + + Initially, `insn' is a `jsr' instruction, and `target' is __68881_switch. + The first time such a function is called, __68881_switch determines whether + or not a 68881 is present, and modifies the function accordingly. + Then `insn' is a `jmp' instruction, and `target' is the value of `fpu' + if there is 68881, or the value of `soft' if not. */ + +struct switch_caller + { + unsigned short int insn; /* The `jsr' or `jmp' instruction. */ + __ptr_t target; /* The target of the instruction. */ + __ptr_t soft; /* The address of the soft function. */ + __ptr_t fpu; /* The address of the 68881 function. */ + }; + +/* These are opcodes (values for `insn', above) for `jmp' and `jsr' + instructions, respectively, to 32-bit absolute addresses. */ +#define JMP 0x4ef9 +#define JSR 0x4eb9 + + +/* Function to determine whether or not a 68881 is available, + and modify its caller (which must be a `struct switch_caller', above, + in data space) to use the appropriate version. */ +extern void EXFUN(__68881_switch, (int __dummy)); + + +/* Define FUNCTION as a `struct switch_caller' which will call + `__FUNCTION_68881' if a 68881 is present, and `__FUNCTION_soft' if not. +#define switching_function(FUNCTION) \ + struct switch_caller FUNCTION = \ + { \ + JSR, (__ptr_t) __68881_switch, \ + __CONCAT(__CONCAT(__,FUNCTION),_soft), \ + __CONCAT(__CONCAT(__,FUNCTION),_68881) \ + } + + +#endif /* 68881-switch.h */ diff --git a/sysdeps/m68k/fpu/switch/Dist b/sysdeps/m68k/fpu/switch/Dist new file mode 100644 index 0000000000..1e00e4cd07 --- /dev/null +++ b/sysdeps/m68k/fpu/switch/Dist @@ -0,0 +1 @@ +68881-sw.h switch.c diff --git a/sysdeps/m68k/fpu/switch/Makefile b/sysdeps/m68k/fpu/switch/Makefile new file mode 100644 index 0000000000..fd8d7c11f4 --- /dev/null +++ b/sysdeps/m68k/fpu/switch/Makefile @@ -0,0 +1,52 @@ +# Copyright (C) 1991, 1992 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 +# 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 C 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 C Library; see the file COPYING.LIB. If +# not, write to the Free Software Foundation, Inc., 675 Mass Ave, +# Cambridge, MA 02139, USA. + +ifeq ($(subdir),math) + +sysdep_routines := $(sysdep_routines) switch + +# Find all the sources that have 68881 versions. ++68881-sources := \ + $(notdir $(wildcard $(addprefix $(filter %/fpu,$(sysdirs)),$(sources)))) + +# Sysdep directories other than fpu and fpu/switch (this one). ++non68881-dirs := $(filter-out %/fpu %/fpu/switch,$(+sysdep_dirs)) + +# Get a non-68881 version of the target. ++non68881-version = $(firstword $(wildcard $(addsuffix /$@,$(+non68881-dirs)))) + +# Directory containing 68881 sources. ++68881-dir := $(filter %/fpu,$(+sysdep_dirs)) + +# For all the files that have 68881 versions and don't exist already in +# the source directory (math), automatically make ones that switch between +# 68881 and soft versions. +$(addprefix $(objpfx), \ + $(filter-out $(wildcard $(+68881-sources)),$(+68881-sources))): + (echo '#include <ansidecl.h>' ;\ + echo '#include <68881-sw.h>' ;\ + echo '#define $* __$*_68881' ;\ + echo '#include <$(+68881-dir)/$@>' ;\ + echo '#undef $*' ;\ + echo '#define $* __$*_soft' ;\ + echo '#include <$(non68881-version)>' ;\ + echo '#undef $*' ;\ + echo 'switching_function($*);') > $@-tmp + mv $@-tmp $@ + +endif diff --git a/sysdeps/m68k/fpu/switch/__math.h b/sysdeps/m68k/fpu/switch/__math.h new file mode 100644 index 0000000000..c0f6966981 --- /dev/null +++ b/sysdeps/m68k/fpu/switch/__math.h @@ -0,0 +1 @@ +/* We don't want any inlines when we might not have a 68881. */ diff --git a/sysdeps/m68k/fpu/switch/switch.c b/sysdeps/m68k/fpu/switch/switch.c new file mode 100644 index 0000000000..057bd1509a --- /dev/null +++ b/sysdeps/m68k/fpu/switch/switch.c @@ -0,0 +1,86 @@ +/* Copyright (C) 1991, 1992 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ansidecl.h> +#include <signal.h> +#include <68881-sw.h> + + +/* The signal that is sent when a 68881 instruction + is executed and there is no 68881. */ +#ifndef TRAPSIG +#define TRAPSIG SIGILL +#endif + +/* Zero if no 68881, one if we have a 68881, or -1 if we don't know yet. */ +static int have_fpu = -1; + + +/* Signal handler for the trap that happens if we don't have a 68881. */ +static void +DEFUN(trap, (sig), int sig) +{ + have_fpu = 0; +} + +/* This function is called by functions that want to switch. + The calling function must be a `struct switch_caller' in data space. + It determines whether a 68881 is present, and modifies its caller + to be a static jump to either the 68881 version or the soft version. + It then returns into the function it has chosen to do the work. */ +void +DEFUN(__68881_switch, (dummy), int dummy) +{ + PTR *return_address_location = &((PTR *) &dummy)[-1]; + struct switch_caller *CONST caller + = (struct switch_caller *) (((short int *) *return_address_location) - 1); + + if (have_fpu < 0) + { + /* Figure out whether or not we have a 68881. */ + __sighandler_t handler = signal (TRAPSIG, trap); + if (handler == SIG_ERR) + /* We can't figure it out, so assume we don't have a 68881. + This assumption will never cause us any problems other than + lost performance, while the reverse assumption could cause + the program to crash. */ + have_fpu = 0; + else + { + /* We set `have_fpu' to nonzero, and then execute a 68881 + no-op instruction. If we have a 68881, this will do nothing. + If we don't have one, this will trap and the signal handler + will clear `have_fpu'. */ + have_fpu = 1; + asm ("fnop"); + + /* Restore the old signal handler. */ + (void) signal (TRAPSIG, handler); + } + } + + /* Modify the caller to be a jump to the appropriate address. */ + caller->insn = JMP; + caller->target = have_fpu ? caller->fpu : caller->soft; + + /* Make the address we will return to be the target we have chosen. + Our return will match the `jsr' done by the caller we have + just modified, and it will be just as if that had instead + been a `jmp' to the new target. */ + *return_address_location = caller->target; +} diff --git a/sysdeps/m68k/fpu/tan.c b/sysdeps/m68k/fpu/tan.c new file mode 100644 index 0000000000..53b3b5342e --- /dev/null +++ b/sysdeps/m68k/fpu/tan.c @@ -0,0 +1,2 @@ +#define FUNC tan +#include <acos.c> diff --git a/sysdeps/m68k/fpu/tanh.c b/sysdeps/m68k/fpu/tanh.c new file mode 100644 index 0000000000..cc6739539a --- /dev/null +++ b/sysdeps/m68k/fpu/tanh.c @@ -0,0 +1,2 @@ +#define FUNC tanh +#include <acos.c> diff --git a/sysdeps/m68k/jmp_buf.h b/sysdeps/m68k/jmp_buf.h new file mode 100644 index 0000000000..96240f0d8e --- /dev/null +++ b/sysdeps/m68k/jmp_buf.h @@ -0,0 +1,19 @@ +/* Define the machine-dependent type `jmp_buf'. m68k version. */ + +typedef struct + { + /* There are eight 4-byte data registers, but D0 is not saved. */ + long int __dregs[7]; + + /* There are six 4-byte address registers, plus the FP and SP. */ + int *__aregs[6]; + int * __fp; + int * __sp; + +#if defined(__HAVE_68881__) || defined(__HAVE_FPU__) + /* There are eight floating point registers which + are saved in IEEE 96-bit extended format. */ + char __fpregs[8 * (96 / 8)]; +#endif + + } __jmp_buf[1]; diff --git a/sysdeps/m68k/m68020/add_n.S b/sysdeps/m68k/m68020/add_n.S new file mode 100644 index 0000000000..ea7a4458ea --- /dev/null +++ b/sysdeps/m68k/m68020/add_n.S @@ -0,0 +1,76 @@ +/* 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/addmul_1.S b/sysdeps/m68k/m68020/addmul_1.S new file mode 100644 index 0000000000..3f244c40b4 --- /dev/null +++ b/sysdeps/m68k/m68020/addmul_1.S @@ -0,0 +1,80 @@ +/* mc68020 __mpn_addmul_1 -- Multiply a limb vector with a limb and add + the result to a second 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) + size (sp + 12) + s2_limb (sp + 16) +*/ + +#include "asm-syntax.h" + + TEXT + ALIGN + GLOBL ___mpn_addmul_1 + +LAB(___mpn_addmul_1) + +#define res_ptr a0 +#define s1_ptr a1 +#define size d2 +#define s2_limb d4 + +/* Save used registers on the stack. */ + INSN2(movem,l ,MEM_PREDEC(sp),d2-d5) + +/* Copy the arguments to registers. Better use movem? */ + INSN2(move,l ,res_ptr,MEM_DISP(sp,20)) + INSN2(move,l ,s1_ptr,MEM_DISP(sp,24)) + INSN2(move,l ,size,MEM_DISP(sp,28)) + INSN2(move,l ,s2_limb,MEM_DISP(sp,32)) + + INSN2(eor,w ,size,#1) + INSN1(clr,l ,d1) + INSN1(clr,l ,d5) + INSN2(lsr,l ,size,#1) + bcc L1 + INSN2(subq,l ,size,#1) + INSN2(sub,l ,d0,d0) /* (d0,cy) <= (0,0) */ + +LAB(Loop) + INSN2(move,l ,d3,MEM_POSTINC(s1_ptr)) + INSN2(mulu,l ,d1:d3,s2_limb) + INSN2(addx,l ,d3,d0) + INSN2(addx,l ,d1,d5) + INSN2(add,l ,MEM_POSTINC(res_ptr),d3) +LAB(L1) INSN2(move,l ,d3,MEM_POSTINC(s1_ptr)) + INSN2(mulu,l ,d0:d3,s2_limb) + INSN2(addx,l ,d3,d1) + INSN2(addx,l ,d0,d5) + INSN2(add,l ,MEM_POSTINC(res_ptr),d3) + + dbf size,Loop + INSN2(addx,l ,d0,d5) + INSN2(sub,l ,size,#0x10000) + bcc Loop + +/* Restore used registers from stack frame. */ + INSN2(movem,l ,d2-d5,MEM_POSTINC(sp)) + + rts diff --git a/sysdeps/m68k/m68020/asm-syntax.h b/sysdeps/m68k/m68020/asm-syntax.h new file mode 100644 index 0000000000..394b3ca739 --- /dev/null +++ b/sysdeps/m68k/m68020/asm-syntax.h @@ -0,0 +1,105 @@ +/* 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/mul_1.S b/sysdeps/m68k/m68020/mul_1.S new file mode 100644 index 0000000000..548ca0091b --- /dev/null +++ b/sysdeps/m68k/m68020/mul_1.S @@ -0,0 +1,87 @@ +/* mc68020 __mpn_mul_1 -- Multiply a limb vector with a limb and store + the result in a second 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) + size (sp + 12) + s2_limb (sp + 16) +*/ + +#include "asm-syntax.h" + + TEXT + ALIGN + GLOBL ___mpn_mul_1 + +LAB(___mpn_mul_1) + +#define res_ptr a0 +#define s1_ptr a1 +#define size d2 +#define s2_limb d4 + +/* Save used registers on the stack. */ + INSN2(movem,l ,MEM_PREDEC(sp),d2-d4) +#if 0 + INSN2(move,l ,MEM_PREDEC(sp),d2) + INSN2(move,l ,MEM_PREDEC(sp),d3) + INSN2(move,l ,MEM_PREDEC(sp),d4) +#endif + +/* Copy the arguments to registers. Better use movem? */ + INSN2(move,l ,res_ptr,MEM_DISP(sp,16)) + INSN2(move,l ,s1_ptr,MEM_DISP(sp,20)) + INSN2(move,l ,size,MEM_DISP(sp,24)) + INSN2(move,l ,s2_limb,MEM_DISP(sp,28)) + + INSN2(eor,w ,size,#1) + INSN1(clr,l ,d1) + INSN2(lsr,l ,size,#1) + bcc L1 + INSN2(subq,l ,size,#1) + INSN2(sub,l ,d0,d0) /* (d0,cy) <= (0,0) */ + +LAB(Loop) + INSN2(move,l ,d3,MEM_POSTINC(s1_ptr)) + INSN2(mulu,l ,d1:d3,s2_limb) + INSN2(addx,l ,d3,d0) + INSN2(move,l ,MEM_POSTINC(res_ptr),d3) +LAB(L1) INSN2(move,l ,d3,MEM_POSTINC(s1_ptr)) + INSN2(mulu,l ,d0:d3,s2_limb) + INSN2(addx,l ,d3,d1) + INSN2(move,l ,MEM_POSTINC(res_ptr),d3) + + dbf size,Loop + INSN1(clr,l ,d3) + INSN2(addx,l ,d0,d3) + INSN2(sub,l ,size,#0x10000) + bcc Loop + +/* Restore used registers from stack frame. */ + INSN2(movem,l ,d2-d4,MEM_POSTINC(sp)) +#if 0 + INSN2(move,l ,d4,MEM_POSTINC(sp)) + INSN2(move,l ,d3,MEM_POSTINC(sp)) + INSN2(move,l ,d2,MEM_POSTINC(sp)) +#endif + rts diff --git a/sysdeps/m68k/m68020/sub_n.S b/sysdeps/m68k/m68020/sub_n.S new file mode 100644 index 0000000000..19f0ec1568 --- /dev/null +++ b/sysdeps/m68k/m68020/sub_n.S @@ -0,0 +1,76 @@ +/* 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/m68k/m68020/submul_1.S b/sysdeps/m68k/m68020/submul_1.S new file mode 100644 index 0000000000..ef7f39de7a --- /dev/null +++ b/sysdeps/m68k/m68020/submul_1.S @@ -0,0 +1,80 @@ +/* mc68020 __mpn_submul_1 -- Multiply a limb vector with a limb and subtract + the result from a second 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) + size (sp + 12) + s2_limb (sp + 16) +*/ + +#include "asm-syntax.h" + + TEXT + ALIGN + GLOBL ___mpn_submul_1 + +LAB(___mpn_submul_1) + +#define res_ptr a0 +#define s1_ptr a1 +#define size d2 +#define s2_limb d4 + +/* Save used registers on the stack. */ + INSN2(movem,l ,MEM_PREDEC(sp),d2-d5) + +/* Copy the arguments to registers. Better use movem? */ + INSN2(move,l ,res_ptr,MEM_DISP(sp,20)) + INSN2(move,l ,s1_ptr,MEM_DISP(sp,24)) + INSN2(move,l ,size,MEM_DISP(sp,28)) + INSN2(move,l ,s2_limb,MEM_DISP(sp,32)) + + INSN2(eor,w ,size,#1) + INSN1(clr,l ,d1) + INSN1(clr,l ,d5) + INSN2(lsr,l ,size,#1) + bcc L1 + INSN2(subq,l ,size,#1) + INSN2(sub,l ,d0,d0) /* (d0,cy) <= (0,0) */ + +LAB(Loop) + INSN2(move,l ,d3,MEM_POSTINC(s1_ptr)) + INSN2(mulu,l ,d1:d3,s2_limb) + INSN2(addx,l ,d3,d0) + INSN2(addx,l ,d1,d5) + INSN2(sub,l ,MEM_POSTINC(res_ptr),d3) +LAB(L1) INSN2(move,l ,d3,MEM_POSTINC(s1_ptr)) + INSN2(mulu,l ,d0:d3,s2_limb) + INSN2(addx,l ,d3,d1) + INSN2(addx,l ,d0,d5) + INSN2(sub,l ,MEM_POSTINC(res_ptr),d3) + + dbf size,Loop + INSN2(addx,l ,d0,d5) + INSN2(sub,l ,size,#0x10000) + bcc Loop + +/* Restore used registers from stack frame. */ + INSN2(movem,l ,d2-d5,MEM_POSTINC(sp)) + + rts diff --git a/sysdeps/m68k/memcopy.h b/sysdeps/m68k/memcopy.h new file mode 100644 index 0000000000..862e1b8a7f --- /dev/null +++ b/sysdeps/m68k/memcopy.h @@ -0,0 +1,95 @@ +/* memcopy.h -- definitions for memory copy functions. Motorola 68020 version. + Copyright (C) 1991 Free Software Foundation, Inc. + Contributed by Torbjorn Granlund (tege@sics.se). + +The GNU C 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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <sysdeps/generic/memcopy.h> + +#if defined(__mc68020__) || defined(mc68020) + +#undef OP_T_THRES +#define OP_T_THRES 16 + +/* WORD_COPY_FWD and WORD_COPY_BWD are not symmetric on the 68020, + because of its weird instruction overlap characteristics. */ + +#undef WORD_COPY_FWD +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \ + do \ + { \ + size_t __nwords = (nbytes) / sizeof (op_t); \ + size_t __nblocks = __nwords / 8 + 1; \ + dst_bp -= (8 - __nwords % 8) * sizeof (op_t); \ + src_bp -= (8 - __nwords % 8) * sizeof (op_t); \ + switch (__nwords % 8) \ + do \ + { \ + ((op_t *) dst_bp)[0] = ((op_t *) src_bp)[0]; \ + case 7: \ + ((op_t *) dst_bp)[1] = ((op_t *) src_bp)[1]; \ + case 6: \ + ((op_t *) dst_bp)[2] = ((op_t *) src_bp)[2]; \ + case 5: \ + ((op_t *) dst_bp)[3] = ((op_t *) src_bp)[3]; \ + case 4: \ + ((op_t *) dst_bp)[4] = ((op_t *) src_bp)[4]; \ + case 3: \ + ((op_t *) dst_bp)[5] = ((op_t *) src_bp)[5]; \ + case 2: \ + ((op_t *) dst_bp)[6] = ((op_t *) src_bp)[6]; \ + case 1: \ + ((op_t *) dst_bp)[7] = ((op_t *) src_bp)[7]; \ + case 0: \ + src_bp += 32; \ + dst_bp += 32; \ + __nblocks--; \ + } \ + while (__nblocks != 0); \ + (nbytes_left) = (nbytes) % sizeof (op_t); \ + } while (0) + +#undef WORD_COPY_BWD +#define WORD_COPY_BWD(dst_ep, src_ep, nbytes_left, nbytes) \ + do \ + { \ + size_t __nblocks = (nbytes) / 32 + 1; \ + switch ((nbytes) / sizeof (op_t) % 8) \ + do \ + { \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 7: \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 6: \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 5: \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 4: \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 3: \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 2: \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 1: \ + *--((op_t *) dst_ep) = *--((op_t *) src_ep); \ + case 0: \ + __nblocks--; \ + } \ + while (__nblocks != 0); \ + (nbytes_left) = (nbytes) % sizeof (op_t); \ + } while (0) + +#endif diff --git a/sysdeps/m68k/setjmp.c b/sysdeps/m68k/setjmp.c new file mode 100644 index 0000000000..853977eab9 --- /dev/null +++ b/sysdeps/m68k/setjmp.c @@ -0,0 +1,48 @@ +/* Copyright (C) 1991, 1992, 1994 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 +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 C 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 C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <setjmp.h> + +/* Save the current program position in ENV and return 0. */ +int +__sigsetjmp (jmp_buf env, int savemask) +{ + /* Save data registers D1 through D7. */ + asm volatile ("movem%.l d1-d7, %0" : : "m" (env[0].__jmpbuf[0].__dregs[0])); + + /* Save return address in place of register A0. */ + env[0].__jmpbuf[0].__aregs[0] = ((void **) &env)[-1]; + + /* Save address registers A1 through A5. */ + asm volatile ("movem%.l a1-a5, %0" : : "m" (env[0].__jmpbuf[0].__aregs[1])); + + /* Save caller's FP, not our own. */ + env[0].__jmpbuf[0].__fp = ((void **) &env)[-2]; + + /* Save caller's SP, not our own. */ + env[0].__jmpbuf[0].__sp = (void *) &env; + +#if defined(__HAVE_68881__) || defined(__HAVE_FPU__) + /* Save floating-point (68881) registers FP0 through FP7. */ + asm volatile ("fmovem%.x fp0-fp7, %0" + : : "m" (env[0].__jmpbuf[0].__fpregs[0])); +#endif + + /* Save the signal mask if requested. */ + return __sigjmp_save (env, savemask); +} |