+2006-10-03 Richard Sandiford <richard@codesourcery.com>
+
+ * sysdeps/m68k/bits/mathdef.h: Moved from sysdeps/m68k to
+ sysdeps/m68k/m680x0.
+ * sysdeps/m68k/m68020/submul_1.S: Likewise.
+ * sysdeps/m68k/m68020/Makefile: Likewise.
+ * sysdeps/m68k/m68020/mul_1.S: Likewise.
+ * sysdeps/m68k/m68020/wordcopy.S: Likewise.
+ * sysdeps/m68k/m68020/addmul_1.S: Likewise.
+ * sysdeps/m68k/m68020/bits/string.h: Likewise.
+ * sysdeps/m68k/m68020/bits/atomic.h: Likewise.
+ * sysdeps/m68k/sub_n.S: Likewise.
+ * sysdeps/m68k/add_n.S: Likewise.
+ * sysdeps/m68k/s_isnanl.c: Likewise.
+ * sysdeps/m68k/fpu/s_log1p.c: Likewise.
+ * sysdeps/m68k/fpu/e_asinf.c: Likewise.
+ * sysdeps/m68k/fpu/s_cosl.c: Likewise.
+ * sysdeps/m68k/fpu/s_isinff.c: Likewise.
+ * sysdeps/m68k/fpu/k_rem_pio2.c: Likewise.
+ * sysdeps/m68k/fpu/s_ccos.c: Likewise.
+ * sysdeps/m68k/fpu/s_expm1.c: Likewise.
+ * sysdeps/m68k/fpu/slowexp.c: Likewise.
+ * sysdeps/m68k/fpu/k_rem_pio2l.c: Likewise.
+ * sysdeps/m68k/fpu/s_ccoshf.c: Likewise.
+ * sysdeps/m68k/fpu/s_ilogbl.c: Likewise.
+ * sysdeps/m68k/fpu/Makefile: Likewise.
+ * sysdeps/m68k/fpu/s_expm1f.c: Likewise.
+ * sysdeps/m68k/fpu/s_significandf.c: Likewise.
+ * sysdeps/m68k/fpu/e_pow.c: Likewise.
+ * sysdeps/m68k/fpu/s_csinh.c: Likewise.
+ * sysdeps/m68k/fpu/e_exp.c: Likewise.
+ * sysdeps/m68k/fpu/s_remquof.c: Likewise.
+ * sysdeps/m68k/fpu/s_ilogbf.c: Likewise.
+ * sysdeps/m68k/fpu/s_truncl.c: Likewise.
+ * sysdeps/m68k/fpu/s_frexpf.c: Likewise.
+ * sysdeps/m68k/fpu/s_cos.c: Likewise.
+ * sysdeps/m68k/fpu/fraiseexcpt.c: Likewise.
+ * sysdeps/m68k/fpu/branred.c: Likewise.
+ * sysdeps/m68k/fpu/s_frexpl.c: Likewise.
+ * sysdeps/m68k/fpu/s_atan.c: Likewise.
+ * sysdeps/m68k/fpu/e_rem_pio2f.c: Likewise.
+ * sysdeps/m68k/fpu/e_scalbl.c: Likewise.
+ * sysdeps/m68k/fpu/e_exp2.c: Likewise.
+ * sysdeps/m68k/fpu/s_cexpf.c: Likewise.
+ * sysdeps/m68k/fpu/mplog.c: Likewise.
+ * sysdeps/m68k/fpu/s_rintf.c: Likewise.
+ * sysdeps/m68k/fpu/s_tanh.c: Likewise.
+ * sysdeps/m68k/fpu/e_scalbf.c: Likewise.
+ * sysdeps/m68k/fpu/s_csinhl.c: Likewise.
+ * sysdeps/m68k/fpu/s_floorl.c: Likewise.
+ * sysdeps/m68k/fpu/k_tanf.c: Likewise.
+ * sysdeps/m68k/fpu/k_tanl.c: Likewise.
+ * sysdeps/m68k/fpu/e_fmodf.c: Likewise.
+ * sysdeps/m68k/fpu/e_atanhf.c: Likewise.
+ * sysdeps/m68k/fpu/s_isnanf.c: Likewise.
+ * sysdeps/m68k/fpu/s_fpclassifyl.c: Likewise.
+ * sysdeps/m68k/fpu/s_modf.c: Likewise.
+ * sysdeps/m68k/fpu/e_log2.c: Likewise.
+ * sysdeps/m68k/fpu/e_acosf.c: Likewise.
+ * sysdeps/m68k/fpu/s_log1pl.c: Likewise.
+ * sysdeps/m68k/fpu/e_log2f.c: Likewise.
+ * sysdeps/m68k/fpu/mpa.c: Likewise.
+ * sysdeps/m68k/fpu/t_exp.c: Likewise.
+ * sysdeps/m68k/fpu/e_acos.c: Likewise.
+ * sysdeps/m68k/fpu/s_expm1l.c: Likewise.
+ * sysdeps/m68k/fpu/s_ccoshl.c: Likewise.
+ * sysdeps/m68k/fpu/s_sinf.c: Likewise.
+ * sysdeps/m68k/fpu/k_tan.c: Likewise.
+ * sysdeps/m68k/fpu/k_cosl.c: Likewise.
+ * sysdeps/m68k/fpu/e_remainder.c: Likewise.
+ * sysdeps/m68k/fpu/s_trunc.c: Likewise.
+ * sysdeps/m68k/fpu/s_sincos.c: Likewise.
+ * sysdeps/m68k/fpu/s_scalbnl.c: Likewise.
+ * sysdeps/m68k/fpu/s_finitef.c: Likewise.
+ * sysdeps/m68k/fpu/s_tanhl.c: Likewise.
+ * sysdeps/m68k/fpu/s_lrintl.c: Likewise.
+ * sysdeps/m68k/fpu/slowpow.c: Likewise.
+ * sysdeps/m68k/fpu/mpexp.c: Likewise.
+ * sysdeps/m68k/fpu/s_isnanl.c: Likewise.
+ * sysdeps/m68k/fpu/e_expf.c: Likewise.
+ * sysdeps/m68k/fpu/s_significand.c: Likewise.
+ * sysdeps/m68k/fpu/e_sinhf.c: Likewise.
+ * sysdeps/m68k/fpu/s_tanl.c: Likewise.
+ * sysdeps/m68k/fpu/s_tanhf.c: Likewise.
+ * sysdeps/m68k/fpu/s_cexp.c: Likewise.
+ * sysdeps/m68k/fpu/e_sqrtf.c: Likewise.
+ * sysdeps/m68k/fpu/s_isinf.c: Likewise.
+ * sysdeps/m68k/fpu/s_nearbyint.c: Likewise.
+ * sysdeps/m68k/fpu/e_fmod.c: Likewise.
+ * sysdeps/m68k/fpu/sincos32.c: Likewise.
+ * sysdeps/m68k/fpu/e_sqrtl.c: Likewise.
+ * sysdeps/m68k/fpu/s_sincosl.c: Likewise.
+ * sysdeps/m68k/fpu/e_atan2f.c: Likewise.
+ * sysdeps/m68k/fpu/s_nearbyintf.c: Likewise.
+ * sysdeps/m68k/fpu/e_fmodl.c: Likewise.
+ * sysdeps/m68k/fpu/e_coshf.c: Likewise.
+ * sysdeps/m68k/fpu/s_csinf.c: Likewise.
+ * sysdeps/m68k/fpu/s_ccosl.c: Likewise.
+ * sysdeps/m68k/fpu/e_sqrt.c: Likewise.
+ * sysdeps/m68k/fpu/s_sin.c: Likewise.
+ * sysdeps/m68k/fpu/e_asin.c: Likewise.
+ * sysdeps/m68k/fpu/mptan.c: Likewise.
+ * sysdeps/m68k/fpu/e_exp10f.c: Likewise.
+ * sysdeps/m68k/fpu/e_scalb.c: Likewise.
+ * sysdeps/m68k/fpu/s_finitel.c: Likewise.
+ * sysdeps/m68k/fpu/e_log10.c: Likewise.
+ * sysdeps/m68k/fpu/k_sinl.c: Likewise.
+ * sysdeps/m68k/fpu/e_remainderl.c: Likewise.
+ * sysdeps/m68k/fpu/s_remquol.c: Likewise.
+ * sysdeps/m68k/fpu/s_scalblnf.c: Likewise.
+ * sysdeps/m68k/fpu/s_llrint.c: Likewise.
+ * sysdeps/m68k/fpu/e_rem_pio2.c: Likewise.
+ * sysdeps/m68k/fpu/e_asinl.c: Likewise.
+ * sysdeps/m68k/fpu/e_logl.c: Likewise.
+ * sysdeps/m68k/fpu/s_cosf.c: Likewise.
+ * sysdeps/m68k/fpu/s_rint.c: Likewise.
+ * sysdeps/m68k/fpu/s_ceill.c: Likewise.
+ * sysdeps/m68k/fpu/s_modfl.c: Likewise.
+ * sysdeps/m68k/fpu/s_csinl.c: Likewise.
+ * sysdeps/m68k/fpu/s_tan.c: Likewise.
+ * sysdeps/m68k/fpu/s_sincosf.c: Likewise.
+ * sysdeps/m68k/fpu/dosincos.c: Likewise.
+ * sysdeps/m68k/fpu/e_powl.c: Likewise.
+ * sysdeps/m68k/fpu/s_ilogb.c: Likewise.
+ * sysdeps/m68k/fpu/s_llrintl.c: Likewise.
+ * sysdeps/m68k/fpu/e_expl.c: Likewise.
+ * sysdeps/m68k/fpu/libm-test-ulps: Likewise.
+ * sysdeps/m68k/fpu/s_tanf.c: Likewise.
+ * sysdeps/m68k/fpu/mpsqrt.c: Likewise.
+ * sysdeps/m68k/fpu/s_sinl.c: Likewise.
+ * sysdeps/m68k/fpu/mathimpl.h: Likewise.
+ * sysdeps/m68k/fpu/e_acosl.c: Likewise.
+ * sysdeps/m68k/fpu/e_cosh.c: Likewise.
+ * sysdeps/m68k/fpu/s_cexpl.c: Likewise.
+ * sysdeps/m68k/fpu/s_fabsl.c: Likewise.
+ * sysdeps/m68k/fpu/halfulp.c: Likewise.
+ * sysdeps/m68k/fpu/s_modff.c: Likewise.
+ * sysdeps/m68k/fpu/s_isnan.c: Likewise.
+ * sysdeps/m68k/fpu/e_atan2.c: Likewise.
+ * sysdeps/m68k/fpu/s_fabs.c: Likewise.
+ * sysdeps/m68k/fpu/e_log10f.c: Likewise.
+ * sysdeps/m68k/fpu/k_cosf.c: Likewise.
+ * sysdeps/m68k/fpu/e_sinh.c: Likewise.
+ * sysdeps/m68k/fpu/s_truncf.c: Likewise.
+ * sysdeps/m68k/fpu/s_ceil.c: Likewise.
+ * sysdeps/m68k/fpu/s_log1pf.c: Likewise.
+ * sysdeps/m68k/fpu/e_logf.c: Likewise.
+ * sysdeps/m68k/fpu/mpatan.c: Likewise.
+ * sysdeps/m68k/fpu/s_csin.c: Likewise.
+ * sysdeps/m68k/fpu/e_exp2l.c: Likewise.
+ * sysdeps/m68k/fpu/e_sinhl.c: Likewise.
+ * sysdeps/m68k/fpu/e_atan2l.c: Likewise.
+ * sysdeps/m68k/fpu/s_scalbn.c: Likewise.
+ * sysdeps/m68k/fpu/s_floorf.c: Likewise.
+ * sysdeps/m68k/fpu/e_log2l.c: Likewise.
+ * sysdeps/m68k/fpu/s_atanl.c: Likewise.
+ * sysdeps/m68k/fpu/s_llrintf.c: Likewise.
+ * sysdeps/m68k/fpu/k_sinf.c: Likewise.
+ * sysdeps/m68k/fpu/s_csinhf.c: Likewise.
+ * sysdeps/m68k/fpu/s_frexp.c: Likewise.
+ * sysdeps/m68k/fpu/s_atanf.c: Likewise.
+ * sysdeps/m68k/fpu/s_floor.c: Likewise.
+ * sysdeps/m68k/fpu/e_exp10l.c: Likewise.
+ * sysdeps/m68k/fpu/doasin.c: Likewise.
+ * sysdeps/m68k/fpu/s_rintl.c: Likewise.
+ * sysdeps/m68k/fpu/e_atanhl.c: Likewise.
+ * sysdeps/m68k/fpu/e_remainderf.c: Likewise.
+ * sysdeps/m68k/fpu/s_scalbln.c: Likewise.
+ * sysdeps/m68k/fpu/e_rem_pio2l.c: Likewise.
+ * sysdeps/m68k/fpu/e_exp10.c: Likewise.
+ * sysdeps/m68k/fpu/s_lrintf.c: Likewise.
+ * sysdeps/m68k/fpu/k_cos.c: Likewise.
+ * sysdeps/m68k/fpu/s_lrint.c: Likewise.
+ * sysdeps/m68k/fpu/s_ccosf.c: Likewise.
+ * sysdeps/m68k/fpu/s_scalblnl.c: Likewise.
+ * sysdeps/m68k/fpu/switch/Makefile: Likewise.
+ * sysdeps/m68k/fpu/switch/switch.c: Likewise.
+ * sysdeps/m68k/fpu/switch/68881-sw.h: Likewise.
+ * sysdeps/m68k/fpu/switch/bits/mathinline.h: Likewise.
+ * sysdeps/m68k/fpu/e_log.c: Likewise.
+ * sysdeps/m68k/fpu/s_nextafterl.c: Likewise.
+ * sysdeps/m68k/fpu/s_nearbyintl.c: Likewise.
+ * sysdeps/m68k/fpu/mpatan2.c: Likewise.
+ * sysdeps/m68k/fpu/k_sin.c: Likewise.
+ * sysdeps/m68k/fpu/e_atanh.c: Likewise.
+ * sysdeps/m68k/fpu/s_remquo.c: Likewise.
+ * sysdeps/m68k/fpu/e_log10l.c: Likewise.
+ * sysdeps/m68k/fpu/s_ceilf.c: Likewise.
+ * sysdeps/m68k/fpu/s_fabsf.c: Likewise.
+ * sysdeps/m68k/fpu/s_significandl.c: Likewise.
+ * sysdeps/m68k/fpu/s_ccosh.c: Likewise.
+ * sysdeps/m68k/fpu/e_coshl.c: Likewise.
+ * sysdeps/m68k/fpu/s_scalbnf.c: Likewise.
+ * sysdeps/m68k/fpu/s_finite.c: Likewise.
+ * sysdeps/m68k/fpu/e_exp2f.c: Likewise.
+ * sysdeps/m68k/fpu/k_rem_pio2f.c: Likewise.
+ * sysdeps/m68k/fpu/s_isinfl.c: Likewise.
+ * sysdeps/m68k/fpu/bits/mathinline.h: Likewise.
+ * sysdeps/m68k/fpu/e_powf.c: Likewise.
+ * sysdeps/m68k/rshift.S: Likewise.
+ * sysdeps/m68k/lshift.S: Likewise.
+ * sysdeps/m68k/strtold_l.c: Likewise.
+ * sysdeps/m68k/printf_fphex.c: Likewise.
+ * sysdeps/m68k/s_isinfl.c: Likewise.
+ * sysdeps/m68k/bits/huge_vall.h: Likewise.
+
+ * sysdeps/m68k/asm-syntax.h (andw, andl, subqw, tstw, tstl): New.
+ * sysdeps/m68k/bits/byteswap.h (__bswap32): Don't define for
+ Coldfire targets.
+ * sysdeps/m68k/bits/setjmp.h (__jmp_buf): Add a 64-byte
+ __fpregs field for Coldfire FPUs.
+ * sysdeps/m68k/dl-machine.h: Include sysdep.h.
+ (elf_machine_load_address): Use PCREL_OP.
+ (_dl_start_user): Likewise.
+ * sysdeps/m68k/dl-trampoline.S (_dl_runtime_resolve): Avoid jmp (%dN)
+ on Coldfire; push the target address and use rts instead.
+ (_dl_runtime_profile): Likewise. Round up the frame size to longword
+ rather than word alignment. Avoid dbra on Coldfire. Avoid using
+ jsr (%d0) on Coldfire; push the return address and target address
+ and use rts instead. Use fmovem.l rather than fmovem.x on Coldfire.
+ Add missing initialization of lrv_a0 and restore a0 from it after
+ calling _dl_call_pltexit. Adjust the stack offsets of later data
+ accordingly, fixing a previously incorrect offset for the inregs
+ parameter.
+ * sysdeps/m68k/fpu/fegetenv.c (__fegetenv): Save the control
+ registers individually on Coldfire targets.
+ * sysdeps/m68k/fpu/feholdexcpt.c (feholdexcept): Likewise.
+ Add missing libm_hidden_def.
+ * sysdeps/m68k/fpu/fesetenv.c (__fesetenv): Save and restore the
+ control registers individually on Coldfire targets.
+ * sysdeps/m68k/fpu/fesetround.c (fesetround): Add missing
+ libm_hidden_def.
+ * sysdeps/m68k/fpu_control.h: Add the Coldfire bit assignments to
+ the main comment.
+ (_FPU_DOUBLE): Define to 0 for Coldfire.
+ (_FPU_EXTENDED): Don't define for Coldfire.
+ (_FPU_RESERVED): Include bit 15 for Coldfire.
+ * sysdeps/m68k/Implies: Remove ieee754/ldbl-96.
+ * sysdeps/m68k/m680x0/Implies: Add it to this new file instead.
+ * sysdeps/m68k/ldsodefs.h: New file.
+ * sysdeps/m68k/__longjmp.c (__longjmp): Restore the floating-point
+ registers when using a Coldfire FPU.
+ * sysdeps/m68k/Makefile (long-double-fcts): Delete.
+ * sysdeps/m68k/m680x0/Makefile: Add it to this new file instead.
+ * sysdeps/m68k/memchr.S (__memchr): Add Coldfire code. Avoid
+ unnecessary moves.
+ * sysdeps/m68k/preconfigure (m680?0): Add "m680x0" to $machine.
+ (m68k): Use the compiler to decide whether $machine should be
+ set to m68k/coldfire or m68k/m680x0/m68020.
+ * sysdeps/m68k/rawmemchr.S (__rawmemchr): Add Coldfire code. Avoid
+ unnecessary moves.
+ * sysdeps/m68k/setjmp.c (__sigsetjmp): Save the floating-point
+ registers when using a Coldfire FPU. Use libc_hidden_def rather
+ than hidden_def.
+ * sysdeps/m68k/strchrnul.S (__strchrnul): Add Coldfire code. Avoid
+ unnecessary moves.
+ * sysdeps/m68k/strchr.S (strchr): Likewise.
+ * sysdeps/m68k/sysdep.h (PCREL_OP): Define.
+ * sysdeps/m68k/tst-audit.h: New file.
+ * sysdeps/m68k/wcpcpy.c: Likewise.
+ * sysdeps/m68k/wcpcpy_chk.c: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/configure.in: New file.
+ * sysdeps/unix/sysv/linux/m68k/configure: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/clone.S (__clone): Add Coldfire code.
+ * sysdeps/unix/sysv/linux/m68k/register-dump.h (real_catch_segfault):
+ Do not define on Coldfire.
+ (catch_segfault): Likewise.
+ (register_dump): Use the Coldfire-specific sigcontext fields to
+ display call-saved data and address registers (rather than the
+ data stored in sc_fpstate by real_catch_segfault). Display 8-byte
+ floating-point registers on Coldfire.
+ * sysdeps/unix/sysv/linux/m68k/socket.S (__socket): Pass a temporary
+ register to SINGLE_THREAD_P.
+ * sysdeps/unix/sysv/linux/m68k/sys/reg.h (PT_FP0): Redefine for
+ Coldfire.
+ (PT_FP1, PT_FP2, PT_FP3, PT_FP4, PT_FP5, PT_FP6, PT_FP7): Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sys/ucontext.h (fpregset): Sync field
+ order with linux. Make f_fpregs an 8*2 array on Coldfire.
+ (ucontext): Sync field order with linux.
+ * sysdeps/unix/sysv/linux/m68k/sysdep.h: Guard against multiple
+ inclusion.
+ (SYSCALL_ERROR_HANDLER): Use PCREL_OP.
+ * sysdeps/unix/sysv/linux/m68k/syscalls.list (oldgetrlimit): Delete.
+ (oldsetrlimit): Likewise.
+ * sysdeps/unix/sysv/linux/m68k/m680x0/syscalls.list: New file.
+ List oldgetrlimit and oldsetrlimit here instead.
+ * sysdeps/unix/sysv/linux/m68k/bits/sigcontext.h: New file.
+ * sysdeps/unix/sysv/linux/m68k/bits/siginfo.h: Likewise.
+ * sysdeps/m68k/coldfire/bits/atomic.h: Likewise.
+ * sysdeps/m68k/coldfire/fpu/e_sqrt.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/e_sqrtf.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/fraiseexcpt.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/libm-test-ulps: Likewise.
+ * sysdeps/m68k/coldfire/fpu/s_fabs.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/s_fabsf.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/s_lrint.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/s_lrintf.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/s_rint.c: Likewise.
+ * sysdeps/m68k/coldfire/fpu/s_rintf.c: Likewise.
+ * sysdeps/m68k/coldfire/shlib-versions: Likewise.
+
2006-02-28 Roland McGrath <roland@redhat.com>
* sysdeps/m68k/preconfigure: New file.
wordsize-32
# 68k uses IEEE 754 floating point.
-ieee754/ldbl-96
ieee754/dbl-64
ieee754/flt-32
# Make sure setjmp.c is compiled with a frame pointer
CFLAGS-setjmp.c := -fno-omit-frame-pointer
-# The 68k `long double' is a distinct type we support.
-long-double-fcts = yes
-
ifeq ($(subdir),elf)
CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
endif
/* Restore the floating-point registers. */
asm volatile("fmovem%.x %0, %/fp0-%/fp7" :
/* No outputs. */ : "g" (env[0].__fpregs[0]));
+#elif defined (__mcffpu__)
+ asm volatile("fmovem %0, %/fp0-%/fp7" :
+ /* No outputs. */ : "m" (env[0].__fpregs[0]));
#endif
/* Put VAL in D0. */
#define cmpl cmp.l
#define orl or.l
#define clrl clr.l
+#define andw and.w
#define eorw eor.w
+#define andl and.l
#define lsrl lsr.l
#define lsll lsl.l
#define roxrl roxr.l
#define addql addq.l
#define subl sub.l
#define subxl subx.l
+#define subqw subq.w
#define subql subq.l
#define negl neg.l
#define mulul mulu.l
+#define tstw tst.w
+#define tstl tst.l
#endif
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
-#if defined __GNUC__ && __GNUC__ >= 2
+#if defined __GNUC__ && __GNUC__ >= 2 && !defined(__mcoldfire__)
# define __bswap_32(x) \
__extension__ \
({ unsigned int __bswap_32_v; \
/* There are eight floating point registers which
are saved in IEEE 96-bit extended format. */
char __fpregs[8 * (96 / 8)];
+#elif defined __mcffpu__
+ char __fpregs[8 * (64 / 8)];
#endif
} __jmp_buf[1];
--- /dev/null
+/* Copyright (C) 2003, 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _BITS_ATOMIC_H
+#define _BITS_ATOMIC_H 1
+
+#include <stdint.h>
+
+/* Coldfire has no atomic compare-and-exchange operation, and the
+ kernel provides no userspace atomicity operations. Here we just
+ use generic non-atomic implementations instead. */
+
+typedef int8_t atomic8_t;
+typedef uint8_t uatomic8_t;
+typedef int_fast8_t atomic_fast8_t;
+typedef uint_fast8_t uatomic_fast8_t;
+
+typedef int16_t atomic16_t;
+typedef uint16_t uatomic16_t;
+typedef int_fast16_t atomic_fast16_t;
+typedef uint_fast16_t uatomic_fast16_t;
+
+typedef int32_t atomic32_t;
+typedef uint32_t uatomic32_t;
+typedef int_fast32_t atomic_fast32_t;
+typedef uint_fast32_t uatomic_fast32_t;
+
+typedef int64_t atomic64_t;
+typedef uint64_t uatomic64_t;
+typedef int_fast64_t atomic_fast64_t;
+typedef uint_fast64_t uatomic_fast64_t;
+
+typedef intptr_t atomicptr_t;
+typedef uintptr_t uatomicptr_t;
+typedef intmax_t atomic_max_t;
+typedef uintmax_t uatomic_max_t;
+
+/* The only basic operation needed is compare and exchange. */
+#define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
+ ({ __typeof (mem) __gmemp = (mem); \
+ __typeof (*mem) __gret = *__gmemp; \
+ __typeof (*mem) __gnewval = (newval); \
+ \
+ if (__gret == (oldval)) \
+ *__gmemp = __gnewval; \
+ __gret; })
+
+#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
+ ({ __typeof (mem) __gmemp = (mem); \
+ __typeof (*mem) __gnewval = (newval); \
+ \
+ *__gmemp == (oldval) ? (*__gmemp = __gnewval, 0) : 1; })
+
+#endif
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+double
+__ieee754_sqrt (double x)
+{
+ asm ("fdsqrt.d %1,%0" : "=f" (x) : "fm" (x));
+ return x;
+}
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+float
+__ieee754_sqrtf (float x)
+{
+ double result;
+ asm ("fssqrt.s %1,%0" : "=f" (result) : "dm" (x));
+ return result;
+}
--- /dev/null
+/* Raise given exceptions.
+ Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fenv.h>
+#include <float.h>
+#include <math.h>
+
+int
+feraiseexcept (int excepts)
+{
+ /* Raise exceptions represented by EXCEPTS. But we must raise only one
+ signal at a time. It is important that if the overflow/underflow
+ exception and the divide by zero exception are given at the same
+ time, the overflow/underflow exception follows the divide by zero
+ exception.
+
+ The Coldfire FPU allows an exception to be raised by asserting
+ the associated EXC bit and then executing an arbitrary arithmetic
+ instruction. fmove.l is classified as an arithmetic instruction
+ and suffices for this purpose.
+
+ We therefore raise an exception by setting both the EXC and AEXC
+ bit associated with the exception (the former being 6 bits to the
+ left of the latter) and then loading the longword at (%sp) into an
+ FP register. */
+
+ inline void
+ raise_one_exception (int mask)
+ {
+ if (excepts & mask)
+ {
+ int fpsr;
+ double unused;
+
+ asm volatile ("fmove%.l %/fpsr,%0" : "=d" (fpsr));
+ fpsr |= (mask << 6) | mask;
+ asm volatile ("fmove%.l %0,%/fpsr" :: "d" (fpsr));
+ asm volatile ("fmove%.l (%%sp),%0" : "=f" (unused));
+ }
+ }
+
+ raise_one_exception (FE_INVALID);
+ raise_one_exception (FE_DIVBYZERO);
+ raise_one_exception (FE_OVERFLOW);
+ raise_one_exception (FE_UNDERFLOW);
+ raise_one_exception (FE_INEXACT);
+
+ /* Success. */
+ return 0;
+}
+libm_hidden_def (feraiseexcept)
--- /dev/null
+# Begin of automatic generation
+
+# atan2
+Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025":
+float: 1
+ifloat: 1
+Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025":
+float: 1
+ifloat: 1
+Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772":
+float: 1
+ifloat: 1
+
+# atanh
+Test "atanh (0.75) == 0.972955074527656652552676371721589865":
+float: 1
+ifloat: 1
+
+# cacosh
+Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+float: 1
+ifloat: 1
+
+# casin
+Test "Real part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# casinh
+Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+Test "Real part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# catan
+Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# catanh
+Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
+double: 4
+idouble: 4
+Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
+double: 1
+idouble: 1
+
+# cbrt
+Test "cbrt (-27.0) == -3.0":
+double: 1
+idouble: 1
+Test "cbrt (0.75) == 0.908560296416069829445605878163630251":
+double: 1
+idouble: 1
+Test "cbrt (0.9921875) == 0.997389022060725270579075195353955217":
+double: 1
+idouble: 1
+
+# ccos
+Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i":
+float: 1
+ifloat: 1
+Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i":
+float: 1
+ifloat: 1
+
+# ccosh
+Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i":
+float: 1
+ifloat: 1
+Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i":
+float: 1
+ifloat: 1
+
+# cexp
+Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i":
+float: 1
+ifloat: 1
+Test "Real part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i":
+float: 1
+ifloat: 1
+
+# clog
+Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i":
+float: 1
+ifloat: 1
+
+# clog10
+Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Real part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i":
+float: 1
+ifloat: 1
+
+# cos
+Test "cos (M_PI_6l * 2.0) == 0.5":
+double: 1
+idouble: 1
+Test "cos (M_PI_6l * 4.0) == -0.5":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+# cpow
+Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
+float: 1
+ifloat: 1
+Test "Real part of: cpow (0.75 + 1.25 i, 0.75 + 1.25 i) == 0.117506293914473555420279832210420483 + 0.346552747708338676483025352060418001 i":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 1.0 i) == 0.0846958290317209430433805274189191353 + 0.513285749182902449043287190519090481 i":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+# csinh
+Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i":
+double: 1
+idouble: 1
+Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i":
+float: 1
+ifloat: 1
+
+# csqrt
+Test "Real part of: csqrt (-2 + 3 i) == 0.89597747612983812471573375529004348 + 1.6741492280355400404480393008490519 i":
+float: 1
+ifloat: 1
+Test "Real part of: csqrt (-2 - 3 i) == 0.89597747612983812471573375529004348 - 1.6741492280355400404480393008490519 i":
+float: 1
+ifloat: 1
+
+# ctan
+Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i":
+double: 1
+idouble: 1
+
+# ctanh
+Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
+float: 1
+ifloat: 1
+Test "Real part of: ctanh (0.75 + 1.25 i) == 1.37260757053378320258048606571226857 + 0.385795952609750664177596760720790220 i":
+double: 1
+idouble: 1
+
+# erf
+Test "erf (1.25) == 0.922900128256458230136523481197281140":
+double: 1
+idouble: 1
+
+# erfc
+Test "erfc (2.0) == 0.00467773498104726583793074363274707139":
+double: 1
+idouble: 1
+Test "erfc (4.125) == 0.542340079956506600531223408575531062e-8":
+double: 1
+idouble: 1
+
+# exp10
+Test "exp10 (-1) == 0.1":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "exp10 (0.75) == 5.62341325190349080394951039776481231":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "exp10 (3) == 1000":
+double: 6
+float: 2
+idouble: 6
+ifloat: 2
+
+# expm1
+Test "expm1 (0.75) == 1.11700001661267466854536981983709561":
+double: 1
+idouble: 1
+Test "expm1 (1) == M_El - 1.0":
+float: 1
+ifloat: 1
+
+# hypot
+Test "hypot (-0.7, -12.4) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+Test "hypot (-0.7, 12.4) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+Test "hypot (-12.4, -0.7) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+Test "hypot (-12.4, 0.7) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+Test "hypot (0.7, -12.4) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+Test "hypot (0.7, 12.4) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+Test "hypot (12.4, -0.7) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+Test "hypot (12.4, 0.7) == 12.419742348374220601176836866763271":
+float: 1
+ifloat: 1
+
+# j0
+Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "j0 (0.75) == 0.864242275166648623555731103820923211":
+float: 1
+ifloat: 1
+Test "j0 (10.0) == -0.245935764451348335197760862485328754":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "j0 (2.0) == 0.223890779141235668051827454649948626":
+float: 2
+ifloat: 2
+Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "j0 (8.0) == 0.171650807137553906090869407851972001":
+float: 1
+ifloat: 1
+
+# j1
+Test "j1 (10.0) == 0.0434727461688614366697487680258592883":
+float: 2
+ifloat: 2
+Test "j1 (2.0) == 0.576724807756873387202448242269137087":
+double: 1
+idouble: 1
+Test "j1 (8.0) == 0.234636346853914624381276651590454612":
+double: 1
+idouble: 1
+
+# jn
+Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "jn (0, 0.75) == 0.864242275166648623555731103820923211":
+float: 1
+ifloat: 1
+Test "jn (0, 10.0) == -0.245935764451348335197760862485328754":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "jn (0, 2.0) == 0.223890779141235668051827454649948626":
+float: 2
+ifloat: 2
+Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "jn (0, 8.0) == 0.171650807137553906090869407851972001":
+float: 1
+ifloat: 1
+Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883":
+float: 2
+ifloat: 2
+Test "jn (1, 2.0) == 0.576724807756873387202448242269137087":
+double: 1
+idouble: 1
+Test "jn (1, 8.0) == 0.234636346853914624381276651590454612":
+double: 1
+idouble: 1
+Test "jn (10, 0.125) == 0.250543369809369890173993791865771547e-18":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "jn (10, 0.75) == 0.149621713117596814698712483621682835e-10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "jn (10, 10.0) == 0.207486106633358857697278723518753428":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6":
+float: 4
+ifloat: 4
+Test "jn (3, 0.125) == 0.406503832554912875023029337653442868e-4":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "jn (3, 0.75) == 0.848438342327410884392755236884386804e-2":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "jn (3, 2.0) == 0.128943249474402051098793332969239835":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# lgamma
+Test "lgamma (0.7) == 0.260867246531666514385732417016759578":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# log10
+Test "log10 (0.75) == -0.124938736608299953132449886193870744":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+Test "log10 (e) == log10(e)":
+float: 1
+ifloat: 1
+
+# log1p
+Test "log1p (-0.25) == -0.287682072451780927439219005993827432":
+float: 1
+ifloat: 1
+
+# sincos
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+double: 1
+idouble: 1
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
+float: 1
+ifloat: 1
+
+# tgamma
+Test "tgamma (-0.5) == -2 sqrt (pi)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "tgamma (0.5) == sqrt (pi)":
+float: 1
+ifloat: 1
+Test "tgamma (0.7) == 1.29805533264755778568117117915281162":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# y0
+Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (1.5) == 0.382448923797758843955068554978089862":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (10.0) == 0.0556711672835993914244598774101900481":
+float: 1
+ifloat: 1
+Test "y0 (8.0) == 0.223521489387566220527323400498620359":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# y1
+Test "y1 (0.125) == -5.19993611253477499595928744876579921":
+double: 1
+idouble: 1
+Test "y1 (1.5) == -0.412308626973911295952829820633445323":
+float: 1
+ifloat: 1
+Test "y1 (10.0) == 0.249015424206953883923283474663222803":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "y1 (2.0) == -0.107032431540937546888370772277476637":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y1 (8.0) == -0.158060461731247494255555266187483550":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# yn
+Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 1.5) == 0.382448923797758843955068554978089862":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481":
+float: 1
+ifloat: 1
+Test "yn (0, 8.0) == 0.223521489387566220527323400498620359":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 0.125) == -5.19993611253477499595928744876579921":
+double: 1
+idouble: 1
+Test "yn (1, 1.5) == -0.412308626973911295952829820633445323":
+float: 1
+ifloat: 1
+Test "yn (1, 10.0) == 0.249015424206953883923283474663222803":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "yn (1, 2.0) == -0.107032431540937546888370772277476637":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 8.0) == -0.158060461731247494255555266187483550":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+Test "yn (10, 0.125) == -127057845771019398.252538486899753195":
+double: 1
+idouble: 1
+Test "yn (10, 0.75) == -2133501638.90573424452445412893839236":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (10, 1.0) == -121618014.278689189288130426667971145":
+double: 1
+idouble: 1
+Test "yn (10, 10.0) == -0.359814152183402722051986577343560609":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (10, 2.0) == -129184.542208039282635913145923304214":
+double: 2
+idouble: 2
+Test "yn (3, 0.125) == -2612.69757350066712600220955744091741":
+double: 1
+idouble: 1
+Test "yn (3, 0.75) == -12.9877176234475433186319774484809207":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (3, 10.0) == -0.251362657183837329779204747654240998":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (3, 2.0) == -1.12778377684042778608158395773179238":
+double: 1
+idouble: 1
+
+# Maximal error of functions:
+Function: "atan2":
+float: 1
+ifloat: 1
+
+Function: "atanh":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "cacosh":
+float: 1
+ifloat: 1
+
+Function: Real part of "casin":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "casinh":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+
+Function: Imaginary part of "casinh":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "catanh":
+double: 4
+idouble: 4
+
+Function: "cbrt":
+double: 1
+idouble: 1
+
+Function: Real part of "ccos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ccos":
+float: 1
+ifloat: 1
+
+Function: Real part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ccosh":
+float: 1
+ifloat: 1
+
+Function: Real part of "cexp":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "cexp":
+float: 1
+ifloat: 1
+
+Function: Real part of "clog":
+float: 1
+ifloat: 1
+
+Function: Real part of "clog10":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "clog10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "cos":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Real part of "cpow":
+double: 2
+float: 4
+idouble: 2
+ifloat: 4
+
+Function: Imaginary part of "cpow":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "csinh":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "csinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csqrt":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "ctan":
+double: 1
+idouble: 1
+
+Function: Real part of "ctanh":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "ctanh":
+float: 1
+ifloat: 1
+
+Function: "erf":
+double: 1
+idouble: 1
+
+Function: "erfc":
+double: 1
+idouble: 1
+
+Function: "exp10":
+double: 6
+float: 2
+idouble: 6
+ifloat: 2
+
+Function: "expm1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "hypot":
+float: 1
+ifloat: 1
+
+Function: "j0":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "j1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "jn":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: "lgamma":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "log10":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "log1p":
+float: 1
+ifloat: 1
+
+Function: "sincos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "tan":
+double: 1
+idouble: 1
+
+Function: "tgamma":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "y0":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "y1":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "yn":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+# end of automatic generation
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+double
+__fabs (double x)
+{
+ asm ("fdabs.d %1,%0" : "=f" (x) : "fm" (x));
+ return x;
+}
+weak_alias (__fabs, fabs)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__fabs, __fabsl)
+weak_alias (__fabs, fabsl)
+#endif
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+float
+__fabsf (float x)
+{
+ asm ("fsabs.s %1,%0" : "=f" (x) : "dm" (x));
+ return x;
+}
+weak_alias (__fabsf, fabsf)
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+long int
+__lrint (double x)
+{
+ long int result;
+ asm ("fmove.l %1,%0" : "=dm" (result) : "f" (x));
+ return result;
+}
+weak_alias (__lrint, lrint)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__lrint, __lrintl)
+weak_alias (__lrint, lrintl)
+#endif
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+long int
+__lrintf (float x)
+{
+ long int result;
+ asm ("fmove.l %1,%0" : "=dm" (result) : "f" (x));
+ return result;
+}
+weak_alias (__lrintf, lrintf)
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+double
+__rint (double x)
+{
+ asm ("fint.d %1,%0" : "=f" (x) : "fm" (x));
+ return x;
+}
+weak_alias (__rint, rint)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__rint, __rintl)
+weak_alias (__rint, rintl)
+#endif
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+float
+__rintf (float x)
+{
+ double result;
+ asm ("fint.s %1,%0" : "=f" (result) : "dm" (x));
+ return (float) result;
+}
+weak_alias (__rintf, rintf)
--- /dev/null
+m68k-.*-linux.* DEFAULT GLIBC_2.4
#define ELF_MACHINE_NAME "m68k"
#include <sys/param.h>
+#include <sysdep.h>
/* Return nonzero iff ELF header is compatible with the running host. */
static inline int
elf_machine_load_address (void)
{
Elf32_Addr addr;
- asm ("lea _dl_start(%%pc), %0\n\t"
+ asm (PCREL_OP ("lea", "_dl_start", "%0", "%0", "%%pc") "\n\t"
"sub.l _dl_start@GOT.w(%%a5), %0"
: "=a" (addr));
return addr;
move.l %d0, %a4\n\
| See if we were run as a command with the executable file\n\
| name as an extra leading argument.\n\
- move.l _dl_skip_args(%pc), %d0\n\
+ " PCREL_OP ("move.l", "_dl_skip_args", "%d0", "%d0", "%pc") "\n\
| Pop the original argument count\n\
move.l (%sp)+, %d1\n\
| Subtract _dl_skip_args from it.\n\
pea 8(%sp, %d1*4)\n\
pea 8(%sp)\n\
move.l %d1, -(%sp)\n\
- move.l _rtld_local(%pc), -(%sp)\n\
+ " PCREL_OP ("move.l", "_rtld_local", "-(%sp)", "%d0", "%pc") "\n\
jbsr _dl_init_internal@PLTPC\n\
addq.l #8, %sp\n\
addq.l #8, %sp\n\
| Pass our finalizer function to the user in %a1.\n\
- lea _dl_fini(%pc), %a1\n\
+ " PCREL_OP ("lea", "_dl_fini", "%a1", "%a1", "%pc") "\n\
| Initialize %fp with the stack pointer.\n\
move.l %sp, %fp\n\
| Jump to the user's entry point.\n\
| Pop parameters
addq.l #8, %sp
| Call real function.
+#ifdef __mcoldfire__
+ move.l %d0,-(%sp)
+ rts
+#else
jmp (%d0)
+#endif
.size _dl_runtime_resolve, . - _dl_runtime_resolve
.text
move.l (%sp)+, %a1
lea 12(%sp), %sp
| Call real function.
+#ifdef __mcoldfire__
+ move.l %d0,-(%sp)
+ rts
+#else
jmp (%d0)
+#endif
/*
+24 return address
move.l %sp, %a2
move.l %sp, %a0
lea 28(%sp), %a1
- | Round framesize up to even
- addq.l #1, %d1
- lsr #1, %d1
- sub.l %d1, %a0
+ | Round framesize up to longword alignment
+ addq.l #3, %d1
+ and.l #-3, %d1
sub.l %d1, %a0
move.l %a0, %sp
+#ifdef __mcoldfire__
+ tst.l %d1
+ beq 2f
+1: move.l (%a0)+, (%a1)+
+ subq.l #4,%d1
+ bne 1b
+2:
+#else
+ lsr.l #2,%d1
jra 2f
-1: move.w (%a1)+, (%a0)+
+1: move.l (%a1)+, (%a0)+
2: dbra %d1,1b
+#endif
/*
%a2+24 return address
%a2+20 PLT1
move.l 4(%a2), %a0
move.l 8(%a2), %a1
+#ifdef __mcoldfire__
+ pea 2f(%pc)
+ move.l %d0,-(%sp)
+ rts
+2:
+#else
jsr (%d0)
+#endif
move.l %a2, %sp
move.l (%sp)+, %a2
/*
+4 %a1
%sp %a0
*/
+#ifdef __mcoldfire__
+ fmove.l %fp0, -(%sp)
+#else
fmove.x %fp0, -(%sp)
+#endif
+ move.l %a0, -(%sp)
move.l %d1, -(%sp)
move.l %d0, -(%sp)
pea (%sp)
- pea 20(%sp)
+#ifdef __mcoldfire__
+ pea 24(%sp)
move.l 40(%sp), -(%sp)
move.l 40(%sp), -(%sp)
+#else
+ pea 28(%sp)
+ move.l 44(%sp), -(%sp)
+ move.l 44(%sp), -(%sp)
+#endif
jbsr _dl_call_pltexit
lea 16(%sp), %sp
move.l (%sp)+, %d0
move.l (%sp)+, %d1
+ move.l (%sp)+, %a0
+#ifdef __mcoldfire__
+ fmove.d (%sp)+, %fp0
+#else
fmove.x (%sp)+, %fp0
+#endif
lea 20(%sp), %sp
rts
.size _dl_runtime_profile, . - _dl_runtime_profile
int
__fegetenv (fenv_t *envp)
{
+#ifdef __mcoldfire__
+ __asm__ ("fmove%.l %/fpcr,%0" : "=dm" (envp->__control_register));
+ __asm__ ("fmove%.l %/fpsr,%0" : "=dm" (envp->__status_register));
+ __asm__ ("fmove%.l %/fpiar,%0" : "=dm" (envp->__instruction_address));
+#else
__asm__ ("fmovem%.l %/fpcr/%/fpsr/%/fpiar,%0" : "=m" (*envp));
+#endif
/* Success. */
return 0;
fexcept_t fpcr, fpsr;
/* Store the environment. */
+#ifdef __mcoldfire__
+ __asm__ ("fmove%.l %/fpcr,%0" : "=dm" (envp->__control_register));
+ __asm__ ("fmove%.l %/fpsr,%0" : "=dm" (envp->__status_register));
+ __asm__ ("fmove%.l %/fpiar,%0" : "=dm" (envp->__instruction_address));
+#else
__asm__ ("fmovem%.l %/fpcr/%/fpsr/%/fpiar,%0" : "=m" (*envp));
+#endif
/* Now clear all exceptions. */
fpsr = envp->__status_register & ~FE_ALL_EXCEPT;
return 0;
}
+libm_hidden_def (feholdexcept);
values which we do not want to come from the saved environment.
Therefore, we get the current environment and replace the values
we want to use from the environment specified by the parameter. */
+#ifdef __mcoldfire__
+ __asm__ ("fmove%.l %/fpcr,%0" : "=dm" (temp.__control_register));
+ __asm__ ("fmove%.l %/fpsr,%0" : "=dm" (temp.__status_register));
+ __asm__ ("fmove%.l %/fpiar,%0" : "=dm" (temp.__instruction_address));
+#else
__asm__ ("fmovem%.l %/fpcr/%/fpsr/%/fpiar,%0" : "=m" (*&temp));
+#endif
temp.__status_register &= ~FE_ALL_EXCEPT;
temp.__control_register &= ~((FE_ALL_EXCEPT << 6) | FE_UPWARD);
temp.__status_register |= envp->__status_register & FE_ALL_EXCEPT;
}
+#ifdef __mcoldfire__
+ __asm__ __volatile__ ("fmove%.l %0,%/fpiar"
+ :: "dm" (temp.__instruction_address));
+ __asm__ __volatile__ ("fmove%.l %0,%/fpcr"
+ :: "dm" (temp.__control_register));
+ __asm__ __volatile__ ("fmove%.l %0,%/fpsr"
+ :: "dm" (temp.__status_register));
+#else
__asm__ __volatile__ ("fmovem%.l %0,%/fpcr/%/fpsr/%/fpiar" : : "m" (*&temp));
+#endif
/* Success. */
return 0;
return 0;
}
+libm_hidden_def (fesetround);
* 12 -> enable trap for OVFL exception
* 11 -> enable trap for UNFL exception
* 10 -> enable trap for DZ exception
- * 9 -> enable trap for INEX2 exception
- * 8 -> enable trap for INEX1 exception
- * 7-6 -> Precision Control
+ * 9 -> enable trap for INEX2 exception (INEX on Coldfire)
+ * 8 -> enable trap for INEX1 exception (IDE on Coldfire)
+ * 7-6 -> Precision Control (only bit 6 is used on Coldfire)
* 5-4 -> Rounding Control
* 3-0 -> zero (read as 0, write as 0)
*
#define _FPU_MASK_INEX2 0x0100
/* precision control */
+#ifdef __mcoldfire__
+#define _FPU_DOUBLE 0x00
+#else
#define _FPU_EXTENDED 0x00 /* RECOMMENDED */
#define _FPU_DOUBLE 0x80
+#endif
#define _FPU_SINGLE 0x40 /* DO NOT USE */
/* rounding control */
#define _FPU_RC_DOWN 0x20
#define _FPU_RC_UP 0x30
+#ifdef __mcoldfire__
+#define _FPU_RESERVED 0xFFFF800F
+#else
#define _FPU_RESERVED 0xFFFF000F /* Reserved bits in fpucr */
+#endif
/* Now two recommended fpucr */
--- /dev/null
+/* Run-time dynamic linker data structures for loaded ELF shared objects.
+ Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef __LDSODEFS_H
+
+#include <elf.h>
+
+struct La_m68k_regs;
+struct La_m68k_retval;
+
+#define ARCH_PLTENTER_MEMBERS \
+ Elf32_Addr (*m68k_gnu_pltenter) (Elf32_Sym *, unsigned int, \
+ uintptr_t *, uintptr_t *, \
+ const struct La_m68k_regs *, \
+ unsigned int *, const char *name, \
+ long int *framesizep);
+
+#define ARCH_PLTEXIT_MEMBERS \
+ unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, \
+ uintptr_t *, uintptr_t *, \
+ const struct La_m68k_regs *, \
+ struct La_m68k_retval *, \
+ const char *);
+
+#include_next <ldsodefs.h>
+
+#endif
--- /dev/null
+ieee754/ldbl-96
--- /dev/null
+# The 68k `long double' is a distinct type we support.
+long-double-fcts = yes
TEXT
ENTRY(__memchr)
/* Save the callee-saved registers we use. */
+#ifdef __mcoldfire__
+ movel R(d2),MEM_PREDEC(sp)
+ movel R(d3),MEM_PREDEC(sp)
+ movel R(d4),MEM_PREDEC(sp)
+#else
moveml R(d2)-R(d4),MEM_PREDEC(sp)
+#endif
/* Get string pointer, character and length. */
movel MEM_DISP(sp,16),R(a0)
movel MEM_DISP(sp,24),R(d4)
/* Check if at least four bytes left to search. */
+#ifdef __mcoldfire__
+ subql #4,R(d4)
+ bcs L(L6)
+ addql #4,R(d4)
+#else
moveql #4,R(d1)
cmpl R(d1),R(d4)
bcs L(L6)
+#endif
/* Distribute the character to all bytes of a longword. */
movel R(d0),R(d1)
/* First search for the character one byte at a time until the
pointer is aligned to a longword boundary. */
movel R(a0),R(d1)
+#ifdef __mcoldfire__
+ andl #3,R(d1)
+#else
andw #3,R(d1)
+#endif
beq L(L1)
cmpb MEM(a0),R(d0)
beq L(L9)
subql #1,R(d4)
beq L(L7)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ subql #3,R(d1)
+#else
+ subqw #3,R(d1)
+#endif
beq L(L1)
cmpb MEM(a0),R(d0)
beq L(L9)
subql #1,R(d4)
beq L(L7)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ addql #1,R(d1)
+#else
+ addqw #1,R(d1)
+#endif
beq L(L1)
cmpb MEM(a0),R(d0)
beq L(L9)
L(L6:)
/* Search one byte at a time in the remaining less than 4 bytes. */
+#ifdef __mcoldfire__
+ addql #4,R(d4)
+#else
andw #3,R(d4)
+#endif
beq L(L7)
cmpb MEM(a0),R(d0)
beq L(L9)
addql #1,R(a0)
+#ifdef __mcoldfire__
+ subql #1,R(d4)
+#else
subqw #1,R(d4)
+#endif
beq L(L7)
cmpb MEM(a0),R(d0)
beq L(L9)
addql #1,R(a0)
+#ifdef __mcoldfire__
+ subql #1,R(d4)
+#else
subqw #1,R(d4)
+#endif
beq L(L7)
cmpb MEM(a0),R(d0)
beq L(L9)
/* Return NULL. */
clrl R(d0)
movel R(d0),R(a0)
+#ifdef __mcoldfire__
+ movel MEM_POSTINC(sp),R(d4)
+ movel MEM_POSTINC(sp),R(d3)
+ movel MEM_POSTINC(sp),R(d2)
+#else
moveml MEM_POSTINC(sp),R(d2)-R(d4)
+#endif
rts
L(L8:)
/* Otherwise the fourth byte must equal C. */
L(L9:)
movel R(a0),R(d0)
+#ifdef __mcoldfire__
+ movel MEM_POSTINC(sp),R(d4)
+ movel MEM_POSTINC(sp),R(d3)
+ movel MEM_POSTINC(sp),R(d2)
+#else
moveml MEM_POSTINC(sp),R(d2)-R(d4)
+#endif
rts
END(__memchr)
# This fragment canonicalizes the machine names for m68k variants.
case "$machine" in
-m680?0) base_machine=m68k machine=m68k/$machine ;;
-m68k) base_machine=m68k machine=m68k/m68020 ;;
+m680?0) base_machine=m68k machine=m68k/m680x0/$machine ;;
+m68k) variant=`(echo "#ifdef __mcoldfire__"
+ echo "coldfire"
+ echo "#else"
+ echo "m680x0/m68020"
+ echo "#endif") |
+ $CC $CFLAGS $CPPFLAGS -E - |
+ grep '^[a-z]'`
+ if test -z "$variant"; then
+ echo >&2 "Cannot determine m68k processor variant"
+ exit 1
+ fi
+ base_machine=m68k machine=m68k/$variant ;;
esac
/* First search for the character one byte at a time until the
pointer is aligned to a longword boundary. */
movel R(a0),R(d1)
+#ifdef __mcoldfire__
+ andl #3,R(d1)
+#else
andw #3,R(d1)
+#endif
beq L(L1)
cmpb MEM(a0),R(d0)
beq L(L9)
addql #1,R(a0)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ subql #3,R(d1)
+#else
+ subqw #3,R(d1)
+#endif
beq L(L1)
cmpb MEM(a0),R(d0)
beq L(L9)
addql #1,R(a0)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ addql #1,R(d1)
+#else
+ addqw #1,R(d1)
+#endif
beq L(L1)
cmpb MEM(a0),R(d0)
beq L(L9)
/* Save floating-point (68881) registers FP0 through FP7. */
asm volatile ("fmovem%.x %/fp0-%/fp7, %0"
: : "m" (env[0].__jmpbuf[0].__fpregs[0]));
+#elif defined (__mcffpu__)
+ asm volatile ("fmovem %/fp0-%/fp7, %0"
+ : : "m" (env[0].__jmpbuf[0].__fpregs[0]));
#endif
/* Save the signal mask if requested. */
return __sigjmp_save (env, savemask);
}
#if !defined BSD_SETJMP && !defined BSD__SETJMP
-hidden_def (__sigsetjmp)
+libc_hidden_def (__sigsetjmp)
#endif
/* First search for the character one byte at a time until the
pointer is aligned to a longword boundary. */
movel R(a0),R(d1)
+#ifdef __mcoldfire__
+ andl #3,R(d1)
+#else
andw #3,R(d1)
+#endif
beq L(L1)
- moveb MEM(a0),R(d1)
- cmpb R(d0),R(d1)
+ moveb MEM(a0),R(d2)
+ cmpb R(d0),R(d2)
beq L(L9)
- tstb R(d1)
+ tstb R(d2)
beq L(L3)
addql #1,R(a0)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ subql #3,R(d1)
+#else
+ subqw #3,R(d1)
+#endif
beq L(L1)
- moveb MEM(a0),R(d1)
- cmpb R(d0),R(d1)
+ moveb MEM(a0),R(d2)
+ cmpb R(d0),R(d2)
beq L(L9)
- tstb R(d1)
+ tstb R(d2)
beq L(L3)
addql #1,R(a0)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ addql #1,R(d1)
+#else
+ addqw #1,R(d1)
+#endif
beq L(L1)
- moveb MEM(a0),R(d1)
- cmpb R(d0),R(d1)
+ moveb MEM(a0),R(d2)
+ cmpb R(d0),R(d2)
beq L(L9)
- tstb R(d1)
+ tstb R(d2)
beq L(L3)
addql #1,R(a0)
/* First search for the character one byte at a time until the
pointer is aligned to a longword boundary. */
movel R(a0),R(d1)
+#ifdef __mcoldfire__
+ andl #3,R(d1)
+#else
andw #3,R(d1)
+#endif
beq L(L1)
- moveb MEM(a0),R(d1)
- cmpb R(d0),R(d1)
+ moveb MEM(a0),R(d2)
+ cmpb R(d0),R(d2)
beq L(L9)
- tstb R(d1)
+ tstb R(d2)
beq L(L9)
addql #1,R(a0)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ subql #3,R(d1)
+#else
+ subqw #3,R(d1)
+#endif
beq L(L1)
- moveb MEM(a0),R(d1)
- cmpb R(d0),R(d1)
+ moveb MEM(a0),R(d2)
+ cmpb R(d0),R(d2)
beq L(L9)
- tstb R(d1)
+ tstb R(d2)
beq L(L9)
addql #1,R(a0)
- movel R(a0),R(d1)
- andw #3,R(d1)
+#ifdef __mcoldfire__
+ addql #1,R(d1)
+#else
+ addqw #1,R(d1)
+#endif
beq L(L1)
- moveb MEM(a0),R(d1)
- cmpb R(d0),R(d1)
+ moveb MEM(a0),R(d2)
+ cmpb R(d0),R(d2)
beq L(L9)
- tstb R(d1)
+ tstb R(d2)
beq L(L9)
addql #1,R(a0)
# define JUMPTARGET(name) name
# endif
+/* Perform operation OP with PC-relative SRC as the first operand and
+ DST as the second. TMP is available as a temporary if needed. */
+#ifdef __mcoldfire__
+#define PCREL_OP(OP, SRC, DST, TMP) \
+ move.l &SRC - ., TMP; OP (-8, %pc, TMP), DST
+#else
+#define PCREL_OP(OP, SRC, DST, TMP) \
+ OP SRC(%pc), DST
+#endif
+
+#else
+
+/* As above, but PC is the spelling of the PC register. We need this
+ so that the macro can be used in both normal and extended asms. */
+#ifdef __mcoldfire__
+#define PCREL_OP(OP, SRC, DST, TMP, PC) \
+ "move.l #" SRC " - ., " TMP "\n\t" OP " (-8, " PC ", " TMP "), " DST
+#else
+#define PCREL_OP(OP, SRC, DST, TMP, PC) \
+ OP " " SRC "(" PC "), " DST
+#endif
+
#endif /* __ASSEMBLER__ */
--- /dev/null
+/* Definitions for testing PLT entry/exit auditing. m68k version.
+ Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#define pltenter la_m68k_gnu_pltenter
+#define pltexit la_m68k_gnu_pltexit
+#define La_regs La_m68k_regs
+#define La_retval La_m68k_retval
+#define int_retval lrv_d0
--- /dev/null
+/* Copyright (C) 1996, 1997, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* The generic version of this file assumes that __alignof__(wchar_t) ==
+ sizeof (wchar_t). We therefore use this port-specific implementation
+ instead. */
+#include <wchar.h>
+
+/* Copy SRC to DEST, returning the address of the terminating L'\0' in
+ DEST. */
+wchar_t *
+__wcpcpy (wchar_t *dest, const wchar_t *src)
+{
+ do
+ ;
+ while ((*dest++ = *src++));
+
+ return dest - 1;
+}
+
+weak_alias (__wcpcpy, wcpcpy)
--- /dev/null
+/* Copyright (C) 1996, 1997, 2005, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* The generic version of this file assumes that __alignof__(wchar_t) ==
+ sizeof (wchar_t). We therefore use this port-specific implementation
+ instead. */
+#include <wchar.h>
+
+/* Copy SRC to DEST, returning the address of the terminating L'\0' in
+ DEST. Check for overflows. */
+wchar_t *
+__wcpcpy_chk (wchar_t *dest, const wchar_t *src, size_t destlen)
+{
+ do
+ if (destlen-- == 0)
+ __chk_fail ();
+ while ((*dest++ = *src++));
+
+ return dest - 1;
+}
--- /dev/null
+/* Copyright (C) 2006 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
+# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
+#endif
+
+#ifndef _BITS_SIGCONTEXT_H
+#define _BITS_SIGCONTEXT_H 1
+
+struct sigcontext {
+ unsigned long sc_mask;
+ unsigned long sc_usp;
+ unsigned long sc_d0;
+ unsigned long sc_d1;
+#ifdef __mcoldfire__
+ unsigned long sc_d2;
+ unsigned long sc_d3;
+ unsigned long sc_d4;
+ unsigned long sc_d5;
+ unsigned long sc_d6;
+ unsigned long sc_d7;
+#endif
+ unsigned long sc_a0;
+ unsigned long sc_a1;
+#ifdef __mcoldfire__
+ unsigned long sc_a2;
+ unsigned long sc_a3;
+ unsigned long sc_a4;
+ unsigned long sc_a5;
+ unsigned long sc_a6;
+#endif
+ unsigned short sc_sr;
+ unsigned long sc_pc;
+ unsigned short sc_formatvec;
+#ifdef __mcoldfire__
+ unsigned long sc_fpregs[8][2];
+ unsigned long sc_fpcntl[3];
+ unsigned char sc_fpstate[16];
+#else
+ unsigned long sc_fpregs[2*3];
+ unsigned long sc_fpcntl[3];
+ unsigned char sc_fpstate[216];
+#endif
+};
+
+#endif
--- /dev/null
+/* siginfo_t, sigevent and constants. m68k linux version.
+ Copyright (C) 1997-2002, 2003 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#if !defined _SIGNAL_H && !defined __need_siginfo_t \
+ && !defined __need_sigevent_t
+# error "Never include this file directly. Use <signal.h> instead"
+#endif
+
+#include <bits/wordsize.h>
+
+#if (!defined __have_sigval_t \
+ && (defined _SIGNAL_H || defined __need_siginfo_t \
+ || defined __need_sigevent_t))
+# define __have_sigval_t 1
+
+/* Type for data associated with a signal. */
+typedef union sigval
+ {
+ int sival_int;
+ void *sival_ptr;
+ } sigval_t;
+#endif
+
+#if (!defined __have_siginfo_t \
+ && (defined _SIGNAL_H || defined __need_siginfo_t))
+# define __have_siginfo_t 1
+
+# define __SI_MAX_SIZE 128
+# if __WORDSIZE == 64
+# define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4)
+# else
+# define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 3)
+# endif
+
+typedef struct siginfo
+ {
+ int si_signo; /* Signal number. */
+ int si_errno; /* If non-zero, an errno value associated with
+ this signal, as defined in <errno.h>. */
+ int si_code; /* Signal code. */
+
+ union
+ {
+ int _pad[__SI_PAD_SIZE];
+
+ /* kill(). */
+ struct
+ {
+ __pid_t si_pid; /* Sending process ID. */
+ unsigned short __pad; /* 16-bit version of si_uid. */
+ __uid_t si_uid; /* Real user ID of sending process. */
+ } _kill;
+
+ /* POSIX.1b timers. */
+ struct
+ {
+ int si_tid; /* Timer ID. */
+ int si_overrun; /* Overrun count. */
+ sigval_t si_sigval; /* Signal value. */
+ } _timer;
+
+ /* POSIX.1b signals. */
+ struct
+ {
+ __pid_t si_pid; /* Sending process ID. */
+ unsigned short __pad; /* 16-bit version of si_uid. */
+ sigval_t si_sigval; /* Signal value. */
+ __uid_t si_uid; /* Real user ID of sending process. */
+ } _rt;
+
+ /* SIGCHLD. */
+ struct
+ {
+ __pid_t si_pid; /* Which child. */
+ unsigned short __pad; /* 16-bit version of si_uid. */
+ int si_status; /* Exit value or signal. */
+ __clock_t si_utime;
+ __clock_t si_stime;
+ __uid_t si_uid; /* Real user ID of sending process. */
+ } _sigchld;
+
+ /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */
+ struct
+ {
+ void *si_addr; /* Faulting insn/memory ref. */
+ } _sigfault;
+
+ /* SIGPOLL. */
+ struct
+ {
+ long int si_band; /* Band event for SIGPOLL. */
+ int si_fd;
+ } _sigpoll;
+ } _sifields;
+ } siginfo_t;
+
+
+/* X/Open requires some more fields with fixed names. */
+# define si_pid _sifields._kill.si_pid
+# define si_uid _sifields._kill.si_uid
+# define si_timerid _sifields._timer.si_tid
+# define si_overrun _sifields._timer.si_overrun
+# define si_status _sifields._sigchld.si_status
+# define si_utime _sifields._sigchld.si_utime
+# define si_stime _sifields._sigchld.si_stime
+# define si_value _sifields._rt.si_sigval
+# define si_int _sifields._rt.si_sigval.sival_int
+# define si_ptr _sifields._rt.si_sigval.sival_ptr
+# define si_addr _sifields._sigfault.si_addr
+# define si_band _sifields._sigpoll.si_band
+# define si_fd _sifields._sigpoll.si_fd
+
+
+/* Values for `si_code'. Positive values are reserved for kernel-generated
+ signals. */
+enum
+{
+ SI_ASYNCNL = -60, /* Sent by asynch name lookup completion. */
+# define SI_ASYNCNL SI_ASYNCNL
+ SI_TKILL = -6, /* Sent by tkill. */
+# define SI_TKILL SI_TKILL
+ SI_SIGIO, /* Sent by queued SIGIO. */
+# define SI_SIGIO SI_SIGIO
+ SI_ASYNCIO, /* Sent by AIO completion. */
+# define SI_ASYNCIO SI_ASYNCIO
+ SI_MESGQ, /* Sent by real time mesq state change. */
+# define SI_MESGQ SI_MESGQ
+ SI_TIMER, /* Sent by timer expiration. */
+# define SI_TIMER SI_TIMER
+ SI_QUEUE, /* Sent by sigqueue. */
+# define SI_QUEUE SI_QUEUE
+ SI_USER, /* Sent by kill, sigsend, raise. */
+# define SI_USER SI_USER
+ SI_KERNEL = 0x80 /* Send by kernel. */
+#define SI_KERNEL SI_KERNEL
+};
+
+
+/* `si_code' values for SIGILL signal. */
+enum
+{
+ ILL_ILLOPC = 1, /* Illegal opcode. */
+# define ILL_ILLOPC ILL_ILLOPC
+ ILL_ILLOPN, /* Illegal operand. */
+# define ILL_ILLOPN ILL_ILLOPN
+ ILL_ILLADR, /* Illegal addressing mode. */
+# define ILL_ILLADR ILL_ILLADR
+ ILL_ILLTRP, /* Illegal trap. */
+# define ILL_ILLTRP ILL_ILLTRP
+ ILL_PRVOPC, /* Privileged opcode. */
+# define ILL_PRVOPC ILL_PRVOPC
+ ILL_PRVREG, /* Privileged register. */
+# define ILL_PRVREG ILL_PRVREG
+ ILL_COPROC, /* Coprocessor error. */
+# define ILL_COPROC ILL_COPROC
+ ILL_BADSTK /* Internal stack error. */
+# define ILL_BADSTK ILL_BADSTK
+};
+
+/* `si_code' values for SIGFPE signal. */
+enum
+{
+ FPE_INTDIV = 1, /* Integer divide by zero. */
+# define FPE_INTDIV FPE_INTDIV
+ FPE_INTOVF, /* Integer overflow. */
+# define FPE_INTOVF FPE_INTOVF
+ FPE_FLTDIV, /* Floating point divide by zero. */
+# define FPE_FLTDIV FPE_FLTDIV
+ FPE_FLTOVF, /* Floating point overflow. */
+# define FPE_FLTOVF FPE_FLTOVF
+ FPE_FLTUND, /* Floating point underflow. */
+# define FPE_FLTUND FPE_FLTUND
+ FPE_FLTRES, /* Floating point inexact result. */
+# define FPE_FLTRES FPE_FLTRES
+ FPE_FLTINV, /* Floating point invalid operation. */
+# define FPE_FLTINV FPE_FLTINV
+ FPE_FLTSUB /* Subscript out of range. */
+# define FPE_FLTSUB FPE_FLTSUB
+};
+
+/* `si_code' values for SIGSEGV signal. */
+enum
+{
+ SEGV_MAPERR = 1, /* Address not mapped to object. */
+# define SEGV_MAPERR SEGV_MAPERR
+ SEGV_ACCERR /* Invalid permissions for mapped object. */
+# define SEGV_ACCERR SEGV_ACCERR
+};
+
+/* `si_code' values for SIGBUS signal. */
+enum
+{
+ BUS_ADRALN = 1, /* Invalid address alignment. */
+# define BUS_ADRALN BUS_ADRALN
+ BUS_ADRERR, /* Non-existant physical address. */
+# define BUS_ADRERR BUS_ADRERR
+ BUS_OBJERR /* Object specific hardware error. */
+# define BUS_OBJERR BUS_OBJERR
+};
+
+/* `si_code' values for SIGTRAP signal. */
+enum
+{
+ TRAP_BRKPT = 1, /* Process breakpoint. */
+# define TRAP_BRKPT TRAP_BRKPT
+ TRAP_TRACE /* Process trace trap. */
+# define TRAP_TRACE TRAP_TRACE
+};
+
+/* `si_code' values for SIGCHLD signal. */
+enum
+{
+ CLD_EXITED = 1, /* Child has exited. */
+# define CLD_EXITED CLD_EXITED
+ CLD_KILLED, /* Child was killed. */
+# define CLD_KILLED CLD_KILLED
+ CLD_DUMPED, /* Child terminated abnormally. */
+# define CLD_DUMPED CLD_DUMPED
+ CLD_TRAPPED, /* Traced child has trapped. */
+# define CLD_TRAPPED CLD_TRAPPED
+ CLD_STOPPED, /* Child has stopped. */
+# define CLD_STOPPED CLD_STOPPED
+ CLD_CONTINUED /* Stopped child has continued. */
+# define CLD_CONTINUED CLD_CONTINUED
+};
+
+/* `si_code' values for SIGPOLL signal. */
+enum
+{
+ POLL_IN = 1, /* Data input available. */
+# define POLL_IN POLL_IN
+ POLL_OUT, /* Output buffers available. */
+# define POLL_OUT POLL_OUT
+ POLL_MSG, /* Input message available. */
+# define POLL_MSG POLL_MSG
+ POLL_ERR, /* I/O error. */
+# define POLL_ERR POLL_ERR
+ POLL_PRI, /* High priority input available. */
+# define POLL_PRI POLL_PRI
+ POLL_HUP /* Device disconnected. */
+# define POLL_HUP POLL_HUP
+};
+
+# undef __need_siginfo_t
+#endif /* !have siginfo_t && (have _SIGNAL_H || need siginfo_t). */
+
+
+#if (defined _SIGNAL_H || defined __need_sigevent_t) \
+ && !defined __have_sigevent_t
+# define __have_sigevent_t 1
+
+/* Structure to transport application-defined values with signals. */
+# define __SIGEV_MAX_SIZE 64
+# if __WORDSIZE == 64
+# define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
+# else
+# define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
+# endif
+
+typedef struct sigevent
+ {
+ sigval_t sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+
+ union
+ {
+ int _pad[__SIGEV_PAD_SIZE];
+
+ /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
+ thread to receive the signal. */
+ __pid_t _tid;
+
+ struct
+ {
+ void (*_function) (sigval_t); /* Function to start. */
+ void *_attribute; /* Really pthread_attr_t. */
+ } _sigev_thread;
+ } _sigev_un;
+ } sigevent_t;
+
+/* POSIX names to access some of the members. */
+# define sigev_notify_function _sigev_un._sigev_thread._function
+# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
+
+/* `sigev_notify' values. */
+enum
+{
+ SIGEV_SIGNAL = 0, /* Notify via signal. */
+# define SIGEV_SIGNAL SIGEV_SIGNAL
+ SIGEV_NONE, /* Other notification: meaningless. */
+# define SIGEV_NONE SIGEV_NONE
+ SIGEV_THREAD, /* Deliver via thread creation. */
+# define SIGEV_THREAD SIGEV_THREAD
+
+ SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */
+#define SIGEV_THREAD_ID SIGEV_THREAD_ID
+};
+
+#endif /* have _SIGNAL_H. */
movel 16(%sp), -(%a1)
/* Do the system call */
- exg %d2, %a1 /* save %d2 and get stack pointer */
movel 12(%sp), %d1 /* get flags */
+#ifdef __mcoldfire__
+ movel %d2, -(%a1)
+ movel %d2, -(%sp)
+ movel %a1, %d2
+#else
+ exg %d2, %a1 /* save %d2 and get stack pointer */
+#endif
movel #SYS_ify (clone), %d0
trap #0
+#ifdef __mcoldfire__
+ movel (%sp)+, %d2
+#else
exg %d2, %a1 /* restore %d2 */
+#endif
tstl %d0
jmi SYSCALL_ERROR_LABEL
--- /dev/null
+# This file is generated from configure.in by Autoconf. DO NOT EDIT!
+ case $machine in
+m68k/coldfire)
+ arch_minimum_kernel=2.6.10
+ ;;
+esac
--- /dev/null
+sinclude(./aclocal.m4)dnl Autoconf lossage
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+case $machine in
+m68k/coldfire)
+ arch_minimum_kernel=2.6.10
+ ;;
+esac
--- /dev/null
+# File name Caller Syscall name Args Strong name Weak names
+
+oldgetrlimit EXTRA getrlimit i:ip __old_getrlimit getrlimit@GLIBC_2.0
+oldsetrlimit EXTRA setrlimit i:ip __old_setrlimit setrlimit@GLIBC_2.0
*/
+#ifndef __mcoldfire__
/* Linux saves only the call-clobbered registers in the sigcontext. We
need to use a trampoline that saves the rest so that the C code can
access them. We use the sc_fpstate field, since the handler is not
}
#define catch_segfault(a,b) \
__attribute_used__ real_catch_segfault(a,b)
+#endif
static void
hexvalue (unsigned long int value, char *buf, size_t len)
char fpregs[11][24];
struct iovec iov[63], *next_iov = iov;
unsigned long *p = (unsigned long *) ctx->sc_fpstate + 1;
+ unsigned long *pfp = (unsigned long *) ctx->sc_fpregs;
+ int i, j, fpreg_size;
#define ADD_STRING(str) \
next_iov->iov_base = (char *) (str); \
next_iov->iov_len = (len); \
++next_iov
+#ifdef __mcoldfire__
+ fpreg_size = 16;
+#else
+ fpreg_size = 24;
+#endif
+
/* Generate strings of register contents. */
hexvalue (ctx->sc_d0, regs[0], 8);
hexvalue (ctx->sc_d1, regs[1], 8);
+#ifdef __mcoldfire__
+ hexvalue (ctx->sc_d2, regs[2], 8);
+ hexvalue (ctx->sc_d3, regs[3], 8);
+ hexvalue (ctx->sc_d4, regs[4], 8);
+ hexvalue (ctx->sc_d5, regs[5], 8);
+ hexvalue (ctx->sc_d6, regs[6], 8);
+ hexvalue (ctx->sc_d7, regs[7], 8);
+#else
hexvalue (*p++, regs[2], 8);
hexvalue (*p++, regs[3], 8);
hexvalue (*p++, regs[4], 8);
hexvalue (*p++, regs[5], 8);
hexvalue (*p++, regs[6], 8);
hexvalue (*p++, regs[7], 8);
+#endif
hexvalue (ctx->sc_a0, regs[8], 8);
hexvalue (ctx->sc_a1, regs[9], 8);
+#ifdef __mcoldfire__
+ hexvalue (ctx->sc_a2, regs[10], 8);
+ hexvalue (ctx->sc_a3, regs[11], 8);
+ hexvalue (ctx->sc_a4, regs[12], 8);
+ hexvalue (ctx->sc_a5, regs[13], 8);
+ hexvalue (ctx->sc_a6, regs[14], 8);
+#else
hexvalue (*p++, regs[10], 8);
hexvalue (*p++, regs[11], 8);
hexvalue (*p++, regs[12], 8);
hexvalue (*p++, regs[13], 8);
hexvalue (*p++, regs[14], 8);
+#endif
hexvalue (ctx->sc_usp, regs[15], 8);
hexvalue (ctx->sc_pc, regs[16], 8);
hexvalue (ctx->sc_sr, regs[17], 4);
hexvalue (ctx->sc_mask, regs[18], 8);
hexvalue (ctx->sc_formatvec & 0xfff, regs[19], 4);
- hexvalue (ctx->sc_fpregs[0], fpregs[0], 8);
- hexvalue (ctx->sc_fpregs[1], fpregs[0] + 8, 8);
- hexvalue (ctx->sc_fpregs[2], fpregs[0] + 16, 8);
- hexvalue (ctx->sc_fpregs[3], fpregs[1], 8);
- hexvalue (ctx->sc_fpregs[4], fpregs[1] + 8, 8);
- hexvalue (ctx->sc_fpregs[5], fpregs[1] + 16, 8);
- hexvalue (*p++, fpregs[2], 8);
- hexvalue (*p++, fpregs[2] + 8, 8);
- hexvalue (*p++, fpregs[2] + 16, 8);
- hexvalue (*p++, fpregs[3], 8);
- hexvalue (*p++, fpregs[3] + 8, 8);
- hexvalue (*p++, fpregs[3] + 16, 8);
- hexvalue (*p++, fpregs[4], 8);
- hexvalue (*p++, fpregs[4] + 8, 8);
- hexvalue (*p++, fpregs[4] + 16, 8);
- hexvalue (*p++, fpregs[5], 8);
- hexvalue (*p++, fpregs[5] + 8, 8);
- hexvalue (*p++, fpregs[5] + 16, 8);
- hexvalue (*p++, fpregs[6], 8);
- hexvalue (*p++, fpregs[6] + 8, 8);
- hexvalue (*p++, fpregs[6] + 16, 8);
- hexvalue (*p++, fpregs[7], 8);
- hexvalue (*p++, fpregs[7] + 8, 8);
- hexvalue (*p++, fpregs[7] + 16, 8);
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < fpreg_size; j += 8)
+ hexvalue (*pfp++, fpregs[i] + j, 8);
+#ifdef __mcoldfire__
+ p = pfp;
+#endif
+ for (i = 2; i < 8; i++)
+ for (j = 0; j < fpreg_size; j += 8)
+ hexvalue (*p++, fpregs[i] + j, 8);
hexvalue (ctx->sc_fpcntl[0], fpregs[8], 8);
hexvalue (ctx->sc_fpcntl[1], fpregs[9], 8);
hexvalue (ctx->sc_fpcntl[2], fpregs[10], 8);
ADD_MEM (regs[19], 4);
ADD_STRING ("\n\n FP0: ");
- ADD_MEM (fpregs[0], 24);
+ ADD_MEM (fpregs[0], fpreg_size);
ADD_STRING (" FP1: ");
- ADD_MEM (fpregs[1], 24);
+ ADD_MEM (fpregs[1], fpreg_size);
ADD_STRING ("\n FP2: ");
- ADD_MEM (fpregs[2], 24);
+ ADD_MEM (fpregs[2], fpreg_size);
ADD_STRING (" FP3: ");
- ADD_MEM (fpregs[3], 24);
+ ADD_MEM (fpregs[3], fpreg_size);
ADD_STRING ("\n FP4: ");
- ADD_MEM (fpregs[4], 24);
+ ADD_MEM (fpregs[4], fpreg_size);
ADD_STRING (" FP5: ");
- ADD_MEM (fpregs[5], 24);
+ ADD_MEM (fpregs[5], fpreg_size);
ADD_STRING ("\n FP6: ");
- ADD_MEM (fpregs[6], 24);
+ ADD_MEM (fpregs[6], fpreg_size);
ADD_STRING (" FP7: ");
- ADD_MEM (fpregs[7], 24);
+ ADD_MEM (fpregs[7], fpreg_size);
ADD_STRING ("\n FPCR: ");
ADD_MEM (fpregs[8], 8);
ADD_STRING (" FPSR: ");
.globl __socket
ENTRY (__socket)
#if defined NEED_CANCELLATION && defined CENABLE
- SINGLE_THREAD_P
+ SINGLE_THREAD_P (%a0)
jne 1f
#endif
#define PT_SR PT_SR
PT_PC = 18,
#define PT_PC PT_PC
+
+#ifdef __mcoldfire__
+ PT_FP0 = 21,
+ PT_FP1 = 23,
+ PT_FP2 = 25,
+ PT_FP3 = 27,
+ PT_FP4 = 29,
+ PT_FP5 = 31,
+ PT_FP6 = 33,
+ PT_FP7 = 35,
+#else
PT_FP0 = 21,
-#define PT_FP0 PT_FP0
PT_FP1 = 24,
-#define PT_FP1 PT_FP1
PT_FP2 = 27,
-#define PT_FP2 PT_FP2
PT_FP3 = 30,
-#define PT_FP3 PT_FP3
PT_FP4 = 33,
-#define PT_FP4 PT_FP4
PT_FP5 = 36,
-#define PT_FP5 PT_FP5
PT_FP6 = 39,
-#define PT_FP6 PT_FP6
PT_FP7 = 42,
+#endif
+#define PT_FP0 PT_FP0
+#define PT_FP1 PT_FP1
+#define PT_FP2 PT_FP2
+#define PT_FP3 PT_FP3
+#define PT_FP4 PT_FP4
+#define PT_FP5 PT_FP5
+#define PT_FP6 PT_FP6
#define PT_FP7 PT_FP7
+
PT_FPCR = 45,
#define PT_FPCR PT_FPCR
PT_FPSR = 46,
/* Structure to describe FPU registers. */
typedef struct fpregset
{
- int f_fpregs[8][3];
int f_pcr;
int f_psr;
int f_fpiaddr;
+#ifdef __mcoldfire__
+ int f_fpregs[8][2];
+#else
+ int f_fpregs[8][3];
+#endif
} fpregset_t;
/* Context to describe whole processor state. */
/* Userlevel context. */
typedef struct ucontext
{
- unsigned long int uc_flags;
+ unsigned long uc_flags;
struct ucontext *uc_link;
- __sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
- long int uc_filler[174];
+ unsigned long uc_filler[80];
+ __sigset_t uc_sigmask;
} ucontext_t;
#endif /* sys/ucontext.h */
# File name Caller Syscall name Args Strong name Weak names
cacheflush EXTRA cacheflush i:iiii __cacheflush cacheflush
-oldgetrlimit EXTRA getrlimit i:ip __old_getrlimit getrlimit@GLIBC_2.0
-oldsetrlimit EXTRA setrlimit i:ip __old_setrlimit setrlimit@GLIBC_2.0
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#ifndef _LINUX_M68K_SYSDEP_H
+#define _LINUX_M68K_SYSDEP_H 1
+
#include <sysdeps/unix/sysdep.h>
#include <sysdeps/m68k/sysdep.h>
# if RTLD_PRIVATE_ERRNO
# define SYSCALL_ERROR_HANDLER \
SYSCALL_ERROR_LABEL: \
- lea (rtld_errno, %pc), %a0; \
+ PCREL_OP (lea, rtld_errno, %a0, %a0); \
neg.l %d0; \
move.l %d0, (%a0); \
move.l &-1, %d0; \
#define ASM_ARGS_6 ASM_ARGS_5, "a" (_a0)
#endif /* not __ASSEMBLER__ */
+#endif