factor/basis/cpu/x86/allot/allot.factor

120 lines
3.4 KiB
Factor
Raw Normal View History

2008-08-12 04:31:48 -04:00
! Copyright (C) 2006, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: kernel cpu.architecture cpu.x86.assembler
2008-08-12 04:31:48 -04:00
cpu.x86.architecture kernel.private namespaces math sequences
generic arrays compiler.generator compiler.generator.fixup
compiler.generator.registers system layouts alien ;
2007-09-20 18:09:08 -04:00
IN: cpu.x86.allot
2008-06-08 16:32:55 -04:00
: allot-reg ( -- reg )
2007-09-30 00:34:19 -04:00
#! We temporarily use the datastack register, since it won't
#! be accessed inside the quotation given to %allot in any
#! case.
ds-reg ;
: (object@) ( n -- operand ) allot-reg swap [+] ;
2007-09-20 18:09:08 -04:00
: object@ ( n -- operand ) cells (object@) ;
2008-04-19 05:52:34 -04:00
: load-zone-ptr ( reg -- )
2007-09-20 18:09:08 -04:00
#! Load pointer to start of zone array
2008-04-19 05:52:34 -04:00
0 MOV "nursery" f rc-absolute-cell rel-dlsym ;
2007-09-20 18:09:08 -04:00
: load-allot-ptr ( -- )
2008-04-19 05:52:34 -04:00
allot-reg load-zone-ptr
2007-09-30 00:34:19 -04:00
allot-reg PUSH
allot-reg dup cell [+] MOV ;
2007-09-20 18:09:08 -04:00
: inc-allot-ptr ( n -- )
2007-09-30 00:34:19 -04:00
allot-reg POP
allot-reg cell [+] swap 8 align ADD ;
2007-09-20 18:09:08 -04:00
2008-04-19 21:39:58 -04:00
M: x86 %gc ( -- )
2008-04-19 05:52:34 -04:00
"end" define-label
temp-reg-1 load-zone-ptr
temp-reg-2 temp-reg-1 cell [+] MOV
temp-reg-2 1024 ADD
temp-reg-1 temp-reg-1 3 cells [+] MOV
temp-reg-2 temp-reg-1 CMP
"end" get JLE
0 frame-required
%prepare-alien-invoke
"minor_gc" f %alien-invoke
"end" resolve-label ;
2007-09-20 18:09:08 -04:00
: store-header ( header -- )
2008-01-02 19:36:36 -05:00
0 object@ swap type-number tag-fixnum MOV ;
2007-09-20 18:09:08 -04:00
: %allot ( header size quot -- )
2007-09-30 00:34:19 -04:00
allot-reg PUSH
2007-09-20 18:09:08 -04:00
swap >r >r
load-allot-ptr
store-header
r> call
2007-09-30 00:34:19 -04:00
r> inc-allot-ptr
allot-reg POP ; inline
2007-09-20 18:09:08 -04:00
: %store-tagged ( reg tag -- )
>r dup fresh-object v>operand r>
2007-09-30 00:34:19 -04:00
allot-reg swap tag-number OR
allot-reg MOV ;
2007-09-20 18:09:08 -04:00
M: x86 %box-float ( dst src -- )
2007-09-20 18:09:08 -04:00
#! Only called by pentium4 backend, uses SSE2 instruction
#! dest is a loc or a vreg
float 16 [
8 (object@) swap v>operand MOVSD
float %store-tagged
] %allot ;
: %allot-bignum-signed-1 ( outreg inreg -- )
#! on entry, inreg is a signed 32-bit quantity
#! exits with tagged ptr to bignum in outreg
#! 1 cell header, 1 cell length, 1 cell sign, + digits
#! length is the # of digits + sign
[
{ "end" "nonzero" "positive" "store" }
[ define-label ] each
dup v>operand 0 CMP ! is it zero?
"nonzero" get JNE
0 >bignum pick load-literal ! this is our result
"end" get JMP
"nonzero" resolve-label
bignum 4 cells [
! Write length
1 object@ 2 v>operand MOV
! Test sign
dup v>operand 0 CMP
"positive" get JGE
2 object@ 1 MOV ! negative sign
dup v>operand NEG
"store" get JMP
"positive" resolve-label
2 object@ 0 MOV ! positive sign
"store" resolve-label
3 object@ swap v>operand MOV
! Store tagged ptr in reg
bignum %store-tagged
] %allot
"end" resolve-label
] with-scope ;
M: x86 %box-alien ( dst src -- )
2007-09-20 18:09:08 -04:00
[
{ "end" "f" } [ define-label ] each
2007-09-30 00:34:19 -04:00
dup v>operand 0 CMP
2007-09-20 18:09:08 -04:00
"f" get JE
alien 4 cells [
1 object@ f v>operand MOV
2 object@ f v>operand MOV
2007-09-30 00:34:19 -04:00
! Store src in alien-offset slot
3 object@ swap v>operand MOV
! Store tagged ptr in dst
dup object %store-tagged
2007-09-20 18:09:08 -04:00
] %allot
"end" get JMP
"f" resolve-label
2008-03-29 21:36:58 -04:00
f [ v>operand ] bi@ MOV
2007-09-20 18:09:08 -04:00
"end" resolve-label
] with-scope ;