summaryrefslogtreecommitdiff
path: root/sysdeps/alpha
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/alpha')
-rw-r--r--sysdeps/alpha/DEFS.h27
-rw-r--r--sysdeps/alpha/Dist4
-rw-r--r--sysdeps/alpha/Implies2
-rw-r--r--sysdeps/alpha/Makefile94
-rw-r--r--sysdeps/alpha/__longjmp.c91
-rw-r--r--sysdeps/alpha/__math.h35
-rw-r--r--sysdeps/alpha/bsd-_setjmp.S30
-rw-r--r--sysdeps/alpha/bsd-setjmp.S30
-rw-r--r--sysdeps/alpha/bytesex.h3
-rw-r--r--sysdeps/alpha/copysign.c31
-rw-r--r--sysdeps/alpha/divl.S54
-rw-r--r--sysdeps/alpha/divlu.S54
-rw-r--r--sysdeps/alpha/divq.S51
-rw-r--r--sysdeps/alpha/divqu.S57
-rw-r--r--sysdeps/alpha/divrem.m448
-rw-r--r--sysdeps/alpha/fabs.c28
-rw-r--r--sysdeps/alpha/gmp-mparam.h26
-rw-r--r--sysdeps/alpha/jmp_buf.h46
-rw-r--r--sysdeps/alpha/macros.m434
-rw-r--r--sysdeps/alpha/memchr.c86
-rw-r--r--sysdeps/alpha/reml.S57
-rw-r--r--sysdeps/alpha/remlu.S57
-rw-r--r--sysdeps/alpha/remq.S54
-rw-r--r--sysdeps/alpha/remqu.S60
-rw-r--r--sysdeps/alpha/setjmp.S29
-rw-r--r--sysdeps/alpha/setjmp_aux.c74
-rw-r--r--sysdeps/alpha/strchr.c84
-rw-r--r--sysdeps/alpha/strlen.c54
-rw-r--r--sysdeps/alpha/udiv_qrnnd.S152
29 files changed, 1452 insertions, 0 deletions
diff --git a/sysdeps/alpha/DEFS.h b/sysdeps/alpha/DEFS.h
new file mode 100644
index 0000000000..c2a4fc88ae
--- /dev/null
+++ b/sysdeps/alpha/DEFS.h
@@ -0,0 +1,27 @@
+#ifdef __STDC__
+#define FUNC__(name) \
+ .align 3; \
+ .globl __##name; \
+ .ent __##name; \
+ __##name: \
+ lda sp, -16(sp); \
+ .frame sp, 16, t9, 0; \
+ .prologue 0
+#else
+#define FUNC__(name) \
+ .align 3; \
+ .globl __/**/name; \
+ .ent __/**/name,0; \
+ __/**/name: \
+ lda sp, -16(sp); \
+ .frame sp, 16, t9, 0; \
+ .prologue 0
+#endif
+
+#ifdef __STDC__
+#define NAME__(name) \
+ __##name
+#else
+#define NAME__(name) \
+ __/**/name
+#endif
diff --git a/sysdeps/alpha/Dist b/sysdeps/alpha/Dist
new file mode 100644
index 0000000000..c4ea856629
--- /dev/null
+++ b/sysdeps/alpha/Dist
@@ -0,0 +1,4 @@
+setjmp_aux.c
+DEFS.h
+divrem.m4 macros.m4
+divl.S divlu.S divq.S divqu.S reml.S remlu.S remq.S remqu.S
diff --git a/sysdeps/alpha/Implies b/sysdeps/alpha/Implies
new file mode 100644
index 0000000000..93234096f0
--- /dev/null
+++ b/sysdeps/alpha/Implies
@@ -0,0 +1,2 @@
+# Alpha uses IEEE 754 floating point.
+ieee754
diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile
new file mode 100644
index 0000000000..06621b824d
--- /dev/null
+++ b/sysdeps/alpha/Makefile
@@ -0,0 +1,94 @@
+# Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
+# Contributed by Brendan Kehoe (brendan@zen.org).
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public License
+# as published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public
+# License along with the GNU C Library; see the file COPYING.LIB. If
+# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+# Cambridge, MA 02139, USA.
+
+ifeq ($(subdir),setjmp)
+sysdep_routines := $(sysdep_routines) setjmp_aux
+endif
+
+ifeq ($(subdir),gnulib)
+routines = $(divrem)
+endif # gnulib
+
+# We distribute these files, even though they are generated,
+# so as to avoid the need for a functioning m4 to build the library.
+divrem := divl divlu divq divqu reml remlu remq remqu
+
++divrem-NAME-divl := divl
++divrem-NAME-divlu := divlu
++divrem-NAME-divq := divq
++divrem-NAME-divqu := divqu
++divrem-NAME-reml := reml
++divrem-NAME-remlu := remlu
++divrem-NAME-remq := remq
++divrem-NAME-remqu := remqu
++divrem-NAME = $(+divrem-NAME-$(basename $(notdir $@)))
+
++divrem-OP-divl := divl
++divrem-OP-divlu := divlu
++divrem-OP-divq := divq
++divrem-OP-divqu := divqu
++divrem-OP-reml := reml
++divrem-OP-remlu := remlu
++divrem-OP-remq := remq
++divrem-OP-remqu := remqu
++divrem-BASEOP-divl := div
++divrem-BASEOP-divlu := div
++divrem-BASEOP-divq := div
++divrem-BASEOP-divqu := div
++divrem-BASEOP-reml := rem
++divrem-BASEOP-remlu := rem
++divrem-BASEOP-remq := rem
++divrem-BASEOP-remqu := rem
++divrem-S-divl := true
++divrem-S-divlu := false
++divrem-S-divq := true
++divrem-S-divqu := false
++divrem-S-reml := true
++divrem-S-remlu := false
++divrem-S-remq := true
++divrem-S-remqu := false
++divrem-SIZE-divl := l
++divrem-SIZE-divlu := l
++divrem-SIZE-divq := q
++divrem-SIZE-divqu := q
++divrem-SIZE-reml := l
++divrem-SIZE-remlu := l
++divrem-SIZE-remq := q
++divrem-SIZE-remqu := q
++divrem-MODE-divl := l
++divrem-MODE-divlu := lu
++divrem-MODE-divq := q
++divrem-MODE-divqu := qu
++divrem-MODE-reml := l
++divrem-MODE-remlu := lu
++divrem-MODE-remq := q
++divrem-MODE-remqu := qu
+
+$(divrem:%=$(sysdep_dir)/alpha/%.S): $(sysdep_dir)/alpha/divrem.m4 $(sysdep_dir)/alpha/DEFS.h $(sysdep_dir)/alpha/macros.m4
+ (echo "define(OP,\`$(+divrem-NAME)')\
+ define(BASEOP,\`$(+divrem-BASEOP-$(+divrem-NAME))')\
+ define(MODE,\`$(+divrem-MODE-$(+divrem-NAME))')\
+ define(SIZE,\`$(+divrem-SIZE-$(+divrem-NAME))')\
+ define(SIGNED,\`$(+divrem-S-$(+divrem-NAME))')\
+ define(SYSDEP_DIR, \`$(sysdep_dir)/alpha')\
+ /* This file is generated from divrem.m4; DO NOT EDIT! */"; \
+ cat $<) | $(M4) > $@-tmp
+# Make it unwritable so noone will edit it by mistake.
+ -chmod a-w $@-tmp
+ mv -f $@-tmp $@
+ test -d CVS && cvs commit -m'Regenerated from $<' $@
diff --git a/sysdeps/alpha/__longjmp.c b/sysdeps/alpha/__longjmp.c
new file mode 100644
index 0000000000..19a2e26696
--- /dev/null
+++ b/sysdeps/alpha/__longjmp.c
@@ -0,0 +1,91 @@
+/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* Global register vars must come before any function defn. */
+
+register long int
+ r9 asm ("$9"), r10 asm ("$10"), r11 asm ("$11"), r12 asm ("$12"),
+ r13 asm ("$13"), r14 asm ("$14");
+
+register long int *fp asm ("$15"), *sp asm ("$30"), *retpc asm ("$26");
+
+#if 1 /* XXX */
+register double
+ f2 asm ("$f2"), f3 asm ("$f3"), f4 asm ("$f4"), f5 asm ("$f5"),
+ f6 asm ("$f6"), f7 asm ("$f7"), f8 asm ("$f8"), f9 asm ("$f9");
+#endif
+
+#include <setjmp.h>
+
+
+/* Jump to the position specified by ENV, causing the
+ setjmp call there to return VAL, or 1 if VAL is 0. */
+__NORETURN
+void
+__longjmp (const __jmp_buf env, int val)
+{
+ /* Restore the integer registers. */
+ r9 = env[0].__9;
+ r10 = env[0].__10;
+ r11 = env[0].__11;
+ r12 = env[0].__12;
+ r13 = env[0].__13;
+ r14 = env[0].__14;
+
+#if 1 /* XXX */
+ /* Restore the floating point registers. */
+ f2 = env[0].__f2;
+ f3 = env[0].__f3;
+ f4 = env[0].__f4;
+ f5 = env[0].__f5;
+ f6 = env[0].__f6;
+ f7 = env[0].__f7;
+ f8 = env[0].__f8;
+ f9 = env[0].__f9;
+#endif
+
+ /* Set the return PC to that of setjmp's caller. */
+ retpc = env[0].__pc;
+
+ /* Restore the FP and SP of setjmp's caller. */
+ fp = env[0].__fp;
+ sp = env[0].__sp;
+
+ /* Return VAL (or 1 if VAL is zero) to setjmp's caller.
+
+ We use an asm here rather than a normal C return statement
+ just in case the compiler wanted to do some stack frobnication
+ in the function epilogue. Since we have already restored
+ precisely the FP and SP the desired environment needs,
+ we must avoid the compiler doing anything with the stack. */
+
+ while (1)
+ {
+ /* The loop is just to avoid `volatile function does return' warnings.
+ The instruction will only be executed once. */
+
+ register long int retval asm ("$0");
+
+ asm volatile
+ ("cmoveq %1, 1, %0\n\t" /* $0 = val ?: 1; */
+ "ret $31, (%2), 1" /* return $0 */
+ : "=r" (retval)
+ /* The "0" constraint should force VAL into $0. */
+ : "0" (val), "r" (retpc));
+ }
+}
diff --git a/sysdeps/alpha/__math.h b/sysdeps/alpha/__math.h
new file mode 100644
index 0000000000..b06f716c50
--- /dev/null
+++ b/sysdeps/alpha/__math.h
@@ -0,0 +1,35 @@
+/* Copyright (C) 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#if defined (__GNUC__) && !defined (__NO_MATH_INLINES)
+
+extern __inline __CONSTVALUE double
+__copysign (double __x, double __y)
+{
+ __asm ("cpys %1, %2, %0" : "=f" (__x) : "f" (__y), "f" (__x));
+ return __x;
+}
+
+extern __inline double
+fabs (double __x)
+{
+ __asm ("cpys $f31, %1, %0" : "=f" (__x) : "f" (__x));
+ return __x;
+}
+
+#endif
diff --git a/sysdeps/alpha/bsd-_setjmp.S b/sysdeps/alpha/bsd-_setjmp.S
new file mode 100644
index 0000000000..9947d8f45a
--- /dev/null
+++ b/sysdeps/alpha/bsd-_setjmp.S
@@ -0,0 +1,30 @@
+/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Alpha version.
+Copyright (C) 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (setjmp)
+ lda $27, __sigsetjmp /* Load address to jump to. */
+ bis $31, $31, $17 /* Pass a second argument of zero. */
+ jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp. */
+ .end setjmp
diff --git a/sysdeps/alpha/bsd-setjmp.S b/sysdeps/alpha/bsd-setjmp.S
new file mode 100644
index 0000000000..470f7bc47d
--- /dev/null
+++ b/sysdeps/alpha/bsd-setjmp.S
@@ -0,0 +1,30 @@
+/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Alpha version.
+Copyright (C) 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (setjmp)
+ lda $27, __sigsetjmp /* Load address to jump to. */
+ bis $31, 1, $17 /* Pass a second argument of one. */
+ jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp. */
+ .end setjmp
diff --git a/sysdeps/alpha/bytesex.h b/sysdeps/alpha/bytesex.h
new file mode 100644
index 0000000000..e873d2123c
--- /dev/null
+++ b/sysdeps/alpha/bytesex.h
@@ -0,0 +1,3 @@
+/* Alpha is little-endian. */
+
+#define __BYTE_ORDER __LITTLE_ENDIAN
diff --git a/sysdeps/alpha/copysign.c b/sysdeps/alpha/copysign.c
new file mode 100644
index 0000000000..69544b01fb
--- /dev/null
+++ b/sysdeps/alpha/copysign.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1992, 1993, 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#define __NO_MATH_INLINES
+
+#include <math.h>
+
+/* Return X with its sign changed to Y's. */
+__inline double
+__copysign (double __x, double __y)
+{
+ __asm ("cpys %1, %2, %0" : "=f" (__x) : "f" (__y), "f" (__x));
+ return __x;
+}
+
+weak_alias (__copysign, copysign)
diff --git a/sysdeps/alpha/divl.S b/sysdeps/alpha/divl.S
new file mode 100644
index 0000000000..7ae3e0cc13
--- /dev/null
+++ b/sysdeps/alpha/divl.S
@@ -0,0 +1,54 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(divl)
+ /* First set up the dividend. */
+ sextl t10, t10
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+
+
+ /* Then set up the divisor. */
+ sextl t11, t11
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+ sextl t12, t12
+
+
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(divl)
diff --git a/sysdeps/alpha/divlu.S b/sysdeps/alpha/divlu.S
new file mode 100644
index 0000000000..9ae5950c53
--- /dev/null
+++ b/sysdeps/alpha/divlu.S
@@ -0,0 +1,54 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(divlu)
+ /* First set up the dividend. */
+ zapnot t10, 0xf, t10
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+
+
+ /* Then set up the divisor. */
+ zapnot t11, 0xf, t11
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+ sextl t12, t12
+
+
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(divlu)
diff --git a/sysdeps/alpha/divq.S b/sysdeps/alpha/divq.S
new file mode 100644
index 0000000000..79ff6ca7c5
--- /dev/null
+++ b/sysdeps/alpha/divq.S
@@ -0,0 +1,51 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(divq)
+ /* First set up the dividend. */
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+
+
+ /* Then set up the divisor. */
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+
+
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(divq)
diff --git a/sysdeps/alpha/divqu.S b/sysdeps/alpha/divqu.S
new file mode 100644
index 0000000000..7908b9f77d
--- /dev/null
+++ b/sysdeps/alpha/divqu.S
@@ -0,0 +1,57 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(divqu)
+ /* First set up the dividend. */
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+ ldit $f26, 18446744073709551616.0
+ addt $f26, $f10, $f26
+ fcmovlt $f10, $f26, $f10
+
+
+ /* Then set up the divisor. */
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+ ldit $f26, 18446744073709551616.0
+ addt $f26, $f1, $f26
+ fcmovlt $f1, $f26, $f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+
+
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(divqu)
diff --git a/sysdeps/alpha/divrem.m4 b/sysdeps/alpha/divrem.m4
new file mode 100644
index 0000000000..5942cf447f
--- /dev/null
+++ b/sysdeps/alpha/divrem.m4
@@ -0,0 +1,48 @@
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+define(path, `SYSDEP_DIR/macros.m4')dnl
+include(path)
+
+FUNC__(OP)
+ /* First set up the dividend. */
+ EXTEND(t10)
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+ ADJQU($f10)
+
+ /* Then set up the divisor. */
+ EXTEND(t11)
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+ ADJQU($f1)
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+ FULLEXTEND(t12)
+
+ DOREM
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(OP)
diff --git a/sysdeps/alpha/fabs.c b/sysdeps/alpha/fabs.c
new file mode 100644
index 0000000000..321df0d1e1
--- /dev/null
+++ b/sysdeps/alpha/fabs.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#define __NO_MATH_INLINES
+
+#include <math.h>
+
+__inline double
+fabs (double __x)
+{
+ __asm ("cpys $f31, %1, %0" : "=f" (__x) : "f" (__x));
+ return __x;
+}
diff --git a/sysdeps/alpha/gmp-mparam.h b/sysdeps/alpha/gmp-mparam.h
new file mode 100644
index 0000000000..05c893f790
--- /dev/null
+++ b/sysdeps/alpha/gmp-mparam.h
@@ -0,0 +1,26 @@
+/* gmp-mparam.h -- Compiler/machine parameter header file.
+
+Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Library General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The GNU MP Library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with the GNU MP Library; see the file COPYING.LIB. If not, write to
+the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#define BITS_PER_MP_LIMB 64
+#define BYTES_PER_MP_LIMB 8
+#define BITS_PER_LONGINT 64
+#define BITS_PER_INT 32
+#define BITS_PER_SHORTINT 16
+#define BITS_PER_CHAR 8
diff --git a/sysdeps/alpha/jmp_buf.h b/sysdeps/alpha/jmp_buf.h
new file mode 100644
index 0000000000..6e6f6b4727
--- /dev/null
+++ b/sysdeps/alpha/jmp_buf.h
@@ -0,0 +1,46 @@
+/* Define the machine-dependent type `jmp_buf'. Alpha version.
+Copyright (C) 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+typedef struct
+ {
+ /* Integer registers:
+ $0 is the return value;
+ $1-$8, $22-$25, $28 are call-used;
+ $9-$14 we save here;
+ $15 is the FP and we save it here;
+ $16-$21 are input arguments (call-used);
+ $26 is the return PC and we save it here;
+ $27 is the procedure value (i.e., the address of __setjmp);
+ $29 is the global pointer, which the caller will reconstruct
+ from the return address restored in $26;
+ $30 is the stack pointer and we save it here;
+ $31 is always zero. */
+ long int __9, __10, __11, __12, __13, __14;
+ long int *__pc, *__fp, *__sp;
+
+#if 1 /* XXX need predefine for TARGET_FPREGS */
+ /* Floating-point registers:
+ $f0 is the floating return value;
+ $f1, $f10-$f15, $f22-$f30 are call-used;
+ $f2-$f9 we save here;
+ $f16-$21 are input args (call-used);
+ $f31 is always zero. */
+ double __f2, __f3, __f4, __f5, __f6, __f7, __f8, __f9;
+#endif /* Have FP regs. */
+ } __jmp_buf[1];
diff --git a/sysdeps/alpha/macros.m4 b/sysdeps/alpha/macros.m4
new file mode 100644
index 0000000000..f8c1fe9662
--- /dev/null
+++ b/sysdeps/alpha/macros.m4
@@ -0,0 +1,34 @@
+dnl NOTE: The $1 below is the argument to EXTEND, not register $1.
+define(EXTEND,
+`ifelse(SIZE, `l',
+`ifelse(SIGNED, `true',
+` sextl $1, $1
+',dnl
+` zapnot $1, 0xf, $1
+')')')dnl
+
+dnl FULLEXTEND -- extend the register named in the first argument
+define(FULLEXTEND,
+`ifelse(SIZE, `l',
+` sextl $1, $1
+')')dnl
+
+dnl This is used by divqu.
+define(ADJQU,
+`ifelse(MODE, `qu',
+` ldit $f26, 18446744073709551616.0
+ addt $f26, $1, $f26
+ fcmovlt $1, $f26, $1
+')')dnl
+
+define(DOREM,
+`ifelse(BASEOP, `rem',
+` /* Compute the remainder. */
+ifelse(SIZE, `l',
+` mull t11, t12, t11
+ subl t10, t11, t12
+',dnl Note mulq/subq were only really used in remq, but we will find out
+dnl if assuming they apply to remqu as well is wrong or not.
+` mulq t11, t12, t11
+ subq t10, t11, t12
+')')')dnl
diff --git a/sysdeps/alpha/memchr.c b/sysdeps/alpha/memchr.c
new file mode 100644
index 0000000000..11ff542f25
--- /dev/null
+++ b/sysdeps/alpha/memchr.c
@@ -0,0 +1,86 @@
+/* Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <string.h>
+
+/* Search no more than N bytes of S for C. */
+
+void *
+memchr (const void *s, int c, size_t n)
+{
+ const char *char_ptr;
+ const unsigned long int *longword_ptr;
+ unsigned long int charmask;
+ size_t x;
+
+ c = (unsigned char) c;
+
+ /* Handle the first few characters by reading one character at a time.
+ Do this until STR is aligned on a 8-byte border. */
+ for (char_ptr = s; n > 0 && ((unsigned long int) char_ptr & 7) != 0;
+ --n, ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ if (n == (size_t)0)
+ return NULL;
+
+ x = n;
+
+ longword_ptr = (unsigned long int *) char_ptr;
+
+ /* Set up a longword, each of whose bytes is C. */
+ charmask = c | (c << 8);
+ charmask |= charmask << 16;
+ charmask |= charmask << 32;
+
+ for (;;)
+ {
+ const unsigned long int longword = *longword_ptr++;
+ int ge, le;
+
+ if (x < 4)
+ x = (size_t) 0;
+ else
+ x -= 4;
+
+ /* Set bits in GE if bytes in CHARMASK are >= bytes in LONGWORD. */
+ asm ("cmpbge %1, %2, %0" : "=r" (ge) : "r" (charmask), "r" (longword));
+
+ /* Set bits in LE if bytes in CHARMASK are <= bytes in LONGWORD. */
+ asm ("cmpbge %2, %1, %0" : "=r" (le) : "r" (charmask), "r" (longword));
+
+ /* Bytes that are both <= and >= are == to C. */
+ if (ge & le)
+ {
+ /* Which of the bytes was the C? */
+
+ unsigned char *cp = (unsigned char *) (longword_ptr - 1);
+ int i;
+
+ for (i = 0; i < 6; i++)
+ if (cp[i] == c)
+ return &cp[i];
+ return &cp[7];
+ }
+
+ if (x == (size_t)0)
+ break;
+ }
+
+ return NULL;
+}
diff --git a/sysdeps/alpha/reml.S b/sysdeps/alpha/reml.S
new file mode 100644
index 0000000000..2ece297f09
--- /dev/null
+++ b/sysdeps/alpha/reml.S
@@ -0,0 +1,57 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(reml)
+ /* First set up the dividend. */
+ sextl t10, t10
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+
+
+ /* Then set up the divisor. */
+ sextl t11, t11
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+ sextl t12, t12
+
+
+ /* Compute the remainder. */
+ mull t11, t12, t11
+ subl t10, t11, t12
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(reml)
diff --git a/sysdeps/alpha/remlu.S b/sysdeps/alpha/remlu.S
new file mode 100644
index 0000000000..d7700e6595
--- /dev/null
+++ b/sysdeps/alpha/remlu.S
@@ -0,0 +1,57 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(remlu)
+ /* First set up the dividend. */
+ zapnot t10, 0xf, t10
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+
+
+ /* Then set up the divisor. */
+ zapnot t11, 0xf, t11
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+ sextl t12, t12
+
+
+ /* Compute the remainder. */
+ mull t11, t12, t11
+ subl t10, t11, t12
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(remlu)
diff --git a/sysdeps/alpha/remq.S b/sysdeps/alpha/remq.S
new file mode 100644
index 0000000000..47510cbc8e
--- /dev/null
+++ b/sysdeps/alpha/remq.S
@@ -0,0 +1,54 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(remq)
+ /* First set up the dividend. */
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+
+
+ /* Then set up the divisor. */
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+
+
+ /* Compute the remainder. */
+ mulq t11, t12, t11
+ subq t10, t11, t12
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(remq)
diff --git a/sysdeps/alpha/remqu.S b/sysdeps/alpha/remqu.S
new file mode 100644
index 0000000000..ec9572dd62
--- /dev/null
+++ b/sysdeps/alpha/remqu.S
@@ -0,0 +1,60 @@
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/* For each N divided by D, we do:
+ result = (double) N / (double) D
+ Then, for each N mod D, we do:
+ result = N - (D * divMODE (N, D))
+
+ FIXME:
+ The q and qu versions won't deal with operands > 50 bits. We also
+ don't check for divide by zero. */
+
+#include "DEFS.h"
+#if 0
+/* We do not handle div by zero yet. */
+#include <machine/pal.h>
+#endif
+#include <sysdep.h>
+
+
+
+
+
+
+FUNC__(remqu)
+ /* First set up the dividend. */
+
+ stq t10,0(sp)
+ ldt $f10,0(sp)
+ cvtqt $f10,$f10
+ ldit $f26, 18446744073709551616.0
+ addt $f26, $f10, $f26
+ fcmovlt $f10, $f26, $f10
+
+
+ /* Then set up the divisor. */
+
+ stq t11,0(sp)
+ ldt $f1,0(sp)
+ cvtqt $f1,$f1
+ ldit $f26, 18446744073709551616.0
+ addt $f26, $f1, $f26
+ fcmovlt $f1, $f26, $f1
+
+
+ /* Do the division. */
+ divt $f10,$f1,$f10
+ cvttqc $f10,$f10
+
+ /* Put the result in t12. */
+ stt $f10,0(sp)
+ ldq t12,0(sp)
+
+
+ /* Compute the remainder. */
+ mulq t11, t12, t11
+ subq t10, t11, t12
+
+
+ lda sp,16(sp)
+ ret zero,(t9),1
+ .end NAME__(remqu)
diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S
new file mode 100644
index 0000000000..08932ccd1a
--- /dev/null
+++ b/sysdeps/alpha/setjmp.S
@@ -0,0 +1,29 @@
+/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+/* The function __sigsetjmp_aux saves all the registers, but it can't
+ reliably access the stack or frame pointers, so we pass them in as
+ extra arguments. */
+ENTRY (__sigsetjmp)
+ lda $27, __sigsetjmp_aux/* Load address to jump to. */
+ bis $15, $15, $18 /* Pass FP as 3rd arg. */
+ bis $30, $30, $19 /* Pass SP as 4th arg. */
+ jmp $31, ($27), __sigsetjmp_aux /* Call __sigsetjmp_aux. */
+ .end __sigsetjmp
diff --git a/sysdeps/alpha/setjmp_aux.c b/sysdeps/alpha/setjmp_aux.c
new file mode 100644
index 0000000000..f92517be92
--- /dev/null
+++ b/sysdeps/alpha/setjmp_aux.c
@@ -0,0 +1,74 @@
+/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* Global register decls must come before any function defn. */
+
+register long int
+ r9 asm ("$9"), r10 asm ("$10"), r11 asm ("$11"), r12 asm ("$12"),
+ r13 asm ("$13"), r14 asm ("$14");
+
+register long int *fp asm ("$15"), *sp asm ("$30"), *retpc asm ("$26");
+
+#if 1 /* XXX */
+register double
+ f2 asm ("$f2"), f3 asm ("$f3"), f4 asm ("$f4"), f5 asm ("$f5"),
+ f6 asm ("$f6"), f7 asm ("$f7"), f8 asm ("$f8"), f9 asm ("$f9");
+#endif
+
+
+#include <setjmp.h>
+
+
+/* Save the current program position in ENV and return 0. */
+int
+__sigsetjmp_aux (sigjmp_buf env, int savemask, long int *sp, long int *fp)
+{
+ /* Save the integer registers. */
+ env[0].__jmpbuf[0].__9 = r9;
+ env[0].__jmpbuf[0].__10 = r10;
+ env[0].__jmpbuf[0].__11 = r11;
+ env[0].__jmpbuf[0].__12 = r12;
+ env[0].__jmpbuf[0].__13 = r13;
+ env[0].__jmpbuf[0].__14 = r14;
+
+#if 1 /* XXX */
+ /* Save the floating point registers. */
+ env[0].__jmpbuf[0].__f2 = f2;
+ env[0].__jmpbuf[0].__f3 = f3;
+ env[0].__jmpbuf[0].__f4 = f4;
+ env[0].__jmpbuf[0].__f5 = f5;
+ env[0].__jmpbuf[0].__f6 = f6;
+ env[0].__jmpbuf[0].__f7 = f7;
+ env[0].__jmpbuf[0].__f8 = f8;
+ env[0].__jmpbuf[0].__f9 = f9;
+#endif
+
+ /* Save the return address of our caller, where longjmp will jump to. */
+ env[0].__jmpbuf[0].__pc = retpc;
+
+ /* Save the FP and SP of our caller. The __sigsetjmp entry point
+ simply puts these in the argument registers for us to fetch. */
+ env[0].__jmpbuf[0].__fp = fp;
+ env[0].__jmpbuf[0].__sp = sp;
+
+ /* Save the signal mask if requested. */
+ __sigjmp_save (env, savemask);
+
+ /* Return to the original caller of __sigsetjmp. */
+ return 0;
+}
diff --git a/sysdeps/alpha/strchr.c b/sysdeps/alpha/strchr.c
new file mode 100644
index 0000000000..69afa4b87f
--- /dev/null
+++ b/sysdeps/alpha/strchr.c
@@ -0,0 +1,84 @@
+/* Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <string.h>
+
+/* Return the length of the null-terminated string STR. Scan for
+ the null terminator quickly by testing eight bytes at a time. */
+
+char *
+strchr (const char *str, int c)
+{
+ const char *char_ptr;
+ const unsigned long int *longword_ptr;
+ unsigned long int charmask;
+
+ c = (unsigned char) c;
+
+ /* Handle the first few characters by reading one character at a time.
+ Do this until STR is aligned on a 8-byte border. */
+ for (char_ptr = str; ((unsigned long int) char_ptr & 7) != 0; ++char_ptr)
+ if (*char_ptr == c)
+ return (char *) char_ptr;
+ else if (*char_ptr == '\0')
+ return NULL;
+
+ longword_ptr = (unsigned long int *) char_ptr;
+
+ /* Set up a longword, each of whose bytes is C. */
+ charmask = c | (c << 8);
+ charmask |= charmask << 16;
+ charmask |= charmask << 32;
+
+ for (;;)
+ {
+ const unsigned long int longword = *longword_ptr++;
+ int ge, le, zero;
+
+ /* Set bits in ZERO if bytes in LONGWORD are zero. */
+ asm ("cmpbge $31, %1, %0" : "=r" (zero) : "r" (longword));
+
+ /* Set bits in GE if bytes in CHARMASK are >= bytes in LONGWORD. */
+ asm ("cmpbge %1, %2, %0" : "=r" (ge) : "r" (charmask), "r" (longword));
+
+ /* Set bits in LE if bytes in CHARMASK are <= bytes in LONGWORD. */
+ asm ("cmpbge %2, %1, %0" : "=r" (le) : "r" (charmask), "r" (longword));
+
+ /* Bytes that are both <= and >= are == to C. */
+ if (zero || (ge & le))
+ {
+ /* Which of the bytes was the C? */
+
+ char *cp = (char *) (longword_ptr - 1);
+ int i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (cp[i] == c)
+ return &cp[i];
+ if (cp[i] == 0)
+ return NULL;
+ }
+ return NULL;
+ }
+ }
+}
+
+#ifdef weak_alias
+#undef index
+weak_alias (strchr, index)
+#endif
diff --git a/sysdeps/alpha/strlen.c b/sysdeps/alpha/strlen.c
new file mode 100644
index 0000000000..d7744476ad
--- /dev/null
+++ b/sysdeps/alpha/strlen.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1992 Free Software Foundation, Inc.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <string.h>
+
+/* Return the length of the null-terminated string STR. Scan for
+ the null terminator quickly by testing eight bytes at a time. */
+
+size_t
+strlen (const char *str)
+{
+ const char *char_ptr;
+ const unsigned long int *longword_ptr;
+
+ /* Handle the first few characters by reading one character at a time.
+ Do this until STR is aligned on a 8-byte border. */
+ for (char_ptr = str; ((unsigned long int) char_ptr & 7) != 0; ++char_ptr)
+ if (*char_ptr == '\0')
+ return char_ptr - str;
+
+ longword_ptr = (unsigned long int *) char_ptr;
+
+ for (;;)
+ {
+ int mask;
+ asm ("cmpbge %1, %2, %0" : "=r" (mask) : "r" (0), "r" (*longword_ptr++));
+ if (mask)
+ {
+ /* Which of the bytes was the zero? */
+
+ const char *cp = (const char *) (longword_ptr - 1);
+ int i;
+
+ for (i = 0; i < 6; i++)
+ if (cp[i] == 0)
+ return cp - str + i;
+ return cp - str + 7;
+ }
+ }
+}
diff --git a/sysdeps/alpha/udiv_qrnnd.S b/sysdeps/alpha/udiv_qrnnd.S
new file mode 100644
index 0000000000..942d7a884b
--- /dev/null
+++ b/sysdeps/alpha/udiv_qrnnd.S
@@ -0,0 +1,152 @@
+ # Alpha 21064 __udiv_qrnnd
+
+ # Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+
+ # This file is part of the GNU MP Library.
+
+ # The GNU MP Library is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU Library General Public License as published by
+ # the Free Software Foundation; either version 2 of the License, or (at your
+ # option) any later version.
+
+ # The GNU MP Library is distributed in the hope that it will be useful, but
+ # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+ # License for more details.
+
+ # You should have received a copy of the GNU Library General Public License
+ # along with the GNU MP Library; see the file COPYING.LIB. If not, write to
+ # the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+ .set noreorder
+ .set noat
+
+.text
+ .align 3
+ .globl __udiv_qrnnd
+ .ent __udiv_qrnnd 0
+__udiv_qrnnd:
+__udiv_qrnnd..ng:
+ .frame $30,0,$26,0
+ .prologue 0
+#define cnt $2
+#define tmp $3
+#define rem_ptr $16
+#define n1 $17
+#define n0 $18
+#define d $19
+#define qb $20
+
+ ldiq cnt,16
+ blt d,Largedivisor
+
+Loop1: cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule d,n1,qb
+ subq n1,d,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule d,n1,qb
+ subq n1,d,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule d,n1,qb
+ subq n1,d,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule d,n1,qb
+ subq n1,d,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ subq cnt,1,cnt
+ bgt cnt,Loop1
+ stq n1,0(rem_ptr)
+ bis $31,n0,$0
+ ret $31,($26),1
+
+Largedivisor:
+ and n0,1,$4
+
+ srl n0,1,n0
+ sll n1,63,tmp
+ or tmp,n0,n0
+ srl n1,1,n1
+
+ and d,1,$6
+ srl d,1,$5
+ addq $5,$6,$5
+
+Loop2: cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule $5,n1,qb
+ subq n1,$5,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule $5,n1,qb
+ subq n1,$5,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule $5,n1,qb
+ subq n1,$5,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ cmplt n0,0,tmp
+ addq n1,n1,n1
+ bis n1,tmp,n1
+ addq n0,n0,n0
+ cmpule $5,n1,qb
+ subq n1,$5,tmp
+ cmovne qb,tmp,n1
+ bis n0,qb,n0
+ subq cnt,1,cnt
+ bgt cnt,Loop2
+
+ addq n1,n1,n1
+ addq $4,n1,n1
+ bne $6,Odd
+ stq n1,0(rem_ptr)
+ bis $31,n0,$0
+ ret $31,($26),1
+
+Odd:
+ /* q' in n0. r' in n1. */
+ addq n1,n0,n1
+ cmpult n1,n0,tmp # tmp := carry from addq
+ beq tmp,LLp6
+ addq n0,1,n0
+ subq n1,d,n1
+LLp6: cmpult n1,d,tmp
+ bne tmp,LLp7
+ addq n0,1,n0
+ subq n1,d,n1
+LLp7:
+ stq n1,0(rem_ptr)
+ bis $31,n0,$0
+ ret $31,($26),1
+
+ .end __udiv_qrnnd