vm: speed up primitive_fixnum_divmod by 10-12%.
parent
b541986b4e
commit
ed8496b583
20
vm/math.cpp
20
vm/math.cpp
|
@ -18,7 +18,7 @@ void factor_vm::primitive_float_to_fixnum()
|
||||||
by -1. */
|
by -1. */
|
||||||
void factor_vm::primitive_fixnum_divint()
|
void factor_vm::primitive_fixnum_divint()
|
||||||
{
|
{
|
||||||
fixnum y = untag_fixnum(ctx->pop()); \
|
fixnum y = untag_fixnum(ctx->pop());
|
||||||
fixnum x = untag_fixnum(ctx->peek());
|
fixnum x = untag_fixnum(ctx->peek());
|
||||||
fixnum result = x / y;
|
fixnum result = x / y;
|
||||||
if(result == -fixnum_min)
|
if(result == -fixnum_min)
|
||||||
|
@ -31,18 +31,22 @@ void factor_vm::primitive_fixnum_divint()
|
||||||
/* does not allocate, even though from_signed_cell can allocate */
|
/* does not allocate, even though from_signed_cell can allocate */
|
||||||
void factor_vm::primitive_fixnum_divmod()
|
void factor_vm::primitive_fixnum_divmod()
|
||||||
{
|
{
|
||||||
cell y = ((cell *)ctx->datastack)[0];
|
cell *s0 = (cell *)(ctx->datastack);
|
||||||
cell x = ((cell *)ctx->datastack)[-1];
|
cell *s1 = (cell *)(ctx->datastack - sizeof(cell));
|
||||||
if(y == tag_fixnum(-1) && x == tag_fixnum(fixnum_min))
|
fixnum y = untag_fixnum(*s0);
|
||||||
|
fixnum x = untag_fixnum(*s1);
|
||||||
|
if(y == -1 && x == fixnum_min)
|
||||||
{
|
{
|
||||||
/* Does not allocate */
|
/* Does not allocate */
|
||||||
((cell *)ctx->datastack)[-1] = from_signed_cell(-fixnum_min);
|
*s1 = from_signed_cell(-fixnum_min);
|
||||||
((cell *)ctx->datastack)[0] = tag_fixnum(0);
|
*s0 = tag_fixnum(0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
((cell *)ctx->datastack)[-1] = tag_fixnum(untag_fixnum(x) / untag_fixnum(y));
|
fixnum z = x / y;
|
||||||
((cell *)ctx->datastack)[0] = (fixnum)x % (fixnum)y;
|
fixnum w = x % y;
|
||||||
|
*s1 = tag_fixnum(z);
|
||||||
|
*s0 = tag_fixnum(w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue