KNF, integrate with standard include files (quad -> quad_t etc.)
[unix-history] / usr / src / lib / libc / quad / adddi3.c
index 3639120..a4bf078 100644 (file)
@@ -2,57 +2,33 @@
  * Copyright (c) 1992 The Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1992 The Regents of the University of California.
  * All rights reserved.
  *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
  * %sccs.include.redist.c%
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  * %sccs.include.redist.c%
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)adddi3.c   5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)adddi3.c   5.5 (Berkeley) %G%";
 #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;
-
-  a[HIGH] = uu.s.high;
-  a[LOW] = uu.s.low;
-  b[HIGH] = vv.s.high;
-  b[LOW] = vv.s.low;
+#include "quad.h"
 
 
-  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);
 }
 }