fixnum-shift-fast and fixnum-mod subprimitives
parent
dd20b39cd6
commit
44a2499c17
|
@ -6,6 +6,9 @@ IN: bootstrap.x86
|
|||
|
||||
4 \ cell set
|
||||
|
||||
: shift-arg ( -- reg ) ECX ;
|
||||
: div-arg ( -- reg ) EAX ;
|
||||
: mod-arg ( -- reg ) EDX ;
|
||||
: arg0 ( -- reg ) EAX ;
|
||||
: arg1 ( -- reg ) EDX ;
|
||||
: temp-reg ( -- reg ) EBX ;
|
||||
|
|
|
@ -6,6 +6,9 @@ IN: bootstrap.x86
|
|||
|
||||
8 \ cell set
|
||||
|
||||
: shift-arg ( -- reg ) RCX ;
|
||||
: div-arg ( -- reg ) RAX ;
|
||||
: mod-arg ( -- reg ) RDX ;
|
||||
: arg0 ( -- reg ) RDI ;
|
||||
: arg1 ( -- reg ) RSI ;
|
||||
: temp-reg ( -- reg ) RBX ;
|
||||
|
|
|
@ -303,20 +303,30 @@ big-endian off
|
|||
] f f f \ fixnum-bitnot define-sub-primitive
|
||||
|
||||
[
|
||||
ECX ds-reg [] MOV ! load shift count
|
||||
ECX tag-bits get SHR ! untag shift count
|
||||
shift-arg ds-reg [] MOV ! load shift count
|
||||
shift-arg tag-bits get SAR ! untag shift count
|
||||
ds-reg bootstrap-cell SUB ! adjust stack pointer
|
||||
arg0 ds-reg [] MOV ! load value
|
||||
arg1 arg0 MOV ! make a copy
|
||||
arg1 CL SHL ! compute positive shift value in arg1
|
||||
ECX NEG ! compute negative shift value in arg0
|
||||
arg0 CL SHR
|
||||
shift-arg NEG ! compute negative shift value in arg0
|
||||
arg0 CL SAR
|
||||
arg0 tag-mask get bitnot AND
|
||||
ECX 0 CMP ! if shift count was negative, move arg0 to arg1
|
||||
arg1 arg0 CMOVLE
|
||||
shift-arg 0 CMP ! if shift count was negative, move arg0 to arg1
|
||||
arg1 arg0 CMOVGE
|
||||
ds-reg [] arg1 MOV ! push to stack
|
||||
] f f f \ fixnum-shift-fast define-sub-primitive
|
||||
|
||||
[
|
||||
temp-reg ds-reg [] MOV ! load second parameter
|
||||
ds-reg bootstrap-cell SUB ! adjust stack pointer
|
||||
div-arg ds-reg [] MOV ! load first parameter
|
||||
mod-arg div-arg MOV ! make a copy
|
||||
mod-arg bootstrap-cell-bits 1- SAR ! sign-extend
|
||||
temp-reg IDIV ! divide
|
||||
ds-reg [] mod-arg MOV ! push to stack
|
||||
] f f f \ fixnum-mod define-sub-primitive
|
||||
|
||||
[
|
||||
arg0 ds-reg [] MOV ! load local number
|
||||
fixnum>slot@ ! turn local number into offset
|
||||
|
|
|
@ -346,6 +346,8 @@ tuple
|
|||
{ "fixnum-bitor" "math.private" }
|
||||
{ "fixnum-bitxor" "math.private" }
|
||||
{ "fixnum-bitnot" "math.private" }
|
||||
{ "fixnum-mod" "math.private" }
|
||||
{ "fixnum-shift-fast" "math.private" }
|
||||
{ "fixnum<" "math.private" }
|
||||
{ "fixnum<=" "math.private" }
|
||||
{ "fixnum>" "math.private" }
|
||||
|
@ -399,10 +401,8 @@ tuple
|
|||
{ "fixnum-" "math.private" }
|
||||
{ "fixnum*" "math.private" }
|
||||
{ "fixnum/i" "math.private" }
|
||||
{ "fixnum-mod" "math.private" }
|
||||
{ "fixnum/mod" "math.private" }
|
||||
{ "fixnum-shift" "math.private" }
|
||||
{ "fixnum-shift-fast" "math.private" }
|
||||
{ "bignum=" "math.private" }
|
||||
{ "bignum+" "math.private" }
|
||||
{ "bignum-" "math.private" }
|
||||
|
|
12
vm/math.c
12
vm/math.c
|
@ -85,12 +85,6 @@ DEFINE_PRIMITIVE(fixnum_divmod)
|
|||
dpush(tag_fixnum(x % y));
|
||||
}
|
||||
|
||||
DEFINE_PRIMITIVE(fixnum_mod)
|
||||
{
|
||||
POP_FIXNUMS(x,y)
|
||||
dpush(tag_fixnum(x % y));
|
||||
}
|
||||
|
||||
/*
|
||||
* Note the hairy overflow check.
|
||||
* If we're shifting right by n bits, we won't overflow as long as none of the
|
||||
|
@ -127,12 +121,6 @@ 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)));
|
||||
}
|
||||
|
||||
/* Bignums */
|
||||
DEFINE_PRIMITIVE(fixnum_to_bignum)
|
||||
{
|
||||
|
|
|
@ -14,9 +14,7 @@ DECLARE_PRIMITIVE(fixnum_subtract);
|
|||
DECLARE_PRIMITIVE(fixnum_multiply);
|
||||
DECLARE_PRIMITIVE(fixnum_divint);
|
||||
DECLARE_PRIMITIVE(fixnum_divmod);
|
||||
DECLARE_PRIMITIVE(fixnum_mod);
|
||||
DECLARE_PRIMITIVE(fixnum_shift);
|
||||
DECLARE_PRIMITIVE(fixnum_shift_fast);
|
||||
|
||||
CELL bignum_zero;
|
||||
CELL bignum_pos_one;
|
||||
|
|
|
@ -19,10 +19,8 @@ void *primitives[] = {
|
|||
primitive_fixnum_subtract,
|
||||
primitive_fixnum_multiply,
|
||||
primitive_fixnum_divint,
|
||||
primitive_fixnum_mod,
|
||||
primitive_fixnum_divmod,
|
||||
primitive_fixnum_shift,
|
||||
primitive_fixnum_shift_fast,
|
||||
primitive_bignum_eq,
|
||||
primitive_bignum_add,
|
||||
primitive_bignum_subtract,
|
||||
|
|
Loading…
Reference in New Issue