BSD 4_4 release
[unix-history] / usr / src / lib / libc / quad / adddi3.c
index 3639120..d10da47 100644 (file)
@@ -1,58 +1,60 @@
 /*-
 /*-
- * Copyright (c) 1992 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  *
- * %sccs.include.redist.c%
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)adddi3.c   5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)adddi3.c   8.1 (Berkeley) 6/4/93";
 #endif /* LIBC_SCCS and not lint */
 
 #endif /* LIBC_SCCS and not lint */
 
-#include "longlong.h"
-
-static int badd ();
-
-long long 
-__adddi3 (u, v)
-     long long u, v;
-{
-  long a[2], b[2], c[2];
-  long_long w;
-  long_long uu, vv;
-
-  uu.ll = u;
-  vv.ll = v;
+#include "quad.h"
 
 
-  a[HIGH] = uu.s.high;
-  a[LOW] = uu.s.low;
-  b[HIGH] = vv.s.high;
-  b[LOW] = vv.s.low;
-
-  badd (a, b, c, sizeof c);
-
-  w.s.high = c[HIGH];
-  w.s.low = c[LOW];
-  return w.ll;
-}
-
-static int 
-badd (a, b, c, n)
-     unsigned short *a, *b, *c;
-     size_t n;
+/*
+ * Add two quads.  This is trivial since a one-bit carry from a single
+ * u_long addition x+y occurs if and only if the sum x+y is less than
+ * either x or y (the choice to compare with x or y is arbitrary).
+ */
+quad_t
+__adddi3(a, b)
+       quad_t a, b;
 {
 {
-  unsigned long acc;
-  int i;
-
-  n /= sizeof *c;
+       union uu aa, bb, sum;
 
 
-  acc = 0;
-  for (i = little_end (n); is_not_msd (i, n); i = next_msd (i))
-    {
-      /* Widen before adding to avoid loss of high bits.  */
-      acc += (unsigned long) a[i] + b[i];
-      c[i] = acc & low16;
-      acc = acc >> 16;
-    }
-  return acc;
+       aa.q = a;
+       bb.q = b;
+       sum.ul[L] = aa.ul[L] + bb.ul[L];
+       sum.ul[H] = aa.ul[H] + bb.ul[H] + (sum.ul[L] < bb.ul[L]);
+       return (sum.q);
 }
 }