diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor index 9858ccb5ec..3e93a868ca 100755 --- a/core/bootstrap/primitives.factor +++ b/core/bootstrap/primitives.factor @@ -441,6 +441,7 @@ builtins get num-tags get tail f union-class define-class { "fixnum-bitxor" "math.private" } { "fixnum-bitnot" "math.private" } { "fixnum-shift" "math.private" } + { "fixnum-shift-fast" "math.private" } { "fixnum<" "math.private" } { "fixnum<=" "math.private" } { "fixnum>" "math.private" } diff --git a/vm/math.c b/vm/math.c index a8bc76c2b1..8c4e7d537a 100644 --- a/vm/math.c +++ b/vm/math.c @@ -166,6 +166,12 @@ DEFINE_PRIMITIVE(fixnum_shift) fixnum_to_bignum(x),y))); } +DEFINE_PRIMITIVE(fixnum_shift_fast) +{ + POP_FIXNUMS(x,y) + dpush(tag_fixnum(y < 0 ? (x >> -y) : (x << y))); +} + DEFINE_PRIMITIVE(fixnum_less) { POP_FIXNUMS(x,y) diff --git a/vm/math.h b/vm/math.h index 7e427b4833..d82a373571 100644 --- a/vm/math.h +++ b/vm/math.h @@ -22,6 +22,7 @@ DECLARE_PRIMITIVE(fixnum_and); DECLARE_PRIMITIVE(fixnum_or); DECLARE_PRIMITIVE(fixnum_xor); DECLARE_PRIMITIVE(fixnum_shift); +DECLARE_PRIMITIVE(fixnum_shift_fast); DECLARE_PRIMITIVE(fixnum_less); DECLARE_PRIMITIVE(fixnum_lesseq); DECLARE_PRIMITIVE(fixnum_greater); diff --git a/vm/primitives.c b/vm/primitives.c index 9bc1323eae..dd96ee1495 100755 --- a/vm/primitives.c +++ b/vm/primitives.c @@ -33,6 +33,7 @@ void *primitives[] = { primitive_fixnum_xor, primitive_fixnum_not, primitive_fixnum_shift, + primitive_fixnum_shift_fast, primitive_fixnum_less, primitive_fixnum_lesseq, primitive_fixnum_greater,