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 <[EMAIL PROTECTED]>
 *
 *      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 <[EMAIL PROTECTED]>
+
+       * 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  <[EMAIL PROTECTED]>
 
        * 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 via email to