diff options
Diffstat (limited to 'sysdeps/m68k')
-rw-r--r-- | sysdeps/m68k/__longjmp.c | 13 | ||||
-rw-r--r-- | sysdeps/m68k/bsd-_setjmp.S | 12 | ||||
-rw-r--r-- | sysdeps/m68k/bsd-setjmp.S | 10 | ||||
-rw-r--r-- | sysdeps/m68k/ffs.c | 2 | ||||
-rw-r--r-- | sysdeps/m68k/fpu/__math.h | 118 | ||||
-rw-r--r-- | sysdeps/m68k/fpu/acos.c | 2 | ||||
-rw-r--r-- | sysdeps/m68k/fpu/atan2.c | 2 | ||||
-rw-r--r-- | sysdeps/m68k/fpu/fmod.c | 2 | ||||
-rw-r--r-- | sysdeps/m68k/fpu/ldexp.c | 2 | ||||
-rw-r--r-- | sysdeps/m68k/fpu/pow.c | 2 | ||||
-rw-r--r-- | sysdeps/m68k/setjmp.c | 8 |
11 files changed, 134 insertions, 39 deletions
diff --git a/sysdeps/m68k/__longjmp.c b/sysdeps/m68k/__longjmp.c index 4fc61084a0..92dd803c17 100644 --- a/sysdeps/m68k/__longjmp.c +++ b/sysdeps/m68k/__longjmp.c @@ -29,22 +29,21 @@ __longjmp (__jmp_buf env, int val) #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"); + asm volatile("fmovem%.x %0, %/fp0-%/fp7" : + /* No outputs. */ : "g" (env[0].__fpregs[0])); #endif /* Put VAL in D0. */ - asm volatile("move%.l %0, d0" : /* No outputs. */ : + 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" + "movem%.l %0, %/d1-%/d7/%/a0-%/a7\n" /* Return to setjmp's caller. */ #ifdef __motorola__ - "jmp (a0)" + "jmp (%/a0)" #else - "jmp a0@" + "jmp %/a0@" #endif : /* No outputs. */ : "g" (env[0].__dregs[0]) /* We don't bother with the clobbers, diff --git a/sysdeps/m68k/bsd-_setjmp.S b/sysdeps/m68k/bsd-_setjmp.S index a0b639306d..69aa7de04c 100644 --- a/sysdeps/m68k/bsd-_setjmp.S +++ b/sysdeps/m68k/bsd-_setjmp.S @@ -26,17 +26,23 @@ Cambridge, MA 02139, USA. */ #ifdef MOTOROLA_SYNTAX #define d0 %d0 #define d1 %d1 -#define PUSH(reg) move.l reg, -(%esp) -#define POP(reg) move.l (%esp)+, reg +#define PUSH(reg) move.l reg, -(%sp) +#define POP(reg) move.l (%sp)+, reg +#define PUSH0 clr.l -(%sp) #else #define PUSH(reg) movel reg, sp@- #define POP(reg) movel sp@+, reg +#define PUSH0 clrl sp@- #endif ENTRY (_setjmp) POP (d0) /* Pop return PC. */ POP (d1) /* Pop jmp_buf argument. */ - PUSH (#0) /* Push second argument of zero. */ + PUSH0 /* Push second argument of zero. */ PUSH (d1) /* Push back first argument. */ PUSH (d0) /* Push back return PC. */ +#ifdef PIC + bra.l C_SYMBOL_NAME (__sigsetjmp@PLTPC) +#else jmp C_SYMBOL_NAME (__sigsetjmp) +#endif diff --git a/sysdeps/m68k/bsd-setjmp.S b/sysdeps/m68k/bsd-setjmp.S index d218b44279..c853516824 100644 --- a/sysdeps/m68k/bsd-setjmp.S +++ b/sysdeps/m68k/bsd-setjmp.S @@ -26,8 +26,8 @@ Cambridge, MA 02139, USA. */ #ifdef MOTOROLA_SYNTAX #define d0 %d0 #define d1 %d1 -#define PUSH(reg) move.l reg, -(%esp) -#define POP(reg) move.l (%esp)+, reg +#define PUSH(reg) move.l reg, -(%sp) +#define POP(reg) move.l (%sp)+, reg #else #define PUSH(reg) movel reg, sp@- #define POP(reg) movel sp@+, reg @@ -36,7 +36,11 @@ Cambridge, MA 02139, USA. */ ENTRY (setjmp) POP (d0) /* Pop return PC. */ POP (d1) /* Pop jmp_buf argument. */ - PUSH (#1) /* Push second argument of one. */ + pea 1 /* Push second argument of one. */ PUSH (d1) /* Push back first argument. */ PUSH (d0) /* Push back return PC. */ +#ifdef PIC + bra.l C_SYMBOL_NAME (__sigsetjmp@PLTPC) +#else jmp C_SYMBOL_NAME (__sigsetjmp) +#endif diff --git a/sysdeps/m68k/ffs.c b/sysdeps/m68k/ffs.c index d9ec2b1ced..9de7cf3c41 100644 --- a/sysdeps/m68k/ffs.c +++ b/sysdeps/m68k/ffs.c @@ -30,7 +30,7 @@ DEFUN(ffs, (x), int x) { int cnt; - asm("bfffo %1{#0:#0},%0" : "=d" (cnt) : "rm" (x & -x)); + asm("bfffo %1{#0:#0},%0" : "=d" (cnt) : "dm" (x & -x)); return 32 - cnt; } diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h index a9ae2d966c..e357364fb7 100644 --- a/sysdeps/m68k/fpu/__math.h +++ b/sysdeps/m68k/fpu/__math.h @@ -19,6 +19,8 @@ Cambridge, MA 02139, USA. */ #ifdef __GNUC__ #include <sys/cdefs.h> +#define __need_Emath +#include <errno.h> #ifdef __NO_MATH_INLINES /* This is used when defining the functions themselves. Define them with @@ -28,12 +30,14 @@ Cambridge, MA 02139, USA. */ #define __m81_inline static __inline #else #define __m81_u(x) x -#define __m81_inline exter __inline +#define __m81_inline extern __inline #define __MATH_INLINES 1 #endif #define __inline_mathop2(func, op) \ - __m81_inline __CONSTVALUE double \ + __m81_inline double \ + __m81_u(func)(double __mathop_x) __attribute__((__const__)); \ + __m81_inline double \ __m81_u(func)(double __mathop_x) \ { \ double __result; \ @@ -55,20 +59,23 @@ __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 +#ifndef __NO_MATH_INLINES __inline_mathop2(rint, int) __inline_mathop2(expm1, etoxm1) +#endif __inline_mathop2(log1p, lognp1) __inline_mathop(atanh) #endif -__m81_inline __CONSTVALUE double +__m81_inline double +__m81_u(__drem)(double __x, double __y) __attribute__ ((__const__)); +__m81_inline double __m81_u(__drem)(double __x, double __y) { double __result; @@ -76,7 +83,9 @@ __m81_u(__drem)(double __x, double __y) return __result; } -__m81_inline __CONSTVALUE double +__m81_inline double +__m81_u(ldexp)(double __x, int __e) __attribute__ ((__const__)); +__m81_inline double __m81_u(ldexp)(double __x, int __e) { double __result; @@ -85,7 +94,9 @@ __m81_u(ldexp)(double __x, int __e) return __result; } -__m81_inline __CONSTVALUE double +__m81_inline double +__m81_u(fmod)(double __x, double __y) __attribute__ ((__const__)); +__m81_inline double __m81_u(fmod)(double __x, double __y) { double __result; @@ -103,11 +114,39 @@ __m81_u(frexp)(double __value, int *__expptr) return __mantissa; } -__m81_inline __CONSTVALUE double +__m81_inline double +__m81_u(floor)(double __x) __attribute__ ((__const__)); +__m81_inline double +__m81_u(floor)(double __x) +{ + double __result; + unsigned long int __ctrl_reg; + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); + /* Set rounding towards negative infinity. */ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ + : "dmi" ((__ctrl_reg & ~0x10) | 0x20)); + /* Convert X to an integer, using -Inf rounding. */ + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); + /* Restore the previous rounding mode. */ + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ + : "dmi" (__ctrl_reg)); + return __result; +} + +__m81_inline double +__m81_u(pow)(double __x, double __y) __attribute__ ((__const__)); +__m81_inline double __m81_u(pow)(double __x, double __y) { double __result; - if (__y == 0.0 || __x == 1.0) + if (__x == 0.0) + { + if (__y <= 0.0) + __result = __infnan (EDOM); + else + __result = 0.0; + } + else if (__y == 0.0 || __x == 1.0) __result = 1.0; else if (__y == 1.0) __result = __x; @@ -117,23 +156,40 @@ __m81_u(pow)(double __x, double __y) __asm("ftentox%.x %1, %0" : "=f" (__result) : "f" (__y)); else if (__x == 2.0) __asm("ftwotox%.x %1, %0" : "=f" (__result) : "f" (__y)); + else if (__x < 0.0) + { + double __temp = __m81_u (__rint) (__y); + if (__y == __temp) + { + int i = (int) __y; + __result = __m81_u (exp) (__y * __m81_u (log) (-__x)); + if (i & 1) + __result = -__result; + } + else + __result = __infnan (EDOM); + } else __result = __m81_u(exp)(__y * __m81_u(log)(__x)); return __result; } -__m81_inline __CONSTVALUE double +__m81_inline double +__m81_u(ceil)(double __x) __attribute__ ((__const__)); +__m81_inline double __m81_u(ceil)(double __x) { double __result; unsigned long int __ctrl_reg; - __asm("fmove%.l fpcr, %0" : "=g" (__ctrl_reg)); + __asm __volatile__ ("fmove%.l %!, %0" : "=dm" (__ctrl_reg)); /* Set rounding towards positive infinity. */ - __asm("fmove%.l %0, fpcr" : /* No outputs. */ : "g" (__ctrl_reg | 0x30)); + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ + : "dmi" (__ctrl_reg | 0x30)); /* Convert X to an integer, using +Inf rounding. */ - __asm("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); + __asm __volatile__ ("fint%.x %1, %0" : "=f" (__result) : "f" (__x)); /* Restore the previous rounding mode. */ - __asm("fmove%.l %0, fpcr" : /* No outputs. */ : "g" (__ctrl_reg)); + __asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ + : "dmi" (__ctrl_reg)); return __result; } @@ -145,23 +201,51 @@ __m81_u(modf)(double __value, double *__iptr) return __value - __modf_int; } -__m81_inline __CONSTVALUE int +__m81_inline int +__m81_u(__isinf)(double __value) __attribute__ ((__const__)); +__m81_inline 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)); + "fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); return (__fpsr & (2 << (3 * 8))) ? (__value < 0 ? -1 : 1) : 0; } -__m81_inline __CONSTVALUE int +__m81_inline int +__m81_u(__isnan)(double __value) __attribute__ ((__const__)); +__m81_inline int __m81_u(__isnan)(double __value) { char __result; __asm("ftst%.x %1\n" - "fsun %0" : "=g" (__result) : "f" (__value)); + "fsun %0" : "=dm" (__result) : "f" (__value)); + return __result; +} + +__m81_inline int +__m81_u(__isinfl)(long double __value) __attribute__ ((__const__)); +__m81_inline int +__m81_u(__isinfl)(long 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" : "=dm" (__fpsr) : "f" (__value)); + return (__fpsr & (2 << (3 * 8))) ? (__value < 0 ? -1 : 1) : 0; +} + +__m81_inline int +__m81_u(__isnanl)(long double __value) __attribute__ ((__const__)); +__m81_inline int +__m81_u(__isnanl)(long double __value) +{ + char __result; + __asm("ftst%.x %1\n" + "fsun %0" : "=dm" (__result) : "f" (__value)); return __result; } diff --git a/sysdeps/m68k/fpu/acos.c b/sysdeps/m68k/fpu/acos.c index d4be88f17c..1481ce2cd9 100644 --- a/sysdeps/m68k/fpu/acos.c +++ b/sysdeps/m68k/fpu/acos.c @@ -25,7 +25,7 @@ Cambridge, MA 02139, USA. */ #endif -__CONSTVALUE double +double DEFUN(FUNC, (x), double x) { return __m81_u(FUNC)(x); diff --git a/sysdeps/m68k/fpu/atan2.c b/sysdeps/m68k/fpu/atan2.c index 1efdb1f7a6..753b7f04af 100644 --- a/sysdeps/m68k/fpu/atan2.c +++ b/sysdeps/m68k/fpu/atan2.c @@ -21,7 +21,7 @@ Cambridge, MA 02139, USA. */ #ifdef __GNUC__ -__CONSTVALUE double +double DEFUN(atan2, (y, x), double y AND double x) { static CONST double one = 1.0, zero = 0.0; diff --git a/sysdeps/m68k/fpu/fmod.c b/sysdeps/m68k/fpu/fmod.c index 9a6c8cd162..e3a2de0689 100644 --- a/sysdeps/m68k/fpu/fmod.c +++ b/sysdeps/m68k/fpu/fmod.c @@ -20,7 +20,7 @@ Cambridge, MA 02139, USA. */ #define __NO_MATH_INLINES #include <math.h> -__CONSTVALUE double +double DEFUN(fmod, (x, y), double x AND double y) { return __fmod(x, y); diff --git a/sysdeps/m68k/fpu/ldexp.c b/sysdeps/m68k/fpu/ldexp.c index ba912805d6..7e34882282 100644 --- a/sysdeps/m68k/fpu/ldexp.c +++ b/sysdeps/m68k/fpu/ldexp.c @@ -20,7 +20,7 @@ Cambridge, MA 02139, USA. */ #define __NO_MATH_INLINES #include <math.h> -__CONSTVALUE double +double DEFUN(ldexp, (x, exp), double x AND int exp) { return __ldexp(x, exp); diff --git a/sysdeps/m68k/fpu/pow.c b/sysdeps/m68k/fpu/pow.c index 3360020f1d..5ace4dad2f 100644 --- a/sysdeps/m68k/fpu/pow.c +++ b/sysdeps/m68k/fpu/pow.c @@ -20,7 +20,7 @@ Cambridge, MA 02139, USA. */ #define __NO_MATH_INLINES #include <math.h> -__CONSTVALUE double +double DEFUN(pow, (x, y), double x AND double y) { return __pow(x, y); diff --git a/sysdeps/m68k/setjmp.c b/sysdeps/m68k/setjmp.c index 853977eab9..95c723c122 100644 --- a/sysdeps/m68k/setjmp.c +++ b/sysdeps/m68k/setjmp.c @@ -23,13 +23,15 @@ 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])); + 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])); + 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]; @@ -39,7 +41,7 @@ __sigsetjmp (jmp_buf env, int savemask) #if defined(__HAVE_68881__) || defined(__HAVE_FPU__) /* Save floating-point (68881) registers FP0 through FP7. */ - asm volatile ("fmovem%.x fp0-fp7, %0" + asm volatile ("fmovem%.x %/fp0-%/fp7, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0])); #endif |