about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/crypt-entry.c6
-rw-r--r--sysdeps/generic/crypt.h6
-rw-r--r--sysdeps/generic/dl-hash.h2
-rw-r--r--sysdeps/generic/hp-timing.h2
-rw-r--r--sysdeps/i386/i686/hp-timing.h2
-rw-r--r--sysdeps/i386/i686/mempcpy.S51
-rw-r--r--sysdeps/i386/i686/strtok.S1
-rw-r--r--sysdeps/mips/Dist6
-rw-r--r--sysdeps/mips/Makefile4
-rw-r--r--sysdeps/mips/fpregdef.h (renamed from sysdeps/unix/sysv/linux/mips/sys/fpregdef.h)13
-rw-r--r--sysdeps/mips/fpu_control.h4
-rw-r--r--sysdeps/mips/regdef.h (renamed from sysdeps/unix/sysv/linux/mips/sys/asm.h)17
-rw-r--r--sysdeps/mips/sgidefs.h (renamed from sysdeps/unix/sysv/linux/mips/sgidefs.h)24
-rw-r--r--sysdeps/mips/sys/asm.h377
-rw-r--r--sysdeps/mips/sys/fpregdef.h61
-rw-r--r--sysdeps/powerpc/dl-machine.c24
-rw-r--r--sysdeps/powerpc/fclrexcpt.c4
-rw-r--r--sysdeps/powerpc/fesetround.c2
-rw-r--r--sysdeps/powerpc/feupdateenv.c2
-rw-r--r--sysdeps/powerpc/fraiseexcpt.c4
-rw-r--r--sysdeps/powerpc/fsetexcptflg.c6
-rw-r--r--sysdeps/powerpc/s_rint.c22
-rw-r--r--sysdeps/powerpc/s_rintf.c24
-rw-r--r--sysdeps/powerpc/w_sqrt.c6
-rw-r--r--sysdeps/powerpc/w_sqrtf.c6
-rw-r--r--sysdeps/unix/sysv/linux/mips/Dist6
-rw-r--r--sysdeps/unix/sysv/linux/mips/Makefile3
-rw-r--r--sysdeps/unix/sysv/linux/mips/bits/sigaction.h29
-rw-r--r--sysdeps/unix/sysv/linux/mips/fpregdef.h1
-rw-r--r--sysdeps/unix/sysv/linux/mips/regdef.h1
-rw-r--r--sysdeps/unix/sysv/linux/mips/syscalls.list7
-rw-r--r--sysdeps/unix/sysv/linux/mips/sysdep.S (renamed from sysdeps/unix/sysv/linux/mips/sys/regdef.h)27
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c2
33 files changed, 642 insertions, 110 deletions
diff --git a/sysdeps/generic/crypt-entry.c b/sysdeps/generic/crypt-entry.c
index e6c2554019..8248ed9ba3 100644
--- a/sysdeps/generic/crypt-entry.c
+++ b/sysdeps/generic/crypt-entry.c
@@ -1,5 +1,5 @@
 /* Wrapper around MD5 sum replacement for crypt function.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -34,6 +34,8 @@ extern char *__md5_crypt_r (const char *key, const char *salt, char *buffer,
 			    int buflen);
 extern char *__md5_crypt (const char *key, const char *salt);
 
+extern char *__crypt_r (const char *key, const char *salt,
+			struct crypt_data *__restrict data);
 
 /* We recognize an intended call of the MD5 crypt replacement function
    by the first 3 characters of the salt string.  If they match the
@@ -42,7 +44,7 @@ char *
 __crypt_r (key, salt, data)
      const char *key;
      const char *salt;
-     struct crypt_data *data;
+     struct crypt_data *__restrict data;
 {
   if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
     return __md5_crypt_r (key, salt, (char *) data,
diff --git a/sysdeps/generic/crypt.h b/sysdeps/generic/crypt.h
index c14554c829..0713e950ba 100644
--- a/sysdeps/generic/crypt.h
+++ b/sysdeps/generic/crypt.h
@@ -1,7 +1,7 @@
 /*
  * UFC-crypt: ultra fast crypt(3) implementation
  *
- * Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
+ * Copyright (C) 1991, 92, 93, 96, 97, 98 Free Software Foundation, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -50,10 +50,8 @@ struct crypt_data
     int direction, initialized;
   };
 
-extern char *__crypt_r __P ((__const char *__key, __const char *__salt,
-			     struct crypt_data *__data));
 extern char *crypt_r __P ((__const char *__key, __const char *__salt,
-			   struct crypt_data *__data));
+			   struct crypt_data *__restrict __data));
 #endif
 
 __END_DECLS
diff --git a/sysdeps/generic/dl-hash.h b/sysdeps/generic/dl-hash.h
index fc17793324..c3b8aa62b3 100644
--- a/sysdeps/generic/dl-hash.h
+++ b/sysdeps/generic/dl-hash.h
@@ -1,4 +1,4 @@
-/* Compute hash alue for given string according to ELF standard.
+/* Compute hash value for given string according to ELF standard.
    Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/generic/hp-timing.h b/sysdeps/generic/hp-timing.h
index 7795f510d5..35f3291e63 100644
--- a/sysdeps/generic/hp-timing.h
+++ b/sysdeps/generic/hp-timing.h
@@ -1,4 +1,4 @@
-/* High precision, low overhead timing functions.  i686 version.
+/* High precision, low overhead timing functions.  Generic version.
    Copyright (C) 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
diff --git a/sysdeps/i386/i686/hp-timing.h b/sysdeps/i386/i686/hp-timing.h
index ffbeb277e5..004cfff77f 100644
--- a/sysdeps/i386/i686/hp-timing.h
+++ b/sysdeps/i386/i686/hp-timing.h
@@ -84,7 +84,7 @@
 /* We use 64bit values for the times.  */
 typedef unsigned long long int hp_timing_t;
 
