386BSD 0.0 development
authorWilliam F. Jolitz <wjolitz@soda.berkeley.edu>
Tue, 22 Jan 1991 06:58:25 +0000 (22:58 -0800)
committerWilliam F. Jolitz <wjolitz@soda.berkeley.edu>
Tue, 22 Jan 1991 06:58:25 +0000 (22:58 -0800)
Work on file usr/src/usr.bin/gcc/gnulib/longlong/subdi3.c

Co-Authored-By: Lynne Greer Jolitz <ljolitz@cardio.ucsf.edu>
Synthesized-from: 386BSD-0.0/src

usr/src/usr.bin/gcc/gnulib/longlong/subdi3.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/gcc/gnulib/longlong/subdi3.c b/usr/src/usr.bin/gcc/gnulib/longlong/subdi3.c
new file mode 100644 (file)
index 0000000..655aede
--- /dev/null
@@ -0,0 +1,47 @@
+#include "longlong.h"
+
+static int bsub ();
+
+long long 
+__subdi3 (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;
+
+  bsub (a, b, c, sizeof c);
+
+  w.s.high = c[HIGH];
+  w.s.low = c[LOW];
+  return w.ll;
+}
+
+static int 
+bsub (a, b, c, n)
+     unsigned short *a, *b, *c;
+     size_t n;
+{
+  signed long acc;
+  int i;
+
+  n /= sizeof *c;
+
+  acc = 0;
+  for (i = little_end (n); is_not_msd (i, n); i = next_msd (i))
+    {
+      /* Widen before subtracting to avoid loss of high bits.  */
+      acc += (long) a[i] - b[i];
+      c[i] = acc & low16;
+      acc = acc >> 16;
+    }
+  return acc;
+}