[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

RE: gnumach with gcc-2.95.1 or newer



Hello,

here are some changes for gnumach which allow compilation using gcc-2.95 or
newer. I tested them with a cross gcc-2.95.1 under Linux.

gcc-2.95.1 gives more warnings than older versions. Some of them I have
fixed
in this patch. Many more remain to be done.

Here is an extract from ChangeLog which summarises my changes:

	* device/subrs.c: Fixed compiler warning.
	* ddb/db_output.c, kern/bootstrap.c, kern/debug.c, kern/printf.c:
	Replaced varargs.h by stdarg.h. Fixed prototypes (const char *fmt).
	* ddb/db_output.h: Use prototype for db_printf.
	* i386/Files: removed varargs.h.
	* i386/i386/pit.h: Fixed compiler warning.
	* i386/i386at/model_dep.c: Tried to fix compiler warning.
	* i386/include/mach/sa/sys/varargs.h: Removed.
!	* i386/linux/Makefile.in: Removed delay.S, added delay.c.
!	* linux/dev/include/asm-i386/segment.h: Support gcc-2.95.
!	* linux/dev/include/asm-i386/string.h,
	linux/src/include/asm-i386/string.h: Update from linux-2.2.14.
	* linux/dev/lib/vsprintf.c: Fixed compiler warning.
!	* linux/src/include/asm-i386/delay.h: Update from linux-2.2.14.
!	* linux/src/arch/i386/lib/delay.S: Removed.
!	* linux/src/arch/i386/lib/delay.c: Copy from linux-2.2.14.
!	* linux/src/include/asm-i386/string.h: Update from linux-2.2.14.

The changes marked with "!" are essential for gcc-2.95.

All changes should be compatible with older gcc versions, but I did not
test this.

With gcc-2.95 or newer, segment.h declares less efficient inline functions,
but I did not notice any performance degradation with such a kernel.

The new delay.c might change some delays in device drivers, but it is
Linux compatible, so this should be fine.

Hurd also compiles with gcc-2.95.1, so there is no longer a need to use
an old compiler.

Regards,
Stefan


These files are no longer needed. Remove them:
	linux/src/arch/i386/lib/delay.S
	i386/include/mach/sa/sys/varargs.h

This file is new. Please add it manually:
	linux/src/arch/i386/lib/delay.c
===================================================================
/*
 *	Precise Delay Loops for i386
 *
 *	Copyright (C) 1993 Linus Torvalds
 *	Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
 *
 *	The __delay function must _NOT_ be inlined as its execution time
 *	depends wildly on alignment on many x86 processors. The additional
 *	jump magic is needed to get the timing stable on all the CPU's
 *	we have to worry about.
 */

#include <linux/sched.h>
#include <linux/delay.h>

#ifdef __SMP__
#include <asm/smp.h>
#endif

void __delay(unsigned long loops)
{
	int d0;
	__asm__ __volatile__(
		"\tjmp 1f\n"
		".align 16\n"
		"1:\tjmp 2f\n"
		".align 16\n"
		"2:\tdecl %0\n\tjns 2b"
		:"=&a" (d0)
		:"0" (loops));
}

inline void __const_udelay(unsigned long xloops)
{
	int d0;
	__asm__("mull %0"
		:"=d" (xloops), "=&a" (d0)
		:"1" (xloops),"0" (current_cpu_data.loops_per_sec));
        __delay(xloops);
}

void __udelay(unsigned long usecs)
{
	__const_udelay(usecs * 0x000010c6);  /* 2**32 / 1000000 */
}
===================================================================


Patches for other files follow.

Index: ChangeLog
===================================================================
RCS file: /home/cvs/gnumach/ChangeLog,v
retrieving revision 1.69
diff -u -r1.69 ChangeLog
--- ChangeLog	1999/10/08 13:49:43	1.69
+++ ChangeLog	2000/02/07 07:39:09
@@ -1,3 +1,17 @@
+2000-02-06  Stefan Weil <stefan.weil@de.heidelberg.com>
+
+	* device/subrs.c: Fixed compiler warning.
+	* ddb/db_output.c, kern/bootstrap.c, kern/debug.c, kern/printf.c:
+	Replaced varargs.h by stdarg.h. Fixed prototypes (const char *fmt).
+	* ddb/db_output.h: Use prototype for db_printf.
+	* i386/Files: removed varargs.h.
+	* i386/i386/pit.h: Fixed compiler warning.
+	* i386/i386at/model_dep.c: Tried to fix compiler warning.
+	* i386/include/mach/sa/sys/varargs.h: Removed.
+	* i386/linux/Makefile.in: Removed delay.S, added delay.c.
+	* linux/dev/include/asm-i386/segment.h: Support gcc-2.95.
+	* linux/dev/include/asm-i386/string.h,
+	linux/src/include/asm-i386/string.h: Update from linux-2.2.14.
+	* linux/dev/lib/vsprintf.c: Fixed compiler warning.
+	* linux/src/include/asm-i386/delay.h: Update from linux-2.2.14.
+	* linux/src/arch/i386/lib/delay.c: Copy from linux-2.2.14.
+	* linux/src/include/asm-i386/string.h: Update from linux-2.2.14.
+
 1999-10-08  Thomas Bushnell, BSG  <tb@mit.edu>
 
 	* linux/src/drivers/net/3c59x.c: Updated to version 0.99L of the
Index: ddb/db_output.c
===================================================================
RCS file: /home/cvs/gnumach/ddb/db_output.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 db_output.c
--- db_output.c	1997/02/25 21:28:12	1.1.1.1
+++ db_output.c	2000/02/07 07:39:09
@@ -35,8 +35,8 @@
  * Printf and character output for debugger.
  */
 
+#include <stdarg.h>
 #include <mach/boolean.h>
-#include <sys/varargs.h>
 #include <machine/db_machdep.h>
 #include <ddb/db_lex.h>
 #include <ddb/db_output.h>
@@ -209,16 +209,14 @@
 
 /*VARARGS1*/
 void
-db_printf( fmt, va_alist)
-	char *	fmt;
-	va_dcl
+db_printf(const char *fmt, ...)
 {
 	va_list	listp;
 
 #ifdef	db_printf_enter
 	db_printf_enter();	/* optional multiP serialization */
 #endif
-	va_start(listp);
+	va_start(listp, fmt);
 	_doprnt(fmt, &listp, db_id_putc, db_radix, 0);
 	va_end(listp);
 }
@@ -227,12 +225,10 @@
 
 /*VARARGS1*/
 void
-kdbprintf(fmt, va_alist)
-	char *	fmt;
-	va_dcl
+kdbprintf(const char *fmt, ...)
 {
 	va_list	listp;
-	va_start(listp);
+	va_start(listp, fmt);
 	_doprnt(fmt, &listp, db_id_putc, db_radix, 0);
 	va_end(listp);
 }
Index: ddb/db_output.h
===================================================================
RCS file: /home/cvs/gnumach/ddb/db_output.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 db_output.h
--- db_output.h	1997/02/25 21:28:12	1.1.1.1
+++ db_output.h	2000/02/07 07:39:09
@@ -35,10 +35,6 @@
 extern void	db_force_whitespace();
 extern int	db_print_position();
 extern void	db_end_line();
-#if 1
-extern void	db_printf();
-#else
-extern void	db_printf( char *fmt, ...);
-#endif
+extern void	db_printf( const char *fmt, ...);
 
 
Index: device/subrs.c
===================================================================
RCS file: /home/cvs/gnumach/device/subrs.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 subrs.c
--- subrs.c	1997/02/25 21:28:16	1.1.1.1
+++ subrs.c	2000/02/07 07:39:09
@@ -110,7 +110,7 @@
 	register io_req_t	ior;
 
 	io_req_alloc(ior, 0);
-	ior->io_device = (device_t)0;
+	ior->io_device = (mach_device_t)0;
 	ior->io_unit = 0;
 	ior->io_op = 0;
 	ior->io_mode = 0;
Index: i386/Files
===================================================================
RCS file: /home/cvs/gnumach/i386/Files,v
retrieving revision 1.8
diff -u -r1.8 Files
--- Files	1999/06/21 18:32:17	1.8
+++ Files	2000/02/07 07:39:09
@@ -248,7 +248,6 @@
 i386/include/mach/i386/vm_types.h
 i386/include/mach/i386/exec/elf.h
 i386/include/mach/sa/stdarg.h
-i386/include/mach/sa/sys/varargs.h
 i386/intel/pmap.c
 i386/intel/pmap.h
 i386/intel/read_fault.c
Index: i386/i386/pit.h
===================================================================
RCS file: /home/cvs/gnumach/i386/i386/pit.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 pit.h
--- pit.h	1997/02/25 21:27:11	1.1.1.1
+++ pit.h	2000/02/07 07:39:09
@@ -100,8 +100,10 @@
 		time_t	ticks;          /* time in HZ since boot */
 		time_t	uticks;         /* time in 1.25 MHZ */
 /* don't need these two for now.   --- csy */
-/*		time_t  secs;           /* seconds since boot */
-/*		time_t  epochsecs;      /* seconds since epoch */
+#if 0
+		time_t  secs;           /* seconds since boot */
+		time_t  epochsecs;      /* seconds since epoch */
+#endif
 	} time_latch;
 /* a couple in-line assembly codes for efficiency. */
 asm  int   intr_disable()
