summary refs log tree commit diff
path: root/stdlib/longlong.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-09-25 21:55:47 +0000
committerUlrich Drepper <drepper@redhat.com>1998-09-25 21:55:47 +0000
commit390a4882ffd0e4092641ffdd6c0e017e41793d0c (patch)
treee333892580057f9dc28819fe3f153e84823d8d3d /stdlib/longlong.h
parente503270ca511dd3092c953fe5f9a178f0d04b1ad (diff)
downloadglibc-390a4882ffd0e4092641ffdd6c0e017e41793d0c.tar.gz
glibc-390a4882ffd0e4092641ffdd6c0e017e41793d0c.tar.xz
glibc-390a4882ffd0e4092641ffdd6c0e017e41793d0c.zip
Update.
1998-09-25  Ulrich Drepper  <drepper@cygnus.com>

	* math/Makefile (gmp-objs): Add mp_clz_tab.

1998-09-25  David S. Miller  <davem@pierdol.cobaltmicro.com>

	* sysdeps/sparc/fpu/feholdexcpt.c (feholdexcept): Clear bits don't
	set them.
	* stdlib/longlong.h (sparc udiv_qrnnd): Define inline version for
	cpus lacking hardware multiply and divide.

1998-09-24  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* db/Makefile ($(inst_slibdir)/libdb.so$(libdb1.so-version)): Use
	$(<F), not $(^F).

1998-09-24  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* db/btree/bt_delete.c: Fix -Wparentheses warning.

1998-09-24  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makefile ($(inst_includedir)/gnu/lib-names.h): Use
	$(do-install).

	* time/strftime.c (f_wkday): Remove duplicate definition.
	* time/strftime.c (my_strftime): Don't store past the end of a
Diffstat (limited to 'stdlib/longlong.h')
-rw-r--r--stdlib/longlong.h39
1 files changed, 33 insertions, 6 deletions
diff --git a/stdlib/longlong.h b/stdlib/longlong.h
index 197aac41da..4e41ac4a25 100644
--- a/stdlib/longlong.h
+++ b/stdlib/longlong.h
@@ -1,5 +1,5 @@
 /* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
-   Copyright (C) 1991, 92, 93, 94, 96, 97 Free Software Foundation, Inc.
+   Copyright (C) 1991, 92, 93, 94, 96, 97, 98 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -1135,12 +1135,39 @@ extern USItype __udiv_qrnnd ();
 #define UMUL_TIME 39		/* 39 instructions */
 #endif
 #ifndef udiv_qrnnd
-#ifndef LONGLONG_STANDALONE
+/* It's quite necessary to add this much assembler for the sparc.
+   The default udiv_qrnnd (in C) is more than 10 times slower!  */
 #define udiv_qrnnd(q, r, n1, n0, d) \
-  do { USItype __r;							\
-    (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));				\
-    (r) = __r;								\
-  } while (0)
+  __asm__ ("! Inlined udiv_qrnnd
+	mov	32,%%g1
+	subcc	%1,%2,%%g0
+1:	bcs	5f
+	 addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb
+	sub	%1,%2,%1	! this kills msb of n
+	addx	%1,%1,%1	! so this can't give carry
+	subcc	%%g1,1,%%g1
+2:	bne	1b
+	 subcc	%1,%2,%%g0
+	bcs	3f
+	 addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb
+	b	3f
+	 sub	%1,%2,%1	! this kills msb of n
+4:	sub	%1,%2,%1
+5:	addxcc	%1,%1,%1
+	bcc	2b
+	 subcc	%%g1,1,%%g1
+! Got carry from n.  Subtract next step to cancel this carry.
+	bne	4b
+	 addcc	%0,%0,%0	! shift n1n0 and a 0-bit in lsb
+	sub	%1,%2,%1
+3:	xnor	%0,0,%0
+	! End of inline udiv_qrnnd"					\
+	   : "=&r" ((USItype)(q)),					\
+	     "=&r" ((USItype)(r))					\
+	   : "r" ((USItype)(d)),					\
+	     "1" ((USItype)(n1)),					\
+	     "0" ((USItype)(n0)) : "%g1" __AND_CLOBBER_CC)
+#define UDIV_TIME (3+7*32)	/* 7 instructions/iteration. 32 iterations. */
 extern USItype __udiv_qrnnd __P ((USItype *, USItype, USItype, USItype));
 #define UDIV_TIME 140
 #endif /* LONGLONG_STANDALONE */