-/* Internal variabled used to store the overhead of the measurement
+/* Internal variable used to store the overhead of the measurement
    opcodes.  */
 extern hp_timing_t __libc_hp_timing_overhead;
 
diff --git a/sysdeps/i386/i686/mempcpy.S b/sysdeps/i386/i686/mempcpy.S
new file mode 100644
index 0000000000..5760d9f940
--- /dev/null
+++ b/sysdeps/i386/i686/mempcpy.S
@@ -0,0 +1,51 @@
+/* Copy memory block and return pointer to following byte.
+   For Intel 80x86, x>=6.
+   This file is part of the GNU C Library.
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+#include "asm-syntax.h"
+
+/* strtok:
+	INPUT PARAMETER:
+	dest		(sp + 4)
+	src		(sp + 8)
+	len		(sp + 12)
+*/
+
+ENTRY(__mempcpy)
+	movl	%edi, %eax
+	movl	4(%esp), %edi
+	movl	%esi, %edx
+	movl	8(%esp), %esi
+	movl	12(%esp), %ecx
+	cld
+	shrl	$1, %ecx
+	jnc	1f
+	movsb
+1:	shrl	$1, %ecx
+	jnc	2f
+	movsw
+2:	rep
+	movsl
+	xchgl	%edi, %eax
+	movl	%edx, %esi
+	ret
+END(mempcpy)
+weak_alias (__mempcpy, mempcpy)
diff --git a/sysdeps/i386/i686/strtok.S b/sysdeps/i386/i686/strtok.S
index c7a058eb41..18aa7c8c7b 100644
--- a/sysdeps/i386/i686/strtok.S
+++ b/sysdeps/i386/i686/strtok.S
@@ -73,6 +73,7 @@ ENTRY (FUNCTION)
 	movl $64, %ecx
 	movl %esp, %edi
 	xorl %eax, %eax
+	cld
 	rep
 	stosl
 
diff --git a/sysdeps/mips/Dist b/sysdeps/mips/Dist
index 9b6fd71f01..7ccfb1bfe6 100644
--- a/sysdeps/mips/Dist
+++ b/sysdeps/mips/Dist
@@ -1,3 +1,9 @@
 setjmp_aux.c
 rtld-ldscript.in
 rtld-parms
+regdef.h
+sgidefs.h
+fpregdef.h
+sys/regdef.h
+sys/fpregdef.h
+sys/asm.h
diff --git a/sysdeps/mips/Makefile b/sysdeps/mips/Makefile
index 5585c61f03..54b3520c84 100644
--- a/sysdeps/mips/Makefile
+++ b/sysdeps/mips/Makefile
@@ -1,3 +1,7 @@
+ifeq ($(subdir),misc)
+headers += regdef.h fpregdef.h sys/regdef.h sys/fpregdef.h sys/asm.h sgidefs.h
+endif
+
 ifeq ($(subdir),setjmp)
 sysdep_routines += setjmp_aux
 endif
diff --git a/sysdeps/unix/sysv/linux/mips/sys/fpregdef.h b/sysdeps/mips/fpregdef.h
index 48d8f7513e..25b93cade4 100644
--- a/sysdeps/unix/sysv/linux/mips/sys/fpregdef.h
+++ b/sysdeps/mips/fpregdef.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,12 +16,9 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#ifndef _SYS_FPREGDEF_H
-#define _SYS_FPREGDEF_H
+#ifndef _FPREGDEF_H
+#define _FPREGDEF_H
 
-/*
- * The real definitions come from the Linux kernel sources
- */
-#include <asm/fpregdef.h>
+#include <sys/fpregdef.h>
 
-#endif /* sys/fpregdef.h */
+#endif /* _FPREGDEF_H */
diff --git a/sysdeps/mips/fpu_control.h b/sysdeps/mips/fpu_control.h
index e271ae1fcc..471c68e413 100644
--- a/sysdeps/mips/fpu_control.h
+++ b/sysdeps/mips/fpu_control.h
@@ -1,5 +1,5 @@
 /* FPU control word bits.  Mips version.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Olaf Flebbe and Ralf Baechle.
 
@@ -80,7 +80,7 @@
 /* The fdlibm code requires strict IEEE double precision arithmetic,
    and no interrupts for exceptions, rounding to nearest.  */
 
-#define _FPU_DEFAULT  0x00000600
+#define _FPU_DEFAULT  0x00000000
 
 /* IEEE:  same as above, but exceptions */
 #define _FPU_IEEE     0x00000F80
diff --git a/sysdeps/unix/sysv/linux/mips/sys/asm.h b/sysdeps/mips/regdef.h
index 346a9c4ec2..0fa50f0926 100644
--- a/sysdeps/unix/sysv/linux/mips/sys/asm.h
+++ b/sysdeps/mips/regdef.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>.
+   Contributed by Ralf Baechle <ralf@gnu.org>.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -17,12 +17,11 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#ifndef _SYS_ASM_H
-#define _SYS_ASM_H
+#ifndef _REGDEF_H
+#define _REGDEF_H
 
-/*
- * The real definitions come from the Linux kernel sources
- */
-#include <asm/asm.h>
+#include <sys/regdef.h>
+#include <sys/fpregdef.h>
+
+#endif /* _REGDEF_H */
 
-#endif /* sys/asm.h */
diff --git a/sysdeps/unix/sysv/linux/mips/sgidefs.h b/sysdeps/mips/sgidefs.h
index a36ece0175..56567e884e 100644
--- a/sysdeps/unix/sysv/linux/mips/sgidefs.h
+++ b/sysdeps/mips/sgidefs.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>.
+   Contributed by Ralf Baechle <ralf@gnu.org>.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -21,8 +21,24 @@
 #define _SGIDEFS_H	1
 
 /*
- * The real definitions come from the Linux kernel sources
+ * Definitions for the ISA level
  */