Index: i386/i386at/model_dep.c
===================================================================
RCS file: /home/cvs/gnumach/i386/i386at/model_dep.c,v
retrieving revision 1.4
diff -u -r1.4 model_dep.c
--- model_dep.c	1999/09/04 13:03:15	1.4
+++ model_dep.c	2000/02/07 07:39:10
@@ -98,6 +98,9 @@
 
 extern void	setup_main();
 
+void		halt_all_cpu (boolean_t reboot) __attribute__ ((noreturn));
+void		halt_cpu (void) __attribute__ ((noreturn));
+
 void		inittodr();	/* forward */
 
 int		rebootflag = 0;	/* exported to kdintr */
@@ -155,7 +158,7 @@
 /*
  * Halt a cpu.
  */
-halt_cpu()
+void halt_cpu(void)
 {
 	asm volatile("cli");
 	while(1);
@@ -164,7 +167,7 @@
 /*
  * Halt the system or reboot.
  */
-halt_all_cpus(reboot)
+void halt_all_cpus(reboot)
 	boolean_t	reboot;
 {
 	if (reboot) {
Index: i386/linux/Makefile.in
===================================================================
RCS file: /home/cvs/gnumach/i386/linux/Makefile.in,v
retrieving revision 1.2
diff -u -r1.2 Makefile.in
--- Makefile.in	1999/07/02 02:33:31	1.2
+++ Makefile.in	2000/02/07 07:39:10
@@ -31,7 +31,7 @@
 

 
 # Files for driver support.
-linux-c-files = version.c softirq.c dma.c resource.c printk.c \
+linux-c-files = version.c softirq.c delay.c dma.c resource.c printk.c \
 		bios32.c irq.c ctype.c vsprintf.c main.c misc.c sched.c \
 		kmem.c block.c setup.c
 
@@ -39,6 +39,7 @@
 vpath %.c $(linuxsrcdir)/dev/kernel
 vpath %.c $(linuxsrcdir)/dev/init
 vpath %.c $(linuxsrcdir)/dev/arch/$(systype)/kernel
+vpath %.c $(linuxsrcdir)/dev/arch/$(systype)/lib
 vpath %.c $(linuxsrcdir)/dev/glue
 vpath %.c $(linuxsrcdir)/dev/lib
 
@@ -50,7 +51,7 @@
 
 
 # XXX: Assembly source files must be treated separately... Uggg...
-linux-asm-files = delay.S semaphore.S
+linux-asm-files = semaphore.S
 vpath %.S $(linuxsrcdir)/dev/arch/$(systype)/lib
 vpath %.S $(linuxsrcdir)/src/arch/$(systype)/lib
 
Index: kern/bootstrap.c
===================================================================
RCS file: /home/cvs/gnumach/kern/bootstrap.c,v
retrieving revision 1.3
diff -u -r1.3 bootstrap.c
--- bootstrap.c	1999/06/02 07:00:13	1.3
+++ bootstrap.c	2000/02/07 07:39:10
@@ -43,7 +43,7 @@
 #include <vm/vm_kern.h>
 #include <device/device_port.h>
 
-#include <sys/varargs.h>
+#include <stdarg.h>
 
 #include <mach/machine/multiboot.h>
 #include <mach/exec/exec.h>
@@ -335,9 +335,7 @@
 extern vm_offset_t	set_user_regs();
 
 void
-static build_args_and_stack(boot_exec_info, va_alist)
-	struct exec_info *boot_exec_info;
-	va_dcl
+static build_args_and_stack(struct exec_info *boot_exec_info, ...)
 {
 	vm_offset_t	stack_base;
 	vm_size_t	stack_size;
@@ -358,7 +356,7 @@
 	/*
 	 * Calculate the size of the argument list.
 	 */
-	va_start(argv_ptr);
+	va_start(argv_ptr, boot_exec_info);
 	arg_len = 0;
 	arg_count = 0;
 	for (;;) {
@@ -417,7 +415,7 @@
 	/*
 	 * Then the strings and string pointers for each argument
 	 */
-	va_start(argv_ptr);
+	va_start(argv_ptr, boot_exec_info);
 	while (--arg_count >= 0) {
 	    arg_ptr = va_arg(argv_ptr, char *);
 	    arg_item_len = strlen(arg_ptr) + 1; /* include trailing 0 */
Index: kern/debug.c
===================================================================
RCS file: /home/cvs/gnumach/kern/debug.c,v
retrieving revision 1.2
diff -u -r1.2 debug.c
--- debug.c	1998/04/24 17:25:59	1.2
+++ debug.c	2000/02/07 07:39:10
@@ -24,15 +24,18 @@
  * the rights to redistribute these changes.
  */
 
+#include <stdarg.h>
+
 #include <mach_kdb.h>
 #include <norma_ipc.h>
 #include <cpus.h>
 
 #include "cpu_number.h"
 #include <kern/lock.h>
-#include <sys/varargs.h>
 #include <kern/thread.h>
 
+#warning missing include for panic()
+void panic(const char *s, ...);
 
 
 extern void cnputc();
@@ -105,7 +108,7 @@
 boolean_t		panic_lock_initialized = FALSE;
 decl_simple_lock_data(,	panic_lock)
 
-char			*panicstr;
+const char     		*panicstr;
 int			paniccpu;
 
 void
@@ -120,9 +123,7 @@
 
 /*VARARGS1*/
 void
-panic(s, va_alist)
-	char *	s;
-	va_dcl
+panic(const char *s, ...)
 {
 	va_list	listp;
 #if	NORMA_IPC
@@ -152,7 +153,7 @@
 	printf("(cpu %U)", paniccpu);
 #endif
 	printf(": ");
-	va_start(listp);
+	va_start(listp, s);
 	_doprnt(s, &listp, cnputc, 0);
 	va_end(listp);
 	printf("\n");
@@ -176,17 +177,14 @@
  */
 /*VARARGS2*/
 void
-log(level, fmt, va_alist)
-	int	level;
-	char *	fmt;
-	va_dcl
+log(int level, const char *fmt, ...)
 {
 	va_list	listp;
 
 #ifdef lint
 	level++;
 #endif
-	va_start(listp);
+	va_start(listp, fmt);
 	_doprnt(fmt, &listp, cnputc, 0);
 	va_end(listp);
 }
Index: kern/printf.c
===================================================================
RCS file: /home/cvs/gnumach/kern/printf.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 printf.c
--- printf.c	1997/02/25 21:28:24	1.1.1.1
+++ printf.c	2000/02/07 07:39:11
@@ -115,7 +115,7 @@
 #include <mach/boolean.h>
 #include <kern/lock.h>
 #include <kern/strings.h>
-#include <sys/varargs.h>
+#include <stdarg.h>
 
 #define isdigit(d) ((d) >= '0' && (d) <= '9')
 #define Ctod(c) ((c) - '0')
@@ -161,7 +161,7 @@
 }
 
 void _doprnt(
-	register char	*fmt,
+	register const char *fmt,
 	va_list		*argp,
 					/* character output routine */
  	void		(*putc)( char, vm_offset_t),
@@ -509,20 +509,16 @@
  */
 extern void	cnputc( char, /*not really*/vm_offset_t);
 
-void vprintf(fmt, listp)
-	char *	fmt;
-	va_list listp;
+void vprintf(const char *fmt, va_list listp)
 {
 	_doprnt(fmt, &listp, cnputc, 16, 0);
 }
 
 /*VARARGS1*/
-void printf(fmt, va_alist)
-	char *	fmt;
-	va_dcl
+void printf(const char *fmt, ...)
 {
 	va_list	listp;
-	va_start(listp);
+	va_start(listp, fmt);
 	vprintf(fmt, listp);
 	va_end(listp);
 }
@@ -533,9 +529,7 @@
  * Printing (to console) with indentation.
  */
 /*VARARGS1*/
-void iprintf(fmt, va_alist)
-	char *	fmt;
-	va_dcl
+void iprintf(const char *fmt, ...)
 {
 	va_list	listp;
 	register int i;
@@ -550,7 +544,7 @@
 		i--;
 	    }
 	}
-	va_start(listp);
+	va_start(listp, fmt);
 	_doprnt(fmt, &listp, cnputc, 16, 0);
 	va_end(listp);
 }
@@ -572,15 +566,12 @@
 }
 
 int
-sprintf( buf, fmt, va_alist)
-	char	*buf;
-	char	*fmt;
-	va_dcl
+sprintf(char *buf, const char *fmt, ...)
 {
 	va_list	listp;
 	char	*start = buf;
 
-	va_start(listp);
+	va_start(listp, fmt);
 	_doprnt(fmt, &listp, sputc, 16, (vm_offset_t)&buf);
 	va_end(listp);
 
Index: linux/dev/include/asm-i386/segment.h
===================================================================
RCS file: /home/cvs/gnumach/linux/dev/include/asm-i386/segment.h,v
retrieving revision 1.1
diff -u -r1.1 segment.h
--- segment.h	1999/04/26 05:47:29	1.1
+++ segment.h	2000/02/07 07:39:11
@@ -92,6 +92,7 @@
 	}
 }
 
+#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ < 95)
 static inline void __generic_memcpy_tofs(void * to, const void * from,
unsigned long n)
 {
     __asm__ volatile
@@ -271,6 +272,29 @@
 (__builtin_constant_p(n) ? \
  __constant_memcpy_tofs((to),(from),(n)) : \
  __generic_memcpy_tofs((to),(from),(n)))
+
+
+#else /* code for gcc-2.95.x and newer follows */
+
+static inline void memcpy_fromfs(void * to, const void * from, unsigned
long n)
+{
+  char *d = (char *)to;
+  const char *s = (const char *)from;
+  while (n-- > 0) {
+    *d++ = __get_user(s++, 1);
+  }
+}
+
+static inline void memcpy_tofs(void * to, const void * from, unsigned long
n)
+{
+  char *d = (char *)to;
+  const char *s = (const char *)from;
+  while (n-- > 0) {
+    __put_user(*s++, d++, 1);
+  }
+}
+
+#endif /* not gcc-2.95 */
 
 /*
  * These are deprecated..
Index: linux/dev/include/asm-i386/string.h
===================================================================
RCS file: /home/cvs/gnumach/linux/dev/include/asm-i386/string.h,v
retrieving revision 1.1
diff -u -r1.1 string.h
--- string.h	1999/04/26 05:47:30	1.1
+++ string.h	2000/02/07 07:39:11
@@ -23,26 +23,29 @@
  * set, making the functions fast and clean. String instructions have been
  * used through-out, making for "slightly" unclear code :-)
  *
- *		Copyright (C) 1991, 1992 Linus Torvalds
+ *		NO Copyright (C) 1991, 1992 Linus Torvalds,
+ *		consider these trivial functions to be PD.
  */
 
 #define __HAVE_ARCH_STRCPY
 extern inline char * strcpy(char * dest,const char *src)
 {
+int d0, d1, d2;
 __asm__ __volatile__(
 	"cld\n"
 	"1:\tlodsb\n\t"
 	"stosb\n\t"
 	"testb %%al,%%al\n\t"
 	"jne 1b"
-	: /* no output */
-	:"S" (src),"D" (dest):"si","di","ax","memory");
+	: "=&S" (d0), "=&D" (d1), "=&a" (d2)
+	:"0" (src),"1" (dest) : "memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRNCPY
 extern inline char * strncpy(char * dest,const char *src,size_t count)
 {
+int d0, d1, d2, d3;
 __asm__ __volatile__(
 	"cld\n"
 	"1:\tdecl %2\n\t"
@@ -54,14 +57,15 @@
 	"rep\n\t"
 	"stosb\n"
 	"2:"
-	: /* no output */
-	:"S" (src),"D" (dest),"c" (count):"si","di","ax","cx","memory");
+	: "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3)
+	:"0" (src),"1" (dest),"2" (count) : "memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRCAT
 extern inline char * strcat(char * dest,const char * src)
 {
+int d0, d1, d2, d3;
 __asm__ __volatile__(
 	"cld\n\t"
 	"repne\n\t"
@@ -71,20 +75,21 @@
 	"stosb\n\t"
 	"testb %%al,%%al\n\t"
 	"jne 1b"
-	: /* no output */
-	:"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx");
+	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+	: "0" (src), "1" (dest), "2" (0), "3" (0xffffffff):"memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRNCAT
 extern inline char * strncat(char * dest,const char * src,size_t count)
 {
+int d0, d1, d2, d3;
 __asm__ __volatile__(
 	"cld\n\t"
 	"repne\n\t"
 	"scasb\n\t"
 	"decl %1\n\t"
-	"movl %4,%3\n"
+	"movl %8,%3\n"
 	"1:\tdecl %3\n\t"
 	"js 2f\n\t"
 	"lodsb\n\t"
@@ -93,15 +98,16 @@
 	"jne 1b\n"
 	"2:\txorl %2,%2\n\t"
 	"stosb"
-	: /* no output */
-	:"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
-	:"si","di","ax","cx","memory");
+	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+	: "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
+	: "memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRCMP
 extern inline int strcmp(const char * cs,const char * ct)
 {
+int d0, d1;
 register int __res;
 __asm__ __volatile__(
 	"cld\n"
@@ -113,9 +119,10 @@
 	"xorl %%eax,%%eax\n\t"
 	"jmp 3f\n"
 	"2:\tsbbl %%eax,%%eax\n\t"
-	"orb $1,%%eax\n"
+	"orb $1,%%al\n"
 	"3:"
-	:"=a" (__res):"S" (cs),"D" (ct):"si","di");
+	:"=a" (__res), "=&S" (d0), "=&D" (d1)
+		     :"1" (cs),"2" (ct));
 return __res;
 }
 
@@ -123,6 +130,7 @@
 extern inline int strncmp(const char * cs,const char * ct,size_t count)
 {
 register int __res;
+int d0, d1, d2;
 __asm__ __volatile__(
 	"cld\n"
 	"1:\tdecl %3\n\t"
@@ -137,13 +145,15 @@
 	"3:\tsbbl %%eax,%%eax\n\t"
 	"orb $1,%%al\n"
 	"4:"
-	:"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx");
+		     :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
+		     :"1" (cs),"2" (ct),"3" (count));
 return __res;
 }
 
 #define __HAVE_ARCH_STRCHR
 extern inline char * strchr(const char * s, int c)
 {
+int d0;
 register char * __res;
 __asm__ __volatile__(
 	"cld\n\t"
@@ -156,13 +166,14 @@
 	"movl $1,%1\n"
 	"2:\tmovl %1,%0\n\t"
 	"decl %0"
-	:"=a" (__res):"S" (s),"0" (c):"si");
+	:"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
 return __res;
 }
 
 #define __HAVE_ARCH_STRRCHR
 extern inline char * strrchr(const char * s, int c)
 {
+int d0, d1;
 register char * __res;
 __asm__ __volatile__(
 	"cld\n\t"
@@ -173,123 +184,14 @@
 	"leal -1(%%esi),%0\n"
 	"2:\ttestb %%al,%%al\n\t"
 	"jne 1b"
-	:"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si");
-return __res;
-}
-
-#define __HAVE_ARCH_STRSPN
-extern inline size_t strspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"movl %%ecx,%%edx\n"
-	"1:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 2f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"je 1b\n"
-	"2:\tdecl %0"
-	:"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
-	:"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRCSPN
-extern inline size_t strcspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"movl %%ecx,%%edx\n"
-	"1:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 2f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"jne 1b\n"
-	"2:\tdecl %0"
-	:"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
-	:"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRPBRK
-extern inline char * strpbrk(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"movl %%ecx,%%edx\n"
-	"1:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 2f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"jne 1b\n\t"
-	"decl %0\n\t"
-	"jmp 3f\n"
-	"2:\txorl %0,%0\n"
-	"3:"
-	:"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
-	:"ax","cx","dx","di");
+	:"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c));
 return __res;
 }
 
-#define __HAVE_ARCH_STRSTR
-extern inline char * strstr(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t" \
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"	/* NOTE! This also sets Z if searchstring=''
*/
-	"movl %%ecx,%%edx\n"
-	"1:\tmovl %4,%%edi\n\t"
-	"movl %%esi,%%eax\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repe\n\t"
-	"cmpsb\n\t"
-	"je 2f\n\t"		/* also works for empty string, see above */
-	"xchgl %%eax,%%esi\n\t"
-	"incl %%esi\n\t"
-	"cmpb $0,-1(%%eax)\n\t"
-	"jne 1b\n\t"
-	"xorl %%eax,%%eax\n\t"
-	"2:"
-	:"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"D" (ct),
-	"g" (*cs), "g" (*ct)
-	:"cx","dx","di","si");
-return __res;
-}
-
 #define __HAVE_ARCH_STRLEN
 extern inline size_t strlen(const char * s)
 {
+int d0;
 register int __res;
 __asm__ __volatile__(
 	"cld\n\t"
@@ -297,86 +199,26 @@
 	"scasb\n\t"
 	"notl %0\n\t"
 	"decl %0"
-	:"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di");
-return __res;
-}
-
-#define __HAVE_ARCH_STRTOK
-extern inline char * strtok(char * s,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"testl %1,%1\n\t"
-	"jne 1f\n\t"
-	"testl %0,%0\n\t"
-	"je 8f\n\t"
-	"movl %0,%1\n"
-	"1:\txorl %0,%0\n\t"
-	"movl $-1,%%ecx\n\t"
-	"xorl %%eax,%%eax\n\t"
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"je 7f\n\t"			/* empty delimiter-string */
-	"movl %%ecx,%%edx\n"
-	"2:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 7f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"je 2b\n\t"
-	"decl %1\n\t"
-	"cmpb $0,(%1)\n\t"
-	"je 7f\n\t"
-	"movl %1,%0\n"
-	"3:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 5f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"jne 3b\n\t"
-	"decl %1\n\t"
-	"cmpb $0,(%1)\n\t"
-	"je 5f\n\t"
-	"movb $0,(%1)\n\t"
-	"incl %1\n\t"
-	"jmp 6f\n"
-	"5:\txorl %1,%1\n"
-	"6:\tcmpb $0,(%0)\n\t"
-	"jne 7f\n\t"
-	"xorl %0,%0\n"
-	"7:\ttestl %0,%0\n\t"
-	"jne 8f\n\t"
-	"movl %0,%1\n"
-	"8:"
-	:"=b" (__res),"=S" (___strtok)
-	:"0" (___strtok),"1" (s),"g" (ct)
-	:"ax","cx","dx","di","memory");
+	:"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffff));
 return __res;
 }
 
 extern inline void * __memcpy(void * to, const void * from, size_t n)
 {
+int d0, d1, d2;
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep ; movsl\n\t"
-	"testb $2,%b1\n\t"
+	"testb $2,%b4\n\t"
 	"je 1f\n\t"
 	"movsw\n"
-	"1:\ttestb $1,%b1\n\t"
+	"1:\ttestb $1,%b4\n\t"
 	"je 2f\n\t"
 	"movsb\n"
 	"2:"
-	: /* no output */
-	:"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from)
-	: "cx","di","si","memory");
+	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
+	:"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
+	: "memory");
 return (to);
 }
 
@@ -402,6 +244,10 @@
 		case 4:
 			*(unsigned long *)to = *(const unsigned long *)from;
 			return to;
+		case 6:	/* for Ethernet addresses */
+			*(unsigned long *)to = *(const unsigned long *)from;
+			*(2+(unsigned short *)to) = *(2+(const unsigned
short *)from);
+			return to;
 		case 8:
 			*(unsigned long *)to = *(const unsigned long *)from;
 			*(1+(unsigned long *)to) = *(1+(const unsigned long
*)from);
@@ -426,19 +272,23 @@
 			return to;
 	}
 #define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__ __volatile__( \
