1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-16 08:15:31 +00:00
Bruce Mitchener c19b184820
Remove GetNumber. (#338)
This isn't used and if it were, it wouldn't compile. It calls
`ufn`, which doesn't get compiled in either (unless `C_ONLY`
is defined, which it isn't, and if it were, that wouldn't
compile either due to a missing `StkLim0`).

A subsequent PR will remove `ufn` and related code.
2021-02-09 03:10:38 +00:00

181 lines
4.4 KiB
C

#ifndef ARITH_H
#define ARITH_H 1
/* $Id: arith.h,v 1.2 1999/01/03 02:05:52 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
/************************************************************************/
/* */
/* (C) Copyright 1989-92 Venue. All Rights Reserved. */
/* Manufactured in the United States of America. */
/* */
/************************************************************************/
#define MAX_SMALL 65535 /* == 0x0000FFFF */
#define MIN_SMALL -65536 /* == 0xFFFF0000 */
#define MAX_FIXP 2147483647 /* == 0x7FFFFFFF */
#define MIN_FIXP -2147483648 /* == 0x80000000 */
#define GetSmalldata(x) (((SEGMASK & x)==S_POSITIVE) ? (0xFFFF & x) : (((SEGMASK & x)==S_NEGATIVE) ? (0xFFFF0000 | x) : error("Not smallp address")))
#define GetSmallp(x) ((0xFFFF0000 & x) ? (((0xFFFF0000 & x)==0xFFFF0000) ? (S_NEGATIVE | (0xFFFF & x)) : error("Not Smallp data") ) : (S_POSITIVE | (0xFFFF & x)))
#define FIXP_VALUE(dest) *((int *)Addr68k_from_LADDR(dest))
#define FLOATP_VALUE(dest) *((float *)Addr68k_from_LADDR(dest))
#define N_GETNUMBER(sour, dest, label) \
{ dest = sour; /* access memory once */ \
switch(SEGMASK & dest){ \
case S_POSITIVE: \
dest = 0xFFFF & (dest); \
break; \
case S_NEGATIVE: \
dest = 0xFFFF0000 | (dest); \
break; \
default: \
if (GetTypeNumber( dest ) != TYPE_FIXP) \
{ goto label; } \
dest = FIXP_VALUE(dest); \
} \
}
#define N_IGETNUMBER(sour, dest, label) \
{ dest = sour; /* access memory once */ \
switch(SEGMASK & dest){ \
case S_POSITIVE: \
dest = 0xFFFF & dest; \
break; \
case S_NEGATIVE: \
dest = 0xFFFF0000 | dest; \
break; \
default: \
switch (GetTypeNumber( dest )) { \
case TYPE_FIXP: \
dest = FIXP_VALUE(dest); \
break; \
case TYPE_FLOATP: \
{register float temp; \
temp = FLOATP_VALUE(dest) ; \
if ( (temp > ((float) 0x7fffffff)) || \
(temp < ((float) 0x80000000)) ) \
goto label; \
dest = (int) temp; \
} \
break; \
default: goto label; \
} \
break; \
} \
}
#define ARITH_SWITCH(arg, result) \
switch((int) arg & 0xFFFF0000){ \
case 0: \
result = (S_POSITIVE | (int) arg); \
break; \
case 0xFFFF0000: \
result = (S_NEGATIVE | (0xFFFF & (int) arg)); \
break; \
default:{register LispPTR *wordp; \
/* arg is FIXP, call createcell */ \
wordp = (LispPTR *) createcell68k(TYPE_FIXP); \
*((int *)wordp) = (int) arg; \
result = (LADDR_from_68k(wordp)); \
break; \
} \
}
/* *******
NEED to See if this is faster than the N_ARITH_SWITCH macro
if( (MIN_FIXP <= result) && (result <= MAX_FIXP) ){
if(0 <= result){
if(result <= MAX_SMALL)
return(S_POSITIVE | result);
else{
wordp = createcell68k(TYPE_FIXP);
*((unsigned int *)wordp) = result;
return(LADDR_from_68k(wordp));
}
}else{
if(MIN_SMALL <= result)
return(S_NEGATIVE | (0xFFFF & result));
else{
wordp = createcell68k(TYPE_FIXP);
*((unsigned int *)wordp) = result;
return(LADDR_from_68k(wordp));
}
}/
}
****** */
#define N_ARITH_SWITCH(arg) \
switch(arg & 0xFFFF0000){ \
case 0: \
return(S_POSITIVE | arg); \
case 0xFFFF0000: \
return(S_NEGATIVE | (0xFFFF & arg)); \
default:{register LispPTR *fixpp; \
/* arg is FIXP, call createcell */ \
fixpp = (LispPTR *) createcell68k(TYPE_FIXP); \
*((int *)fixpp) = arg; \
return(LADDR_from_68k(fixpp)); \
} \
}
#define N_IARITH_BODY_2(a, tos, op) \
{ \
register int arg1,arg2; \
\
N_IGETNUMBER( a, arg1, do_ufn); \
N_IGETNUMBER( tos, arg2, do_ufn); \
\
arg1 = arg1 op arg2; \
\
N_ARITH_SWITCH(arg1); \
\
do_ufn: ERROR_EXIT(tos); \
}
#define N_ARITH_BODY_1(a, n, op) \
{ \
register int arg1; \
\
N_GETNUMBER( a, arg1, do_ufn); \
\
arg1 = arg1 op n; \
\
N_ARITH_SWITCH(arg1); \
\
do_ufn: ERROR_EXIT(a); \
}
#define N_ARITH_BODY_1_UNSIGNED(a, n, op) \
{ \
register unsigned int arg1; \
\
N_GETNUMBER( a, arg1, do_ufn); \
\
arg1 = arg1 op n; \
\
N_ARITH_SWITCH(arg1); \
\
do_ufn: ERROR_EXIT(a); \
}
#endif /* ARITH_H */