-#include <asm/sgidefs.h>
+#define _MIPS_ISA_MIPS1 1
+#define _MIPS_ISA_MIPS2 2
+#define _MIPS_ISA_MIPS3 3
+#define _MIPS_ISA_MIPS4 4
+#define _MIPS_ISA_MIPS5 5
+
+/*
+ * Subprogram calling convention
+ *
+ * At the moment only _MIPS_SIM_ABI32 is in use.  This will change rsn.
+ * Until GCC 2.8.0 is released don't rely on this definitions because the
+ * 64bit code is essentially using the 32bit interface model just with
+ * 64bit registers.
+ */
+#define _MIPS_SIM_ABI32		1
+#define _MIPS_SIM_NABI32	2
+#define _MIPS_SIM_ABI64		3
 
 #endif /* sgidefs.h */
diff --git a/sysdeps/mips/sys/asm.h b/sysdeps/mips/sys/asm.h
new file mode 100644
index 0000000000..b90a331ab7
--- /dev/null
+++ b/sysdeps/mips/sys/asm.h
@@ -0,0 +1,377 @@
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ralf Baechle <ralf@gnu.org>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_ASM_H
+#define _SYS_ASM_H
+
+#include <sgidefs.h>
+
+#ifndef CAT
+#ifdef __STDC__
+#define __CAT(str1,str2) str1##str2
+#else
+#define __CAT(str1,str2) str1/**/str2
+#endif
+#define CAT(str1,str2) __CAT(str1,str2)
+#endif
+
+/*
+ * Macros to handle different pointer/register sizes for 32/64-bit code
+ *
+ * 64 bit address space isn't used yet, so we may use the R3000 32 bit
+ * defines for now.
+ */
+#define PTR	.word
+#define PTRSIZE	4
+#define PTRLOG	2
+
+/*
+ * PIC specific declarations
+ */
+#ifdef __PIC__
+#define CPRESTORE(register)                             \
+		.cprestore register
+#define CPADD(register)                                 \
+		.cpadd	register
+#define CPLOAD(register)                                \
+		.cpload	register
+#else
+#define CPRESTORE(register)
+#define CPADD(register)
+#define CPLOAD(register)
+#endif
+
+/*
+ * LEAF - declare leaf routine
+ */
+#define	LEAF(symbol)                                    \
+		.globl	symbol;                         \
+		.align	2;                              \
+		.type	symbol,@function;               \
+		.ent	symbol,0;                       \
+symbol:		.frame	sp,0,ra
+
+/*
+ * NESTED - declare nested routine entry point
+ */
+#define	NESTED(symbol, framesize, rpc)                  \
+		.globl	symbol;                         \
+		.align	2;                              \
+		.type	symbol,@function;               \
+		.ent	symbol,0;                       \
+symbol:		.frame	sp, framesize, rpc
+
+/*
+ * END - mark end of function
+ */
+#define	END(function)                                   \
+		.end	function;		        \
+		.size	function,.-function
+
+/*
+ * EXPORT - export definition of symbol
+ */
+#define	EXPORT(symbol)                                  \
+		.globl	symbol;                         \
+symbol:
+
+/*
+ * ABS - export absolute symbol
+ */
+#define	ABS(symbol,value)                               \
+		.globl	symbol;                         \
+symbol		=	value
+
+#define	PANIC(msg)                                      \
+		.set	push;				\
+		.set	reorder;                        \
+		la	a0,8f;                          \
+		jal	panic;                          \
+9:		b	9b;                             \
+		.set	pop;				\
+		TEXT(msg)
+
+/*
+ * Print formated string
+ */
+#define PRINT(string)                                   \
+		.set	push;				\
+		.set	reorder;                        \
+		la	a0,8f;                          \
+		jal	printk;                         \
+		.set	pop;				\
+		TEXT(string)
+
+#define	TEXT(msg)                                       \
+		.data;                                  \
+8:		.asciiz	msg;                            \
+		.previous;
+
+/*
+ * Build text tables
+ */
+#define TTABLE(string)                                  \
+		.text;                                  \
+		.word	1f;                             \
+		.previous;                              \
+		.data;                                  \
+1:		.asciz	string;                         \
+		.previous
+
+/*
+ * MIPS IV pref instruction.
+ * Use with .set noreorder only!
+ *
+ * MIPS IV implementations are free to treat this as a nop.  The R5000
+ * is one of them.  So we should have an option not to use this instruction.
+ */
+#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5)
+#define PREF(hint,addr)                                 \
+		pref	hint,addr
+#define PREFX(hint,addr)                                \
+		prefx	hint,addr
+#else
+#define PREF
+#define PREFX
+#endif
+
+/*
+ * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
+ */
+#if _MIPS_ISA == _MIPS_ISA_MIPS1
+#define MOVN(rd,rs,rt)                                  \
+		.set	push;				\
+		.set	reorder;			\
+		beqz	rt,9f;                          \
+		move	rd,rs;                          \
+		.set	pop;				\
+9:
+#define MOVZ(rd,rs,rt)                                  \
+		.set	push;				\
+		.set	reorder;			\
+		bnez	rt,9f;                          \
+		move	rd,rt;                          \
+		.set	pop;				\
+9:
+#endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
+#if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
+#define MOVN(rd,rs,rt)                                  \
+		.set	push;				\
+		.set	noreorder;			\
+		bnezl	rt,9f;                          \
+		move	rd,rs;                          \
+		.set	pop;				\
+9:
+#define MOVZ(rd,rs,rt)                                  \
+		.set	push;				\
+		.set	noreorder;			\
+		beqzl	rt,9f;                          \
+		movz	rd,rs;                          \
+		.set	pop;				\
+9:
+#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
+#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5)
+#define MOVN(rd,rs,rt)                                  \
+		movn	rd,rs,rt
+#define MOVZ(rd,rs,rt)                                  \
+		movz	rd,rs,rt
+#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) */
+
+/*
+ * Stack alignment
+ */
+#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
+#define ALSZ	7
+#define ALMASK	~7
+#endif
+#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
+    (_MIPS_ISA == _MIPS_ISA_MIPS5)
+#define ALSZ	15
+#define ALMASK	~15
+#endif
+
+/*
+ * Size of a register
+ */
+#ifdef __mips64
+#define SZREG	8
+#else
+#define SZREG	4
+#endif
+
+/*
+ * Use the following macros in assemblercode to load/store registers,
+ * pointers etc.
+ */
+#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
+#define REG_S sw
+#define REG_L lw
+#define PTR_SUBU subu
+#define PTR_ADDU addu
+#endif
+#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
+    (_MIPS_ISA == _MIPS_ISA_MIPS5)
+#define REG_S sd
+#define REG_L ld
+/* We still live in a 32 bit address space ...  */
+#define PTR_SUBU subu
+#define PTR_ADDU addu
+#endif
+
+/*
+ * How to add/sub/load/store/shift C int variables.
+ */
+#if (_MIPS_SZINT == 32)
+#define INT_ADD	add
+#define INT_ADDI	addi
+#define INT_ADDU	addu
+#define INT_ADDIU	addiu
+#define INT_SUB	add
+#define INT_SUBI	subi
+#define INT_SUBU	subu
+#define INT_SUBIU	subu
+#define INT_L		lw
+#define INT_S		sw
+#define LONG_SLL	sll
+#define LONG_SLLV	sllv
+#define LONG_SRL	srl
+#define LONG_SRLV	srlv
+#define LONG_SRA	sra
+#define LONG_SRAV	srav
+#endif
+
+#if (_MIPS_SZINT == 64)
+#define INT_ADD	dadd
+#define INT_ADDI	daddi
+#define INT_ADDU	daddu
+#define INT_ADDIU	daddiu
+#define INT_SUB	dadd
+#define INT_SUBI	dsubi
+#define INT_SUBU	dsubu
+#define INT_SUBIU	dsubu
+#define INT_L		ld
+#define INT_S		sd
+#define LONG_SLL	dsll
+#define LONG_SLLV	dsllv
+#define LONG_SRL	dsrl
+#define LONG_SRLV	dsrlv
+#define LONG_SRA	dsra
+#define LONG_SRAV	dsrav
+#endif
+
+/*
+ * How to add/sub/load/store/shift C long variables.
+ */
+#if (_MIPS_SZLONG == 32)
+#define LONG_ADD	add
+#define LONG_ADDI	addi
+#define LONG_ADDU	addu
+#define LONG_ADDIU	addiu
+#define LONG_SUB	add
+#define LONG_SUBI	subi
+#define LONG_SUBU	subu
+#define LONG_SUBIU	subu
+#define LONG_L		lw
+#define LONG_S		sw
+#define LONG_SLL	sll
+#define LONG_SLLV	sllv
+#define LONG_SRL	srl
+#define LONG_SRLV	srlv
+#define LONG_SRA	sra
+#define LONG_SRAV	srav
+#endif
+
+#if (_MIPS_SZLONG == 64)
+#define LONG_ADD	dadd
+#define LONG_ADDI	daddi
+#define LONG_ADDU	daddu
+#define LONG_ADDIU	daddiu
+#define LONG_SUB	dadd
+#define LONG_SUBI	dsubi
+#define LONG_SUBU	dsubu
+#define LONG_SUBIU	dsubu
+#define LONG_L		ld
+#define LONG_S		sd
+#define LONG_SLL	dsll
+#define LONG_SLLV	dsllv
+#define LONG_SRL	dsrl
+#define LONG_SRLV	dsrlv
+#define LONG_SRA	dsra
+#define LONG_SRAV	dsrav
+#endif
+
+/*
+ * How to add/sub/load/store/shift pointers.
+ */
+#if (_MIPS_SZLONG == 32)
+#define PTR_ADD	add
+#define PTR_ADDI	addi
+#define PTR_ADDU	addu
+#define PTR_ADDIU	addiu
+#define PTR_SUB		add
+#define PTR_SUBI	subi
+#define PTR_SUBU	subu
+#define PTR_SUBIU	subu
+#define PTR_L		lw
+#define PTR_S		sw
+#define PTR_SLL		sll
+#define PTR_SLLV	sllv
+#define PTR_SRL		srl
+#define PTR_SRLV	srlv
+#define PTR_SRA		sra
+#define PTR_SRAV	srav
+
+#define PTR_SCALESHIFT	2
+#endif
+
+#if (_MIPS_SZLONG == 64)
+#define PTR_ADD	dadd
+#define PTR_ADDI	daddi
+#define PTR_ADDU	daddu
+#define PTR_ADDIU	daddiu
+#define PTR_SUB		dadd
+#define PTR_SUBI	dsubi
+#define PTR_SUBU	dsubu
+#define PTR_SUBIU	dsubu
+#define PTR_L		ld
+#define PTR_S		sd
+#define PTR_SLL		dsll
+#define PTR_SLLV	dsllv
+#define PTR_SRL		dsrl
+#define PTR_SRLV	dsrlv
+#define PTR_SRA		dsra
+#define PTR_SRAV	dsrav
+
+#define PTR_SCALESHIFT	3
+#endif
+
+/*
+ * Some cp0 registers were extended to 64bit for MIPS III.
+ */
+#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
+#define MFC0	mfc0
+#define MTC0	mtc0
+#endif
+#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
+    (_MIPS_ISA == _MIPS_ISA_MIPS5)
+#define MFC0	dmfc0
+#define MTC0	dmtc0
+#endif
+
+#endif /* sys/asm.h */
diff --git a/sysdeps/mips/sys/fpregdef.h b/sysdeps/mips/sys/fpregdef.h
new file mode 100644
index 0000000000..ef7309c454
--- /dev/null
+++ b/sysdeps/mips/sys/fpregdef.h
@@ -0,0 +1,61 @@
+/* Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_FPREGDEF_H
+#define _SYS_FPREGDEF_H
+
+/*
+ * These definitions only cover the R3000-ish 16/32 register model.
+ * But we're trying to be R3000 friendly anyway ...
+ */
+#define fv0	$f0      /* return value */
+#define fv0f	$f1
+#define fv1	$f2
+#define fv1f	$f3
+#define fa0	$f12     /* argument registers */
+#define fa0f	$f13
+#define fa1	$f14
+#define fa1f	$f15
+#define ft0	$f4      /* caller saved */
+#define ft0f	$f5
+#define ft1	$f6
+#define ft1f	$f7
+#define ft2	$f8
+#define ft2f	$f9
+#define ft3	$f10
+#define ft3f	$f11
+#define ft4	$f16
+#define ft4f	$f17
+#define ft5	$f18
+#define ft5f	$f19
+#define fs0	$f20     /* callee saved */
+#define fs0f	$f21
+#define fs1	$f22
+#define fs1f	$f23
+#define fs2	$f24
+#define fs2f	$f25
+#define fs3	$f26
+#define fs3f	$f27
+#define fs4	$f28
+#define fs4f	$f29
+#define fs5	$f30
+#define fs5f	$f31
+
+#define fcr31	$31      /* FPU status register */
+
+#endif /* sys/fpregdef.h */
diff --git a/sysdeps/powerpc/dl-machine.c b/sysdeps/powerpc/dl-machine.c
index 4b6205ceda..7d45e74d65 100644
--- a/sysdeps/powerpc/dl-machine.c
+++ b/sysdeps/powerpc/dl-machine.c
@@ -45,16 +45,16 @@
 #define PLT_DATA_START_WORDS(num_entries) PLT_ENTRY_START_WORDS(num_entries)
 
 #define OPCODE_ADDI(rd,ra,simm) \