+	"cld\n\t" \
 	"rep ; movsl" \
 	x \
-	: /* no outputs */ \
-	: "c" (n/4),"D" ((long) to),"S" ((long) from) \
-	: "cx","di","si","memory");
-
+	: "=&c" (d0), "=&D" (d1), "=&S" (d2) \
+	: "0" (n/4),"1" ((long) to),"2" ((long) from) \
+	: "memory");
+{
+	int d0, d1, d2;
 	switch (n % 4) {
 		case 0: COMMON(""); return to;
 		case 1: COMMON("\n\tmovsb"); return to;
 		case 2: COMMON("\n\tmovsw"); return to;
 		default: COMMON("\n\tmovsw\n\tmovsb"); return to;
 	}
+}
+  
 #undef COMMON
 }
 
@@ -451,25 +301,26 @@
 #define __HAVE_ARCH_MEMMOVE
 extern inline void * memmove(void * dest,const void * src, size_t n)
 {
+int d0, d1, d2;
 if (dest<src)
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep\n\t"
 	"movsb"
-	: /* no output */
-	:"c" (n),"S" (src),"D" (dest)
-	:"cx","si","di");
+	: "=&c" (d0), "=&S" (d1), "=&D" (d2)
+	:"0" (n),"1" (src),"2" (dest)
+	: "memory");
 else
 __asm__ __volatile__(
 	"std\n\t"
 	"rep\n\t"
 	"movsb\n\t"
 	"cld"
-	: /* no output */
-	:"c" (n),
-	 "S" (n-1+(const char *)src),
-	 "D" (n-1+(char *)dest)
-	:"cx","si","di","memory");
+	: "=&c" (d0), "=&S" (d1), "=&D" (d2)
+	:"0" (n),
+	 "1" (n-1+(const char *)src),
+	 "2" (n-1+(char *)dest)
+	:"memory");
 return dest;
 }
 
