Start development on 386BSD 0.1
[unix-history] / .ref-386BSD-0.0 / usr / src / usr.bin / gcc / gnulib / longlong / subdi3.c
CommitLineData
5f6b35b7
WJ
1#include "longlong.h"
2
3static int bsub ();
4
5long long
6__subdi3 (u, v)
7 long long u, v;
8{
9 long a[2], b[2], c[2];
10 long_long w;
11 long_long uu, vv;
12
13 uu.ll = u;
14 vv.ll = v;
15
16 a[HIGH] = uu.s.high;
17 a[LOW] = uu.s.low;
18 b[HIGH] = vv.s.high;
19 b[LOW] = vv.s.low;
20
21 bsub (a, b, c, sizeof c);
22
23 w.s.high = c[HIGH];
24 w.s.low = c[LOW];
25 return w.ll;
26}
27
28static int
29bsub (a, b, c, n)
30 unsigned short *a, *b, *c;
31 size_t n;
32{
33 signed long acc;
34 int i;
35
36 n /= sizeof *c;
37
38 acc = 0;
39 for (i = little_end (n); is_not_msd (i, n); i = next_msd (i))
40 {
41 /* Widen before subtracting to avoid loss of high bits. */
42 acc += (long) a[i] - b[i];
43 c[i] = acc & low16;
44 acc = acc >> 16;
45 }
46 return acc;
47}