vm: speed up primitive_fixnum_divmod by 10-12%.

db4
John Benediktsson 2012-08-22 21:46:59 -07:00
parent b541986b4e
commit ed8496b583
1 changed files with 12 additions and 8 deletions

View File

@ -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);
} }
} }