@@ -478,6 +329,7 @@
 #define __HAVE_ARCH_MEMCHR
 extern inline void * memchr(const void * cs,int c,size_t count)
 {
+int d0;
 register void * __res;
 if (!count)
 	return NULL;
@@ -488,20 +340,20 @@
 	"je 1f\n\t"
 	"movl $1,%0\n"
 	"1:\tdecl %0"
-	:"=D" (__res):"a" (c),"D" (cs),"c" (count)
-	:"cx");
+	:"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count));
 return __res;
 }
 
 extern inline void * __memset_generic(void * s, char c,size_t count)
 {
+int d0, d1;
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep\n\t"
 	"stosb"
-	: /* no output */
-	:"a" (c),"D" (s),"c" (count)
-	:"cx","di","memory");
+	: "=&c" (d0), "=&D" (d1)
+	:"a" (c),"1" (s),"0" (count)
+	:"memory");
 return s;
 }
 
@@ -515,19 +367,20 @@
  */
 extern inline void * __constant_c_memset(void * s, unsigned long c, size_t
count)
 {
+int d0, d1;
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep ; stosl\n\t"
-	"testb $2,%b1\n\t"
+	"testb $2,%b3\n\t"
 	"je 1f\n\t"
 	"stosw\n"
-	"1:\ttestb $1,%b1\n\t"
+	"1:\ttestb $1,%b3\n\t"
 	"je 2f\n\t"
 	"stosb\n"
 	"2:"
-	: /* no output */
-	:"a" (c), "q" (count), "c" (count/4), "D" ((long) s)
-	:"cx","di","memory");
+	: "=&c" (d0), "=&D" (d1)
+	:"a" (c), "q" (count), "0" (count/4), "1" ((long) s)
+	:"memory");
 return (s);	
 }
 
