* $Header: mulbig.c,v 1.2 83/11/26 12:13:29 sklower Exp $
* Copyright (c) 1982, Regents, University of California
struct s_dot
{ long I
; struct s_dot
*CDR
; };
struct vl
{ long high
; long low
; };
struct s_dot
*mulbig(a
,b
)
long *sa
, *sb
, *sc
, *base
, *alloca();
register struct s_dot
*p
;
for(p
= a
; p
->CDR
; p
= p
->CDR
) la
++;
for(p
= b
; p
->CDR
; p
= p
->CDR
) lb
++;
/* allocate storage areas on the stack */
base
= alloca((la
+ la
+ lb
+ lb
+ 1)*sizeof(long));
/* copy s_dots onto stack */
do { *--q
= p
->I
; p
= p
->CDR
; } while (p
);
do { *--q
= p
->I
; p
= p
->CDR
; } while (p
);
while(q
> base
) *--q
= 0; /* initialize target */
/* perform the multiplication */
for(q
= sb
; q
> sc
; *--s
= carry
)
for((r
= sa
, s
= (q
--) - lb
, carry
= 0); r
> sb
;)
emul(*q
,*--r
,carry
,&work
);
if(test
& 0x40000000) carry
+=1;