2004-07-16 02:26:21 -04:00
|
|
|
#include "factor.h"
|
|
|
|
|
|
|
|
#define BINARY_OP(x,y) \
|
|
|
|
FIXNUM x, y; \
|
|
|
|
y = env.dt; \
|
|
|
|
type_check(FIXNUM_TYPE,y); \
|
|
|
|
x = dpop(); \
|
|
|
|
type_check(FIXNUM_TYPE,x);
|
|
|
|
|
|
|
|
void primitive_fixnump(void)
|
|
|
|
{
|
|
|
|
check_non_empty(env.dt);
|
|
|
|
env.dt = tag_boolean(TAG(env.dt) == FIXNUM_TYPE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_add(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = x + y;
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_subtract(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = x - y;
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_multiply(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = (x >> TAG_BITS) * y;
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_divide(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
/* division takes common factor of 8 out. */
|
|
|
|
env.dt = tag_fixnum(x / y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_mod(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = x % y;
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_divmod(void)
|
|
|
|
{
|
2004-07-27 21:12:22 -04:00
|
|
|
div_t q;
|
2004-07-16 02:26:21 -04:00
|
|
|
BINARY_OP(x,y);
|
2004-07-27 21:12:22 -04:00
|
|
|
q = div(x,y);
|
2004-07-16 02:26:21 -04:00
|
|
|
/* division takes common factor of 8 out. */
|
2004-07-27 21:12:22 -04:00
|
|
|
dpush(tag_fixnum(q.quot));
|
|
|
|
env.dt = q.rem;
|
2004-07-16 02:26:21 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_and(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = x & y;
|
|
|
|
}
|
|
|
|
|
2004-07-22 19:48:50 -04:00
|
|
|
void primitive_or(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = x | y;
|
|
|
|
}
|
|
|
|
|
2004-07-16 02:26:21 -04:00
|
|
|
void primitive_xor(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = x ^ y;
|
|
|
|
}
|
|
|
|
|
2004-07-22 19:48:50 -04:00
|
|
|
void primitive_not(void)
|
|
|
|
{
|
|
|
|
type_check(FIXNUM_TYPE,env.dt);
|
|
|
|
env.dt = RETAG(~env.dt,FIXNUM_TYPE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_shiftleft(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = UNTAG(x >> (y >> TAG_BITS));
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_shiftright(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = x << (y >> TAG_BITS);
|
|
|
|
}
|
|
|
|
|
2004-07-16 02:26:21 -04:00
|
|
|
void primitive_less(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = tag_boolean(x < y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_lesseq(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = tag_boolean(x <= y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_greater(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = tag_boolean(x > y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void primitive_greatereq(void)
|
|
|
|
{
|
|
|
|
BINARY_OP(x,y);
|
|
|
|
env.dt = tag_boolean(x >= y);
|
|
|
|
}
|