@@ -535,20 +388,20 @@
 #define __HAVE_ARCH_STRNLEN
 extern inline size_t strnlen(const char * s, size_t count)
 {
+int d0;
 register int __res;
 __asm__ __volatile__(
-	"movl %1,%0\n\t"
+	"movl %2,%0\n\t"
 	"jmp 2f\n"
 	"1:\tcmpb $0,(%0)\n\t"
 	"je 3f\n\t"
 	"incl %0\n"
-	"2:\tdecl %2\n\t"
-	"cmpl $-1,%2\n\t"
+	"2:\tdecl %1\n\t"
+	"cmpl $-1,%1\n\t"
 	"jne 1b\n"
-	"3:\tsubl %1,%0"
-	:"=a" (__res)
-	:"c" (s),"d" (count)
-	:"dx");
+	"3:\tsubl %2,%0"
+	:"=a" (__res), "=&d" (d0)
+	:"c" (s),"1" (count));
 return __res;
 }
 /* end of additional stuff */
@@ -577,19 +430,22 @@
 			return s;
 	}
 #define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__  __volatile__("cld\n\t" \
 	"rep ; stosl" \
 	x \
-	: /* no outputs */ \
-	: "a" (pattern),"c" (count/4),"D" ((long) s) \
-	: "cx","di","memory")
-
+	: "=&c" (d0), "=&D" (d1) \
+	: "a" (pattern),"0" (count/4),"1" ((long) s) \
+	: "memory")
+{
+	int d0, d1;
 	switch (count % 4) {
 		case 0: COMMON(""); return s;
 		case 1: COMMON("\n\tstosb"); return s;
 		case 2: COMMON("\n\tstosw"); return s;
 		default: COMMON("\n\tstosw\n\tstosb"); return s;
 	}
+}
+  
 #undef COMMON
 }
 
