vm: use ctx->replace() with bignum and float operations.

John Benediktsson 2013-03-22 08:00:13 -07:00
parent dcb1e2040a
commit 412bc8cf27
1 changed files with 28 additions and 28 deletions

View File

@ -106,36 +106,36 @@ void factor_vm::primitive_float_to_bignum()
#define POP_BIGNUMS(x,y) \ #define POP_BIGNUMS(x,y) \
bignum * y = untag<bignum>(ctx->pop()); \ bignum * y = untag<bignum>(ctx->pop()); \
bignum * x = untag<bignum>(ctx->pop()); bignum * x = untag<bignum>(ctx->peek());
void factor_vm::primitive_bignum_eq() void factor_vm::primitive_bignum_eq()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag_boolean(bignum_equal_p(x,y))); ctx->replace(tag_boolean(bignum_equal_p(x,y)));
} }
void factor_vm::primitive_bignum_add() void factor_vm::primitive_bignum_add()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_add(x,y))); ctx->replace(tag<bignum>(bignum_add(x,y)));
} }
void factor_vm::primitive_bignum_subtract() void factor_vm::primitive_bignum_subtract()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_subtract(x,y))); ctx->replace(tag<bignum>(bignum_subtract(x,y)));
} }
void factor_vm::primitive_bignum_multiply() void factor_vm::primitive_bignum_multiply()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_multiply(x,y))); ctx->replace(tag<bignum>(bignum_multiply(x,y)));
} }
void factor_vm::primitive_bignum_divint() void factor_vm::primitive_bignum_divint()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_quotient(x,y))); ctx->replace(tag<bignum>(bignum_quotient(x,y)));
} }
void factor_vm::primitive_bignum_divmod() void factor_vm::primitive_bignum_divmod()
@ -143,69 +143,69 @@ void factor_vm::primitive_bignum_divmod()
bignum *q, *r; bignum *q, *r;
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
bignum_divide(x,y,&q,&r); bignum_divide(x,y,&q,&r);
ctx->push(tag<bignum>(q)); ctx->replace(tag<bignum>(q));
ctx->push(tag<bignum>(r)); ctx->push(tag<bignum>(r));
} }
void factor_vm::primitive_bignum_mod() void factor_vm::primitive_bignum_mod()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_remainder(x,y))); ctx->replace(tag<bignum>(bignum_remainder(x,y)));
} }
void factor_vm::primitive_bignum_gcd() void factor_vm::primitive_bignum_gcd()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_gcd(x,y))); ctx->replace(tag<bignum>(bignum_gcd(x,y)));
} }
void factor_vm::primitive_bignum_and() void factor_vm::primitive_bignum_and()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_bitwise_and(x,y))); ctx->replace(tag<bignum>(bignum_bitwise_and(x,y)));
} }
void factor_vm::primitive_bignum_or() void factor_vm::primitive_bignum_or()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_bitwise_ior(x,y))); ctx->replace(tag<bignum>(bignum_bitwise_ior(x,y)));
} }
void factor_vm::primitive_bignum_xor() void factor_vm::primitive_bignum_xor()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag<bignum>(bignum_bitwise_xor(x,y))); ctx->replace(tag<bignum>(bignum_bitwise_xor(x,y)));
} }
void factor_vm::primitive_bignum_shift() void factor_vm::primitive_bignum_shift()
{ {
fixnum y = untag_fixnum(ctx->pop()); fixnum y = untag_fixnum(ctx->pop());
bignum* x = untag<bignum>(ctx->pop()); bignum* x = untag<bignum>(ctx->peek());
ctx->push(tag<bignum>(bignum_arithmetic_shift(x,y))); ctx->replace(tag<bignum>(bignum_arithmetic_shift(x,y)));
} }
void factor_vm::primitive_bignum_less() void factor_vm::primitive_bignum_less()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag_boolean(bignum_compare(x,y) == bignum_comparison_less)); ctx->replace(tag_boolean(bignum_compare(x,y) == bignum_comparison_less));
} }
void factor_vm::primitive_bignum_lesseq() void factor_vm::primitive_bignum_lesseq()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag_boolean(bignum_compare(x,y) != bignum_comparison_greater)); ctx->replace(tag_boolean(bignum_compare(x,y) != bignum_comparison_greater));
} }
void factor_vm::primitive_bignum_greater() void factor_vm::primitive_bignum_greater()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag_boolean(bignum_compare(x,y) == bignum_comparison_greater)); ctx->replace(tag_boolean(bignum_compare(x,y) == bignum_comparison_greater));
} }
void factor_vm::primitive_bignum_greatereq() void factor_vm::primitive_bignum_greatereq()
{ {
POP_BIGNUMS(x,y); POP_BIGNUMS(x,y);
ctx->push(tag_boolean(bignum_compare(x,y) != bignum_comparison_less)); ctx->replace(tag_boolean(bignum_compare(x,y) != bignum_comparison_less));
} }
void factor_vm::primitive_bignum_not() void factor_vm::primitive_bignum_not()
@ -262,60 +262,60 @@ void factor_vm::primitive_format_float()
#define POP_FLOATS(x,y) \ #define POP_FLOATS(x,y) \
double y = untag_float(ctx->pop()); \ double y = untag_float(ctx->pop()); \
double x = untag_float(ctx->pop()); double x = untag_float(ctx->peek());
void factor_vm::primitive_float_eq() void factor_vm::primitive_float_eq()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(tag_boolean(x == y)); ctx->replace(tag_boolean(x == y));
} }
void factor_vm::primitive_float_add() void factor_vm::primitive_float_add()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(allot_float(x + y)); ctx->replace(allot_float(x + y));
} }
void factor_vm::primitive_float_subtract() void factor_vm::primitive_float_subtract()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(allot_float(x - y)); ctx->replace(allot_float(x - y));
} }
void factor_vm::primitive_float_multiply() void factor_vm::primitive_float_multiply()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(allot_float(x * y)); ctx->replace(allot_float(x * y));
} }
void factor_vm::primitive_float_divfloat() void factor_vm::primitive_float_divfloat()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(allot_float(x / y)); ctx->replace(allot_float(x / y));
} }
void factor_vm::primitive_float_less() void factor_vm::primitive_float_less()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(tag_boolean(x < y)); ctx->replace(tag_boolean(x < y));
} }
void factor_vm::primitive_float_lesseq() void factor_vm::primitive_float_lesseq()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(tag_boolean(x <= y)); ctx->replace(tag_boolean(x <= y));
} }
void factor_vm::primitive_float_greater() void factor_vm::primitive_float_greater()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(tag_boolean(x > y)); ctx->replace(tag_boolean(x > y));
} }
void factor_vm::primitive_float_greatereq() void factor_vm::primitive_float_greatereq()
{ {
POP_FLOATS(x,y); POP_FLOATS(x,y);
ctx->push(tag_boolean(x >= y)); ctx->replace(tag_boolean(x >= y));
} }
/* Allocates memory */ /* Allocates memory */