2004-07-27 22:52:35 -04:00
|
|
|
#include "factor.h"
|
|
|
|
|
2004-07-28 19:02:24 -04:00
|
|
|
INLINE BIGNUM* fixnum_to_bignum(CELL n)
|
|
|
|
{
|
|
|
|
return bignum((BIGNUM_2)untag_fixnum_fast(n));
|
|
|
|
}
|
|
|
|
|
|
|
|
INLINE FIXNUM bignum_to_fixnum(CELL tagged)
|
|
|
|
{
|
|
|
|
return (FIXNUM)(untag_bignum(tagged)->n);
|
|
|
|
}
|
|
|
|
|
2004-07-27 22:52:35 -04:00
|
|
|
#define BINARY_OP(OP) \
|
|
|
|
void primitive_##OP(void) \
|
|
|
|
{ \
|
|
|
|
CELL x = dpop(), y = env.dt; \
|
|
|
|
\
|
|
|
|
switch(TAG(x)) \
|
|
|
|
{ \
|
|
|
|
case FIXNUM_TYPE: \
|
|
|
|
\
|
|
|
|
switch(TAG(y)) \
|
|
|
|
{ \
|
|
|
|
case FIXNUM_TYPE: \
|
2004-07-28 19:02:24 -04:00
|
|
|
OP##_fixnum(x,y); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
case OBJECT_TYPE: \
|
|
|
|
switch(object_type(y)) \
|
|
|
|
{ \
|
|
|
|
case BIGNUM_TYPE: \
|
2004-07-29 17:18:41 -04:00
|
|
|
OP##_bignum((CELL)fixnum_to_bignum(x),y); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
default: \
|
2004-07-28 19:02:24 -04:00
|
|
|
type_error(FIXNUM_TYPE,y); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
break; \
|
|
|
|
default: \
|
2004-07-28 19:02:24 -04:00
|
|
|
type_error(FIXNUM_TYPE,y); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
break; \
|
|
|
|
\
|
|
|
|
case OBJECT_TYPE: \
|
|
|
|
\
|
|
|
|
switch(object_type(x)) \
|
|
|
|
{ \
|
|
|
|
\
|
|
|
|
case BIGNUM_TYPE: \
|
|
|
|
\
|
|
|
|
switch(TAG(y)) \
|
|
|
|
{ \
|
|
|
|
case FIXNUM_TYPE: \
|
2004-07-29 17:18:41 -04:00
|
|
|
OP##_bignum(x,(CELL)fixnum_to_bignum(y)); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
case OBJECT_TYPE: \
|
|
|
|
\
|
|
|
|
switch(object_type(y)) \
|
|
|
|
{ \
|
|
|
|
case BIGNUM_TYPE: \
|
2004-07-28 19:02:24 -04:00
|
|
|
OP##_bignum(x,y); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
default: \
|
2004-07-28 19:02:24 -04:00
|
|
|
type_error(BIGNUM_TYPE,y); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
break; \
|
|
|
|
default: \
|
2004-07-28 19:02:24 -04:00
|
|
|
type_error(BIGNUM_TYPE,y); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
break; \
|
|
|
|
\
|
|
|
|
default: \
|
|
|
|
\
|
2004-07-28 19:02:24 -04:00
|
|
|
type_error(FIXNUM_TYPE,x); \
|
2004-07-27 22:52:35 -04:00
|
|
|
break; \
|
|
|
|
} \
|
2004-07-28 19:02:24 -04:00
|
|
|
\
|
|
|
|
break; \
|
2004-07-27 22:52:35 -04:00
|
|
|
\
|
|
|
|
default: \
|
|
|
|
\
|
2004-07-28 19:02:24 -04:00
|
|
|
type_error(FIXNUM_TYPE,x); \
|
|
|
|
break; \
|
2004-07-27 22:52:35 -04:00
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
2004-07-29 17:18:41 -04:00
|
|
|
FIXNUM to_fixnum(CELL tagged);
|
|
|
|
|
2004-07-28 19:02:24 -04:00
|
|
|
void primitive_add(void);
|
|
|
|
void primitive_subtract(void);
|
|
|
|
void primitive_multiply(void);
|
|
|
|
void primitive_divmod(void);
|
|
|
|
void primitive_less(void);
|
|
|
|
void primitive_lesseq(void);
|
|
|
|
void primitive_greater(void);
|
|
|
|
void primitive_greatereq(void);
|
2004-07-29 17:18:41 -04:00
|
|
|
void primitive_mod(void);
|
|
|
|
void primitive_and(void);
|
|
|
|
void primitive_or(void);
|
|
|
|
void primitive_xor(void);
|
|
|
|
void primitive_shiftleft(void);
|
|
|
|
void primitive_shiftright(void);
|