@@ -606,7 +462,7 @@
 #define __HAVE_ARCH_MEMSET
 #define memset(s, c, count) \
 (__builtin_constant_p(c) ? \
- __constant_c_x_memset((s),(0x01010101UL*(unsigned char)c),(count)) : \
+ __constant_c_x_memset((s),(0x01010101UL*(unsigned char)(c)),(count)) : \
  __memset((s),(c),(count)))
 
 /*
Index: linux/dev/lib/vsprintf.c
===================================================================
RCS file: /home/cvs/gnumach/linux/dev/lib/vsprintf.c,v
retrieving revision 1.1
diff -u -r1.1 vsprintf.c
--- vsprintf.c	1999/04/26 05:50:01	1.1
+++ vsprintf.c	2000/02/07 07:39:11
@@ -131,13 +131,17 @@
   if (sign)
     *str++ = sign;
   if (type & SPECIAL)
-    if (base == 8)
-      *str++ = '0';
-    else if (base == 16)
-      {
-	*str++ = '0';
-	*str++ = digits[33];
-      }
+    {
+      if (base == 8)
+	{
+	  *str++ = '0';
+	}
+      else if (base == 16)
+	{
+	  *str++ = '0';
+	  *str++ = digits[33];
+	}
+    }
   if (!(type & LEFT))
     while (size-- > 0)
       *str++ = c;
Index: linux/src/include/asm-i386/delay.h
===================================================================
RCS file: /home/cvs/gnumach/linux/src/include/asm-i386/delay.h,v
retrieving revision 1.1
diff -u -r1.1 delay.h
--- delay.h	1999/04/26 05:55:42	1.1
+++ delay.h	2000/02/07 07:39:11
@@ -4,60 +4,15 @@
 /*
  * Copyright (C) 1993 Linus Torvalds
  *
- * Delay routines, using a pre-computed "loops_per_second" value.
+ * Delay routines calling functions in arch/i386/lib/delay.c
  */
-
-#include <linux/linkage.h>
-
-#ifdef __SMP__
-#include <asm/smp.h>
-#endif 
-
-extern void __do_delay(void);	/* Special register call calling convention
*/
-
-extern __inline__ void __delay(int loops)
-{
-	__asm__ __volatile__(
-		"call " SYMBOL_NAME_STR(__do_delay)
-		:/* no outputs */
-		:"a" (loops)
-		:"ax");
-}
-
-/*
- * division by multiplication: you don't have to worry about
- * loss of precision.
- *
- * Use only for very small delays ( < 1 msec).  Should probably use a
- * lookup table, really, as the multiplications take much too long with
- * short delays.  This is a "reasonable" implementation, though (and the
- * first constant multiplications gets optimized away if the delay is
- * a constant)
- */
-extern __inline__ void udelay(unsigned long usecs)
-{
-	usecs *= 0x000010c6;		/* 2**32 / 1000000 */
-	__asm__("mull %0"
-		:"=d" (usecs)
-#ifdef __SMP__
-		:"a" (usecs),"0" (cpu_data[smp_processor_id()].udelay_val)
-#else
-		:"a" (usecs),"0" (loops_per_sec)
-#endif
-		:"ax");
-		
-	__delay(usecs);
-}
-
-extern __inline__ unsigned long muldiv(unsigned long a, unsigned long b,
unsigned long c)
-{
-	__asm__("mull %1 ; divl %2"
-		:"=a" (a)
-		:"d" (b),
-		 "r" (c),
-		 "0" (a)
-		:"dx");
-	return a;
-}
+ 
+extern void __udelay(unsigned long usecs);
+extern void __const_udelay(unsigned long usecs);
+extern void __delay(unsigned long loops);
+
+#define udelay(n) (__builtin_constant_p(n) ? \
+	__const_udelay((n) * 0x10c6ul) : \
+	__udelay(n))
 
 #endif /* defined(_I386_DELAY_H) */
Index: linux/src/include/asm-i386/string.h
===================================================================
RCS file: /home/cvs/gnumach/linux/src/include/asm-i386/string.h,v
retrieving revision 1.1
diff -u -r1.1 string.h
--- string.h	1999/04/26 05:55:59	1.1
+++ string.h	2000/02/07 07:39:11
@@ -23,26 +23,29 @@
  * set, making the functions fast and clean. String instructions have been
  * used through-out, making for "slightly" unclear code :-)
  *