-  (0x38000000 | (rd) << 21 | (ra) << 16 | (simm) & 0xffff)
+  (0x38000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff))
 #define OPCODE_ADDIS(rd,ra,simm) \
-  (0x3c000000 | (rd) << 21 | (ra) << 16 | (simm) & 0xffff)
+  (0x3c000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff))
 #define OPCODE_ADD(rd,ra,rb) \
   (0x7c000214 | (rd) << 21 | (ra) << 16 | (rb) << 11)
-#define OPCODE_B(target) (0x48000000 | (target) & 0x03fffffc)
-#define OPCODE_BA(target) (0x48000002 | (target) & 0x03fffffc)
+#define OPCODE_B(target) (0x48000000 | ((target) & 0x03fffffc))
+#define OPCODE_BA(target) (0x48000002 | ((target) & 0x03fffffc))
 #define OPCODE_BCTR() 0x4e800420
 #define OPCODE_LWZ(rd,d,ra) \
-  (0x80000000 | (rd) << 21 | (ra) << 16 | (d) & 0xffff)
+  (0x80000000 | (rd) << 21 | (ra) << 16 | ((d) & 0xffff))
 #define OPCODE_MTCTR(rd) (0x7C0903A6 | (rd) << 21)
 #define OPCODE_RLWINM(ra,rs,sh,mb,me) \
   (0x54000000 | (rs) << 21 | (ra) << 16 | (sh) << 11 | (mb) << 6 | (me) << 1)
@@ -305,7 +305,7 @@ __elf_machine_fixup_plt(struct link_map *map, const Elf32_Rela *reloc,
 	     updating a lazy PLT entry).  */
 
 	  reloc_addr[0] = OPCODE_LI (11, finaladdr);
-	  reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
+	  reloc_addr[1] = OPCODE_ADDIS (11, 11, (finaladdr + 0x8000) >> 16);
 	  reloc_addr[2] = OPCODE_MTCTR (11);
 	  reloc_addr[3] = OPCODE_BCTR ();
 	}
@@ -355,7 +355,7 @@ __process_machine_rela (struct link_map *map,
 	  _dl_signal_error(0, map->l_name,
 			   "R_PPC_ADDR24 relocation out of range");
 	}
-      *reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
+      *reloc_addr = (*reloc_addr & 0xfc000003) | (finaladdr & 0x3fffffc);
       break;
 
     case R_PPC_ADDR16:
@@ -388,11 +388,11 @@ __process_machine_rela (struct link_map *map,
 	  _dl_signal_error(0, map->l_name,
 			   "R_PPC_ADDR14 relocation out of range");
 	}
-      *reloc_addr = *reloc_addr & 0xffff0003 | finaladdr & 0xfffc;
+      *reloc_addr = (*reloc_addr & 0xffff0003) | (finaladdr & 0xfffc);
       if (rinfo != R_PPC_ADDR14)
-	*reloc_addr = (*reloc_addr & 0xffdfffff
-		       | (rinfo == R_PPC_ADDR14_BRTAKEN
-			  ^ finaladdr >> 31) << 21);
+	*reloc_addr = ((*reloc_addr & 0xffdfffff)
+		       | ((rinfo == R_PPC_ADDR14_BRTAKEN)
+			  ^ (finaladdr >> 31)) << 21);
       break;
 
     case R_PPC_REL24:
@@ -403,7 +403,7 @@ __process_machine_rela (struct link_map *map,
 	    _dl_signal_error(0, map->l_name,
 			     "R_PPC_REL24 relocation out of range");
 	  }
-	*reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
+	*reloc_addr = (*reloc_addr & 0xfc000003) | (delta & 0x3fffffc);
       }
       break;
 
