|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 3812 (0xee4)
Types: TextFile
Names: »mul.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/microcode/mul.c«
/* Emacs -*-C-*-an't tell the language */
/****************************************************************
* *
* Copyright (c) 1986 *
* Massachusetts Institute of Technology *
* *
* This material was developed by the Scheme project at the *
* Massachusetts Institute of Technology, Department of *
* Electrical Engineering and Computer Science. Permission to *
* copy this software, to redistribute it, and to use it for any *
* purpose is granted, subject to the following restrictions and *
* understandings. *
* *
* 1. Any copy made of this software must include this copyright *
* notice in full. *
* *
* 2. Users of this software agree to make their best efforts (a)*
* to return to the MIT Scheme project any improvements or *
* extensions that they make, so that these may be included in *
* future releases; and (b) to inform MIT of noteworthy uses of *
* this software. *
* *
* 3. All materials developed as a consequence of the use of *
* this software shall duly acknowledge such use, in accordance *
* with the usual standards of acknowledging credit in academic *
* research. *
* *
* 4. MIT has made no warrantee or representation that the *
* operation of this software will be error-free, and MIT is *
* under no obligation to provide any services, by way of *
* maintenance, update, or otherwise. *
* *
* 5. In conjunction with products arising from the use of this *
* material, there shall be no use of the name of the *
* Massachusetts Institute of Technology nor of any adaptation *
* thereof in any advertising, promotional, or sales literature *
* without prior written consent from MIT in each case. *
* *
****************************************************************/
\f
/* File: MUL.C
*
* This file contains the portable fixnum multiplication procedure.
* Returns NIL if the result does not fit in a fixnum.
* Note: This has only been tried on machines with long = 32 bits.
* This file is included in the appropriate os file if needed.
*/
#define HALF_WORD_SIZE ((sizeof(long)*CHAR_SIZE)/2)
#define HALF_WORD_MASK (1<<HALF_WORD_SIZE)-1
#define MAX_MIDDLE (1<<((ADDRESS_LENGTH-1)-HALF_WORD_SIZE))
#define MAX_FIXNUM (1<<ADDRESS_LENGTH)
#define ABS(x) (((x) < 0) ? -(x) : (x))
Pointer Mul(Arg1, Arg2)
long Arg1, Arg2;
{ long A, B, C;
fast long Hi_A, Hi_B, Lo_A, Lo_B, Lo_C, Middle_C;
Boolean Sign;
Sign_Extend(Arg1, A); Sign_Extend(Arg2, B);
Sign = ((A < 0) == (B < 0));
A = ABS(A); B = ABS(B);
Hi_A = (A >> HALF_WORD_SIZE) & HALF_WORD_MASK;
Hi_B = (B >> HALF_WORD_SIZE) & HALF_WORD_MASK;
Lo_A = A & HALF_WORD_MASK; Lo_B = B & HALF_WORD_MASK;
Lo_C = Lo_A * Lo_B;
if (Lo_C > FIXNUM_SIGN_BIT) return NIL;
Middle_C = Lo_A * Hi_B + Hi_A * Lo_B;
if (Middle_C >= MAX_MIDDLE) return NIL;
if ((Hi_A * Hi_B) > 0) return NIL;
C = Lo_C + (Middle_C << HALF_WORD_SIZE);
if (Fixnum_Fits(C))
{ if (Sign || (C == 0)) return FIXNUM_0 + C;
else return FIXNUM_0 + (MAX_FIXNUM - C);
}
return NIL;
}