From ae4f9a2809dc9806c9c2cac5059ff34834fc0273 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 21 Nov 2008 02:11:36 -0600 Subject: [PATCH] Add fixnum/mod-fast and fixnum/i-fast subprimitives --- basis/cpu/ppc/bootstrap.factor | 18 +++++++++++++ basis/cpu/x86/bootstrap.factor | 25 ++++++++++++++++--- .../partial-dispatch/partial-dispatch.factor | 2 ++ core/bootstrap/primitives.factor | 2 ++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/basis/cpu/ppc/bootstrap.factor b/basis/cpu/ppc/bootstrap.factor index aee0f3f4f3..efe55f9a22 100644 --- a/basis/cpu/ppc/bootstrap.factor +++ b/basis/cpu/ppc/bootstrap.factor @@ -335,6 +335,24 @@ big-endian on 7 ds-reg 0 STW ] f f f \ fixnum-mod define-sub-primitive +[ + 3 ds-reg 0 LWZ + ds-reg ds-reg 4 SUBI + 4 ds-reg 0 LWZ + 5 4 3 DIVW + 5 ds-reg 0 STW +] f f f \ fixnum/i-fast define-sub-primitive + +[ + 3 ds-reg 0 LWZ + 4 ds-reg -4 LWZ + 5 4 3 DIVW + 6 5 3 MULLW + 7 6 4 SUBF + 5 ds-reg -4 STW + 7 ds-reg 0 STW +] f f f \ fixnum-/mod-fast define-sub-primitive + [ 3 ds-reg 0 LWZ 3 3 1 SRAWI diff --git a/basis/cpu/x86/bootstrap.factor b/basis/cpu/x86/bootstrap.factor index 1ee74a434b..2c54880788 100644 --- a/basis/cpu/x86/bootstrap.factor +++ b/basis/cpu/x86/bootstrap.factor @@ -305,16 +305,33 @@ big-endian off ds-reg [] arg1 MOV ! push to stack ] f f f \ fixnum-shift-fast define-sub-primitive -[ +: jit-fixnum-/mod temp-reg ds-reg [] MOV ! load second parameter - ds-reg bootstrap-cell SUB ! adjust stack pointer - div-arg ds-reg [] MOV ! load first parameter + div-arg ds-reg bootstrap-cell neg [+] 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 + temp-reg IDIV ; ! divide + +[ + jit-fixnum-/mod + ds-reg bootstrap-cell SUB ! adjust stack pointer ds-reg [] mod-arg MOV ! push to stack ] f f f \ fixnum-mod define-sub-primitive +[ + jit-fixnum-/mod + ds-reg bootstrap-cell SUB ! adjust stack pointer + div-arg tag-bits get SHL ! tag it + ds-reg [] div-arg MOV ! push to stack +] f f f \ fixnum/i-fast define-sub-primitive + +[ + jit-fixnum-/mod + div-arg tag-bits get SHL ! tag it + ds-reg [] mod-arg MOV ! push to stack + ds-reg bootstrap-cell neg [+] div-arg MOV +] f f f \ fixnum/mod-fast define-sub-primitive + [ arg0 ds-reg [] MOV ! load local number fixnum>slot@ ! turn local number into offset diff --git a/basis/math/partial-dispatch/partial-dispatch.factor b/basis/math/partial-dispatch/partial-dispatch.factor index 6874b79d2e..ddde4e1244 100644 --- a/basis/math/partial-dispatch/partial-dispatch.factor +++ b/basis/math/partial-dispatch/partial-dispatch.factor @@ -29,6 +29,8 @@ M: word integer-op-input-classes { fixnum- fixnum-fast } { fixnum* fixnum*fast } { fixnum-shift fixnum-shift-fast } + { fixnum/i fixnum/i-fast } + { fixnum/mod fixnum/mod-fast } } at ; : modular-variant ( op -- fast-op ) diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor index 24faf81662..20113d0e25 100644 --- a/core/bootstrap/primitives.factor +++ b/core/bootstrap/primitives.factor @@ -341,6 +341,8 @@ tuple { "fixnum-bitnot" "math.private" } { "fixnum-mod" "math.private" } { "fixnum-shift-fast" "math.private" } + { "fixnum/i-fast" "math.private" } + { "fixnum/mod-fast" "math.private" } { "fixnum<" "math.private" } { "fixnum<=" "math.private" } { "fixnum>" "math.private" }