diff --git a/sysdeps/powerpc/fclrexcpt.c b/sysdeps/powerpc/fclrexcpt.c
index cfcf175637..47254fd384 100644
--- a/sysdeps/powerpc/fclrexcpt.c
+++ b/sysdeps/powerpc/fclrexcpt.c
@@ -29,8 +29,8 @@ feclearexcept (int excepts)
   u.fenv = fegetenv_register ();
 
   /* Clear the relevant bits.  */
-  u.l[1] = u.l[1] & ~(-((excepts) >> 31-FPSCR_VX & 1) & FE_ALL_INVALID
-		      | (excepts) & FPSCR_STICKY_BITS);
+  u.l[1] = u.l[1] & ~((-((excepts) >> (31-FPSCR_VX) & 1) & FE_ALL_INVALID)
+		      | ((excepts) & FPSCR_STICKY_BITS));
 
   /* Put the new state in effect.  */
   fesetenv_register (u.fenv);
diff --git a/sysdeps/powerpc/fesetround.c b/sysdeps/powerpc/fesetround.c
index 0afd6ceaa5..875c89768a 100644
--- a/sysdeps/powerpc/fesetround.c
+++ b/sysdeps/powerpc/fesetround.c
@@ -32,7 +32,7 @@ fesetround (int round)
   u.fenv = fegetenv_register ();
 
   /* Set the relevant bits.  */
-  u.l[1] = u.l[1] & ~3  |  round & 3;
+  u.l[1] = (u.l[1] & ~3)  |  (round & 3);
 
   /* Put the new state in effect.  */
   fesetenv_register (u.fenv);
diff --git a/sysdeps/powerpc/feupdateenv.c b/sysdeps/powerpc/feupdateenv.c
index b3a3f95ac3..14fa6bbe4e 100644
--- a/sysdeps/powerpc/feupdateenv.c
+++ b/sysdeps/powerpc/feupdateenv.c
@@ -30,7 +30,7 @@ feupdateenv (const fenv_t *envp)
   old.fenv = fegetenv_register ();
 
   /* Copy the set exceptions from `old' to `new'.  */
-  new.l[1] = new.l[1] & 0xE00000FF | old.l[1] & 0x1FFFFF00;
+  new.l[1] = (new.l[1] & 0xE00000FF) | (old.l[1] & 0x1FFFFF00);
 
   /* Atomically enable and raise (if appropriate) exceptions set in `new'. */
   fesetenv_register (new.fenv);
diff --git a/sysdeps/powerpc/fraiseexcpt.c b/sysdeps/powerpc/fraiseexcpt.c
index d0c7971836..39e3fbd6bf 100644
--- a/sysdeps/powerpc/fraiseexcpt.c
+++ b/sysdeps/powerpc/fraiseexcpt.c
@@ -35,9 +35,9 @@ feraiseexcept (int excepts)
 
   /* Add the exceptions */
   u.l[1] = (u.l[1]
-	    | excepts & FPSCR_STICKY_BITS
+	    | (excepts & FPSCR_STICKY_BITS)
 	    /* Turn FE_INVALID into FE_INVALID_SOFTWARE.  */
-	    | (excepts >> (31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)
+	    | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
 	       & FE_INVALID_SOFTWARE));
 
   /* Store the new status word (along with the rest of the environment),
diff --git a/sysdeps/powerpc/fsetexcptflg.c b/sysdeps/powerpc/fsetexcptflg.c
index b762552dbf..347035e9d2 100644
--- a/sysdeps/powerpc/fsetexcptflg.c
+++ b/sysdeps/powerpc/fsetexcptflg.c
@@ -32,9 +32,9 @@ fesetexceptflag (const fexcept_t *flagp, int excepts)
   flag = *flagp & excepts;
 
   /* Replace the exception status */
-  u.l[1] = (u.l[1] & ~(FPSCR_STICKY_BITS & excepts)
-	    | flag & FPSCR_STICKY_BITS
-	    | (flag >> (31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)
+  u.l[1] = ((u.l[1] & ~(FPSCR_STICKY_BITS & excepts))
+	    | (flag & FPSCR_STICKY_BITS)
+	    | (flag >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
 	       & FE_INVALID_SOFTWARE));
 
   /* Store the new status word (along with the rest of the environment).
diff --git a/sysdeps/powerpc/s_rint.c b/sysdeps/powerpc/s_rint.c
index d6d1dd2f76..a475875a97 100644
--- a/sysdeps/powerpc/s_rint.c
+++ b/sysdeps/powerpc/s_rint.c
@@ -25,16 +25,18 @@ __rint (double x)
   static const float TWO52 = 4503599627370496.0;
 
   if (fabs (x) < TWO52)
-    if (x > 0.0)
-      {
-	x += TWO52;
-	x -= TWO52;
-      }
-    else if (x < 0.0)
-      {
-	x -= TWO52;
-	x += TWO52;
-      }
+    {
+      if (x > 0.0)
+	{
+	  x += TWO52;
+	  x -= TWO52;
+	}
+      else if (x < 0.0)
+	{
+	  x -= TWO52;
+	  x += TWO52;
+	}
+    }
 
   return x;
 }
diff --git a/sysdeps/powerpc/s_rintf.c b/sysdeps/powerpc/s_rintf.c
index b95c0540bf..dde40bb3e5 100644
--- a/sysdeps/powerpc/s_rintf.c
+++ b/sysdeps/powerpc/s_rintf.c
@@ -25,17 +25,19 @@ __rintf (float x)
   static const float TWO23 = 8388608.0;
 
   if (fabsf (x) < TWO23)
-    if (x > 0.0)
-      {
-	x += TWO23;
-	x -= TWO23;
-      }
-    else if (x < 0.0)
-      {
-	x -= TWO23;
-	x += TWO23;
-      }
-
+    {
+      if (x > 0.0)
+	{
+	  x += TWO23;
+	  x -= TWO23;
+	}
+      else if (x < 0.0)
+	{
+	  x -= TWO23;
+	  x += TWO23;
+	}
+    }
+  
   return x;
 }
 weak_alias (__rintf, rintf)
diff --git a/sysdeps/powerpc/w_sqrt.c b/sysdeps/powerpc/w_sqrt.c
index df80973f58..c42ace503b 100644
--- a/sysdeps/powerpc/w_sqrt.c
+++ b/sysdeps/powerpc/w_sqrt.c
@@ -74,9 +74,9 @@ __sqrt(double x)
 	  fe = fegetenv_register();
 	  EXTRACT_WORDS (xi0,xi1,x);
 	  relax_fenv_state();
-	  sxi = xi0 & 0x3fffffff | 0x3fe00000;
+	  sxi = (xi0 & 0x3fffffff) | 0x3fe00000;
 	  INSERT_WORDS (sx, sxi, xi1);
-	  t_sqrt = __t_sqrt + (xi0 >> 52-32-8-1  & 0x3fe);
+	  t_sqrt = __t_sqrt + (xi0 >> (52-32-8-1)  & 0x3fe);
 	  sg = t_sqrt[0];
 	  sy = t_sqrt[1];
 	  
@@ -84,7 +84,7 @@ __sqrt(double x)
 	     division and a square root and the remainder of the
 	     argument reduction, all interleaved.   */
 	  sd  = -(sg*sg - sx);
-	  fsgi = xi0 + 0x40000000 >> 1 & 0x7ff00000;
+	  fsgi = (xi0 + 0x40000000) >> 1 & 0x7ff00000;
 	  sy2 = sy + sy;
 	  sg  = sy*sd + sg;  /* 16-bit approximation to sqrt(sx). */
 	  INSERT_WORDS (fsg, fsgi, 0);
diff --git a/sysdeps/powerpc/w_sqrtf.c b/sysdeps/powerpc/w_sqrtf.c
index 804dff3c44..d40ade12d0 100644
--- a/sysdeps/powerpc/w_sqrtf.c
+++ b/sysdeps/powerpc/w_sqrtf.c
@@ -74,9 +74,9 @@ __sqrtf(float x)
 	  GET_FLOAT_WORD (xi, x);
 	  fe = fegetenv_register ();
 	  relax_fenv_state ();
-	  sxi = xi & 0x3fffffff | 0x3f000000;
+	  sxi = (xi & 0x3fffffff) | 0x3f000000;
 	  SET_FLOAT_WORD (sx, sxi);
-	  t_sqrt = __t_sqrt + (xi >> 23-8-1  & 0x3fe);
+	  t_sqrt = __t_sqrt + (xi >> (23-8-1)  & 0x3fe);
 	  sg = t_sqrt[0];
 	  sy = t_sqrt[1];
 	  
@@ -84,7 +84,7 @@ __sqrtf(float x)
 	     division and a square root and the remainder of the
 	     argument reduction, all interleaved.   */
 	  sd  = -(sg*sg - sx);
-	  fsgi = xi + 0x40000000 >> 1 & 0x7f800000;
+	  fsgi = (xi + 0x40000000) >> 1 & 0x7f800000;
 	  sy2 = sy + sy;
 	  sg  = sy*sd + sg;  /* 16-bit approximation to sqrt(sx). */
 	  e   = -(sy*sg - almost_half);
diff --git a/sysdeps/unix/sysv/linux/mips/Dist b/sysdeps/unix/sysv/linux/mips/Dist
index 5f0429b282..576aef8046 100644
--- a/sysdeps/unix/sysv/linux/mips/Dist
+++ b/sysdeps/unix/sysv/linux/mips/Dist
@@ -3,14 +3,8 @@ kernel_sigaction.h
 kernel_stat.h
 kernel_termios.h
 entry.h
-regdef.h
-fpregdef.h
-sgidefs.h
 xstatconv.c
 sys/acct.h
-sys/asm.h
 sys/cachectl.h
-sys/fpregdef.h
 sys/procfs.h
-sys/regdef.h
 sys/sysmips.h
diff --git a/sysdeps/unix/sysv/linux/mips/Makefile b/sysdeps/unix/sysv/linux/mips/Makefile
index 5d3e280d7c..41451ca7d1 100644
--- a/sysdeps/unix/sysv/linux/mips/Makefile
+++ b/sysdeps/unix/sysv/linux/mips/Makefile
@@ -7,6 +7,5 @@ endif
 ifeq ($(subdir),misc)
 sysdep_routines += cachectl cacheflush sysmips
 
-headers += regdef.h fpregdef.h sys/asm.h sys/cachectl.h sys/fpregdef.h \
-	   sys/regdef.h sys/sysmips.h
+headers += sys/cachectl.h sys/sysmips.h
 endif
diff --git a/sysdeps/unix/sysv/linux/mips/bits/sigaction.h b/sysdeps/unix/sysv/linux/mips/bits/sigaction.h
index 435f8e00f6..855fe287d4 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/sigaction.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/sigaction.h
@@ -28,8 +28,20 @@ struct sigaction
     unsigned int sa_flags;
 
     /* Signal handler.  */
+#ifdef __USE_POSIX199309
+    union
+      {
+	/* Used if SA_SIGINFO is not set.  */
+	__sighandler_t sa_handler;
+	/* Used if SA_SIGINFO is set.  */
+	void (*sa_sigaction) __PMT ((int, siginfo_t *, void *));
+      }
+    __sigaction_handler;
+# define sa_handler    __sigaction_handler.sa_handler
+# define sa_sigaction  __sigaction_handler.sa_sigaction
+#else
     __sighandler_t sa_handler;
-
+#endif
     /* Additional set of signals to be blocked.  */
     __sigset_t sa_mask;
 
@@ -43,14 +55,17 @@ struct sigaction
   };
 
 /* Bits in `sa_flags'.  */
-#define	SA_NOCLDSTOP  1		 /* Don't send SIGCHLD when children stop.  */
-#ifdef __USE_MISC
+#define SA_NOCLDSTOP  0x00020000 /* Don't send SIGCHLD when children stop.  */
+#define SA_SIGINFO    0x00000008 /* Invoke signal-catching function with
+				    three arguments instead of one.  */
+#if defined __USE_UNIX98 || defined __USE_MISC
 # define SA_ONSTACK   0x00000001 /* Use signal stack by using `sa_restorer'. */
 # define SA_RESTART   0x00000004 /* Restart syscall on signal return.  */
-# define SA_INTERRUPT 0x00000000 /* Historical no-op.  */
 # define SA_NODEFER   0x00000010 /* Don't automatically block the signal when
 				    its handler is being executed.  */
-# define SA_RESETHAND 0x00000002 /* Reset to SIG_DFL on entry to handler.  */
+#endif
+#ifdef __USE_MISC
+# define SA_INTERRUPT 0x01000000 /* Historical no-op.  */
 
 /* Some aliases for the SA_ constants.  */
 # define SA_NOMASK    SA_NODEFER
@@ -63,5 +78,7 @@ struct sigaction
 #define	SIG_BLOCK     1		/* Block signals.  */
 #define	SIG_UNBLOCK   2		/* Unblock signals.  */
 #define	SIG_SETMASK   3		/* Set the set of blocked signals.  */
-#define SIG_SETMASK32 256	/* Goodie from SGI for BSD compatibility:
+#ifdef __USE_MISC
+# define SIG_SETMASK32 256	/* Goodie from SGI for BSD compatibility:
 				   set only the low 32 bit of the sigset.  */
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/fpregdef.h b/sysdeps/unix/sysv/linux/mips/fpregdef.h
deleted file mode 100644
index a963d5f588..0000000000
--- a/sysdeps/unix/sysv/linux/mips/fpregdef.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <sys/fpregdef.h>
diff --git a/sysdeps/unix/sysv/linux/mips/regdef.h b/sysdeps/unix/sysv/linux/mips/regdef.h
deleted file mode 100644
index b613c8b250..0000000000
--- a/sysdeps/unix/sysv/linux/mips/regdef.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <sys/regdef.h>
diff --git a/sysdeps/unix/sysv/linux/mips/syscalls.list b/sysdeps/unix/sysv/linux/mips/syscalls.list
index dd29d159aa..434be84898 100644
--- a/sysdeps/unix/sysv/linux/mips/syscalls.list
+++ b/sysdeps/unix/sysv/linux/mips/syscalls.list
@@ -37,7 +37,7 @@ socketpair	-	socketpair	4	__socketpair	socketpair
 #
 # There are defined locally because the caller is also defined in this dir.
 #
-s_llseek	llseek	_llseek		5	__sys_llseek
+s_llseek	llseek	_llseek		5	__syscall_llseek
 s_sigaction	sigaction sigaction	3	__syscall_sigaction
 s_ustat		ustat	ustat		2	__syscall_ustat
 sys_mknod	xmknod	mknod		3	__syscall_mknod
@@ -57,10 +57,11 @@ s_getdents	getdents getdents	3	__syscall_getdents
 s_getpriority	getpriority getpriority	2	__syscall_getpriority
 s_getresgid	getresgid getresgid	3	__syscall_getresgid
 s_getresuid	getresuid getresuid	3	__syscall_getresuid
+s_ipc		msgget	ipc		5	__syscall_ipc
 s_poll		poll	poll		3	__syscall_poll
-s_pread		pread	pread		6	__syscall_pread
+s_pread64	pread64	pread		6	__syscall_pread
 s_ptrace	ptrace	ptrace		4	__syscall_ptrace
-s_pwrite	pwrite	pwrite		6	__syscall_pwrite
+s_pwrite64	pwrite64 pwrite		6	__syscall_pwrite
 s_reboot	reboot	reboot		3	__syscall_reboot
 s_sigpending	sigpending sigpending	1	__syscall_sigpending
 s_sigprocmask	sigprocmask sigprocmask	3	__syscall_sigprocmask
diff --git a/sysdeps/unix/sysv/linux/mips/sys/regdef.h b/sysdeps/unix/sysv/linux/mips/sysdep.S
index 700fd66f0b..c7bc193a40 100644
--- a/sysdeps/unix/sysv/linux/mips/sys/regdef.h
+++ b/sysdeps/unix/sysv/linux/mips/sysdep.S
@@ -1,6 +1,5 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -17,13 +16,21 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#ifndef _REGDEF_H
-#define _REGDEF_H	1
+#include <sysdep.h>
 
-/*
- * The real definitions come from the Linux kernel sources
- */
-#include <asm/regdef.h>
-#include <asm/fpregdef.h>
+/* Because the Linux version is in fact MIPS/ELF and the start.? file
+   for this system (sysdeps/mips/elf/start.S) is also used by The Hurd
+   and therefore this files must not contain the definition of the
+   `errno' variable (I don't know why, ask Roland), we have to define
+   it somewhere else.
 
-#endif /* regdef.h */
+   ...and this place is here.  */
+	.bss
+	.globl  errno
+	.type   errno,@object
+	.size   errno,4
+errno:	.word   4
+	.text
+weak_alias(errno, _errno)
+
+#include <sysdeps/unix/mips/sysdep.S>
diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
index 7e5acc83cb..4419953d06 100644
--- a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
+++ b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
@@ -34,7 +34,7 @@
     ++_tmp;							\
 								\
     _test = (size_t)_tmp;					\
-    _test = _test + 0xf & ~0xf;					\
+    _test = (_test + 0xf) & ~0xf;				\
     /* Under some circumstances, MkLinux (up to at least DR3a5)	\
        omits the padding.  To work around this, we make a	\
        basic sanity check of the argument vector.  Of		\