- *		Copyright (C) 1991, 1992 Linus Torvalds
+ *		NO Copyright (C) 1991, 1992 Linus Torvalds,
+ *		consider these trivial functions to be PD.
  */
 
 #define __HAVE_ARCH_STRCPY
 extern inline char * strcpy(char * dest,const char *src)
 {
+int d0, d1, d2;
 __asm__ __volatile__(
 	"cld\n"
 	"1:\tlodsb\n\t"
 	"stosb\n\t"
 	"testb %%al,%%al\n\t"
 	"jne 1b"
-	: /* no output */
-	:"S" (src),"D" (dest):"si","di","ax","memory");
+	: "=&S" (d0), "=&D" (d1), "=&a" (d2)
+	:"0" (src),"1" (dest) : "memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRNCPY
 extern inline char * strncpy(char * dest,const char *src,size_t count)
 {
+int d0, d1, d2, d3;
 __asm__ __volatile__(
 	"cld\n"
 	"1:\tdecl %2\n\t"
@@ -54,14 +57,15 @@
 	"rep\n\t"
 	"stosb\n"
 	"2:"
-	: /* no output */
-	:"S" (src),"D" (dest),"c" (count):"si","di","ax","cx","memory");
+	: "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3)
+	:"0" (src),"1" (dest),"2" (count) : "memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRCAT
 extern inline char * strcat(char * dest,const char * src)
 {
+int d0, d1, d2, d3;
 __asm__ __volatile__(
 	"cld\n\t"
 	"repne\n\t"
@@ -71,20 +75,21 @@
 	"stosb\n\t"
 	"testb %%al,%%al\n\t"
 	"jne 1b"
-	: /* no output */
-	:"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx");
+	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+	: "0" (src), "1" (dest), "2" (0), "3" (0xffffffff):"memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRNCAT
 extern inline char * strncat(char * dest,const char * src,size_t count)
 {
+int d0, d1, d2, d3;
 __asm__ __volatile__(
 	"cld\n\t"
 	"repne\n\t"
 	"scasb\n\t"
 	"decl %1\n\t"
-	"movl %4,%3\n"
+	"movl %8,%3\n"
 	"1:\tdecl %3\n\t"
 	"js 2f\n\t"
 	"lodsb\n\t"
@@ -93,15 +98,16 @@
 	"jne 1b\n"
 	"2:\txorl %2,%2\n\t"
 	"stosb"
-	: /* no output */
-	:"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
-	:"si","di","ax","cx","memory");
+	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+	: "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
+	: "memory");
 return dest;
 }
 
 #define __HAVE_ARCH_STRCMP
 extern inline int strcmp(const char * cs,const char * ct)
 {
+int d0, d1;
 register int __res;
 __asm__ __volatile__(
 	"cld\n"
@@ -113,9 +119,10 @@
 	"xorl %%eax,%%eax\n\t"
 	"jmp 3f\n"
 	"2:\tsbbl %%eax,%%eax\n\t"
-	"orb $1,%%eax\n"
+	"orb $1,%%al\n"
 	"3:"
-	:"=a" (__res):"S" (cs),"D" (ct):"si","di");
+	:"=a" (__res), "=&S" (d0), "=&D" (d1)
+		     :"1" (cs),"2" (ct));
 return __res;
 }
 
@@ -123,6 +130,7 @@
 extern inline int strncmp(const char * cs,const char * ct,size_t count)
 {
 register int __res;
+int d0, d1, d2;
 __asm__ __volatile__(
 	"cld\n"
 	"1:\tdecl %3\n\t"
@@ -137,13 +145,15 @@
 	"3:\tsbbl %%eax,%%eax\n\t"
 	"orb $1,%%al\n"
 	"4:"
-	:"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx");
+		     :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
+		     :"1" (cs),"2" (ct),"3" (count));
 return __res;
 }
 
 #define __HAVE_ARCH_STRCHR
 extern inline char * strchr(const char * s, int c)
 {
+int d0;
 register char * __res;
 __asm__ __volatile__(
 	"cld\n\t"
@@ -156,13 +166,14 @@
 	"movl $1,%1\n"
 	"2:\tmovl %1,%0\n\t"
 	"decl %0"
-	:"=a" (__res):"S" (s),"0" (c):"si");
+	:"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
 return __res;
 }
 
 #define __HAVE_ARCH_STRRCHR
 extern inline char * strrchr(const char * s, int c)
 {
+int d0, d1;
 register char * __res;
 __asm__ __volatile__(
 	"cld\n\t"
@@ -173,123 +184,14 @@
 	"leal -1(%%esi),%0\n"
 	"2:\ttestb %%al,%%al\n\t"
 	"jne 1b"
-	:"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si");
-return __res;
-}
-
-#define __HAVE_ARCH_STRSPN
-extern inline size_t strspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"movl %%ecx,%%edx\n"
-	"1:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 2f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"je 1b\n"
-	"2:\tdecl %0"
-	:"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
-	:"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRCSPN
-extern inline size_t strcspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"movl %%ecx,%%edx\n"
-	"1:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 2f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"jne 1b\n"
-	"2:\tdecl %0"
-	:"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
-	:"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRPBRK
-extern inline char * strpbrk(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"movl %%ecx,%%edx\n"
-	"1:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 2f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"jne 1b\n\t"
-	"decl %0\n\t"
-	"jmp 3f\n"
-	"2:\txorl %0,%0\n"
-	"3:"
-	:"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
-	:"ax","cx","dx","di");
+	:"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c));
 return __res;
 }
 
-#define __HAVE_ARCH_STRSTR
-extern inline char * strstr(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"cld\n\t" \
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"	/* NOTE! This also sets Z if searchstring=''
*/
-	"movl %%ecx,%%edx\n"
-	"1:\tmovl %4,%%edi\n\t"
-	"movl %%esi,%%eax\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repe\n\t"
-	"cmpsb\n\t"
-	"je 2f\n\t"		/* also works for empty string, see above */
-	"xchgl %%eax,%%esi\n\t"
-	"incl %%esi\n\t"
-	"cmpb $0,-1(%%eax)\n\t"
-	"jne 1b\n\t"
-	"xorl %%eax,%%eax\n\t"
-	"2:"
-	:"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct)
-	:"cx","dx","di","si");
-return __res;
-}
-
 #define __HAVE_ARCH_STRLEN
 extern inline size_t strlen(const char * s)
 {
+int d0;
 register int __res;
 __asm__ __volatile__(
 	"cld\n\t"
@@ -297,86 +199,26 @@
 	"scasb\n\t"
 	"notl %0\n\t"
 	"decl %0"
-	:"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di");
-return __res;
-}
-
-#define __HAVE_ARCH_STRTOK
-extern inline char * strtok(char * s,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
-	"testl %1,%1\n\t"
-	"jne 1f\n\t"
-	"testl %0,%0\n\t"
-	"je 8f\n\t"
-	"movl %0,%1\n"
-	"1:\txorl %0,%0\n\t"
-	"movl $-1,%%ecx\n\t"
-	"xorl %%eax,%%eax\n\t"
-	"cld\n\t"
-	"movl %4,%%edi\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"notl %%ecx\n\t"
-	"decl %%ecx\n\t"
-	"je 7f\n\t"			/* empty delimiter-string */
-	"movl %%ecx,%%edx\n"
-	"2:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 7f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"je 2b\n\t"
-	"decl %1\n\t"
-	"cmpb $0,(%1)\n\t"
-	"je 7f\n\t"
-	"movl %1,%0\n"
-	"3:\tlodsb\n\t"
-	"testb %%al,%%al\n\t"
-	"je 5f\n\t"
-	"movl %4,%%edi\n\t"
-	"movl %%edx,%%ecx\n\t"
-	"repne\n\t"
-	"scasb\n\t"
-	"jne 3b\n\t"
-	"decl %1\n\t"
-	"cmpb $0,(%1)\n\t"
-	"je 5f\n\t"
-	"movb $0,(%1)\n\t"
-	"incl %1\n\t"
-	"jmp 6f\n"
-	"5:\txorl %1,%1\n"
-	"6:\tcmpb $0,(%0)\n\t"
-	"jne 7f\n\t"
-	"xorl %0,%0\n"
-	"7:\ttestl %0,%0\n\t"
-	"jne 8f\n\t"
-	"movl %0,%1\n"
-	"8:"
-	:"=b" (__res),"=S" (___strtok)
-	:"0" (___strtok),"1" (s),"g" (ct)
-	:"ax","cx","dx","di","memory");
+	:"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffff));
 return __res;
 }
 
 extern inline void * __memcpy(void * to, const void * from, size_t n)
 {
+int d0, d1, d2;
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep ; movsl\n\t"
-	"testb $2,%b1\n\t"
+	"testb $2,%b4\n\t"
 	"je 1f\n\t"
 	"movsw\n"
-	"1:\ttestb $1,%b1\n\t"
+	"1:\ttestb $1,%b4\n\t"
 	"je 2f\n\t"
 	"movsb\n"
 	"2:"
-	: /* no output */
-	:"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from)
-	: "cx","di","si","memory");
+	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
+	:"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
+	: "memory");
 return (to);
 }
 
@@ -402,6 +244,10 @@
 		case 4:
 			*(unsigned long *)to = *(const unsigned long *)from;
 			return to;
+		case 6:	/* for Ethernet addresses */
+			*(unsigned long *)to = *(const unsigned long *)from;
+			*(2+(unsigned short *)to) = *(2+(const unsigned
short *)from);
+			return to;
 		case 8:
 			*(unsigned long *)to = *(const unsigned long *)from;
 			*(1+(unsigned long *)to) = *(1+(const unsigned long
*)from);
@@ -426,19 +272,23 @@
 			return to;
 	}
 #define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__ __volatile__( \
+	"cld\n\t" \
 	"rep ; movsl" \
 	x \
-	: /* no outputs */ \
-	: "c" (n/4),"D" ((long) to),"S" ((long) from) \
-	: "cx","di","si","memory");
-
+	: "=&c" (d0), "=&D" (d1), "=&S" (d2) \
+	: "0" (n/4),"1" ((long) to),"2" ((long) from) \
+	: "memory");
+{
+	int d0, d1, d2;
 	switch (n % 4) {
 		case 0: COMMON(""); return to;
 		case 1: COMMON("\n\tmovsb"); return to;
 		case 2: COMMON("\n\tmovsw"); return to;
-		case 3: COMMON("\n\tmovsw\n\tmovsb"); return to;
+		default: COMMON("\n\tmovsw\n\tmovsb"); return to;
 	}
+}
+  
 #undef COMMON
 }
 
@@ -451,25 +301,26 @@
 #define __HAVE_ARCH_MEMMOVE
 extern inline void * memmove(void * dest,const void * src, size_t n)
 {
+int d0, d1, d2;
 if (dest<src)
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep\n\t"
 	"movsb"
-	: /* no output */
-	:"c" (n),"S" (src),"D" (dest)
-	:"cx","si","di");
+	: "=&c" (d0), "=&S" (d1), "=&D" (d2)
+	:"0" (n),"1" (src),"2" (dest)
+	: "memory");
 else
 __asm__ __volatile__(
 	"std\n\t"
 	"rep\n\t"
 	"movsb\n\t"
 	"cld"
-	: /* no output */
-	:"c" (n),
-	 "S" (n-1+(const char *)src),
-	 "D" (n-1+(char *)dest)
-	:"cx","si","di","memory");
+	: "=&c" (d0), "=&S" (d1), "=&D" (d2)
+	:"0" (n),
+	 "1" (n-1+(const char *)src),
+	 "2" (n-1+(char *)dest)
+	:"memory");
 return dest;
 }
 
@@ -478,6 +329,7 @@
 #define __HAVE_ARCH_MEMCHR
 extern inline void * memchr(const void * cs,int c,size_t count)
 {
+int d0;
 register void * __res;
 if (!count)
 	return NULL;
@@ -488,20 +340,20 @@
 	"je 1f\n\t"
 	"movl $1,%0\n"
 	"1:\tdecl %0"
-	:"=D" (__res):"a" (c),"D" (cs),"c" (count)
-	:"cx");
+	:"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count));
 return __res;
 }
 
 extern inline void * __memset_generic(void * s, char c,size_t count)
 {
+int d0, d1;
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep\n\t"
 	"stosb"
-	: /* no output */
-	:"a" (c),"D" (s),"c" (count)
-	:"cx","di","memory");
+	: "=&c" (d0), "=&D" (d1)
+	:"a" (c),"1" (s),"0" (count)
+	:"memory");
 return s;
 }
 
@@ -515,19 +367,20 @@
  */
 extern inline void * __constant_c_memset(void * s, unsigned long c, size_t
count)
 {
+int d0, d1;
 __asm__ __volatile__(
 	"cld\n\t"
 	"rep ; stosl\n\t"
-	"testb $2,%b1\n\t"
+	"testb $2,%b3\n\t"
 	"je 1f\n\t"
 	"stosw\n"
-	"1:\ttestb $1,%b1\n\t"
+	"1:\ttestb $1,%b3\n\t"
 	"je 2f\n\t"
 	"stosb\n"
 	"2:"
-	: /* no output */
-	:"a" (c), "q" (count), "c" (count/4), "D" ((long) s)
-	:"cx","di","memory");
+	: "=&c" (d0), "=&D" (d1)
+	:"a" (c), "q" (count), "0" (count/4), "1" ((long) s)
+	:"memory");
 return (s);	
 }
 
@@ -535,20 +388,20 @@
 #define __HAVE_ARCH_STRNLEN
 extern inline size_t strnlen(const char * s, size_t count)
 {
+int d0;
 register int __res;
 __asm__ __volatile__(
-	"movl %1,%0\n\t"
+	"movl %2,%0\n\t"
 	"jmp 2f\n"
 	"1:\tcmpb $0,(%0)\n\t"
 	"je 3f\n\t"
 	"incl %0\n"
-	"2:\tdecl %2\n\t"
-	"cmpl $-1,%2\n\t"
+	"2:\tdecl %1\n\t"
+	"cmpl $-1,%1\n\t"
 	"jne 1b\n"
-	"3:\tsubl %1,%0"
-	:"=a" (__res)
-	:"c" (s),"d" (count)
-	:"dx");
+	"3:\tsubl %2,%0"
+	:"=a" (__res), "=&d" (d0)
+	:"c" (s),"1" (count));
 return __res;
 }
 /* end of additional stuff */
@@ -577,19 +430,22 @@
 			return s;
 	}
 #define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__  __volatile__("cld\n\t" \
 	"rep ; stosl" \
 	x \
-	: /* no outputs */ \
-	: "a" (pattern),"c" (count/4),"D" ((long) s) \
-	: "cx","di","memory")
-
+	: "=&c" (d0), "=&D" (d1) \
+	: "a" (pattern),"0" (count/4),"1" ((long) s) \
+	: "memory")
+{
+	int d0, d1;
 	switch (count % 4) {
 		case 0: COMMON(""); return s;
 		case 1: COMMON("\n\tstosb"); return s;
 		case 2: COMMON("\n\tstosw"); return s;
-		case 3: COMMON("\n\tstosw\n\tstosb"); return s;
+		default: COMMON("\n\tstosw\n\tstosb"); return s;
 	}
+}
+  
 #undef COMMON
 }
 
@@ -606,7 +462,7 @@
 #define __HAVE_ARCH_MEMSET
 #define memset(s, c, count) \
 (__builtin_constant_p(c) ? \
- __constant_c_x_memset((s),(0x01010101UL*(unsigned char)c),(count)) : \
+ __constant_c_x_memset((s),(0x01010101UL*(unsigned char)(c)),(count)) : \
  __memset((s),(c),(count)))
 
 /*


Reply to: