factor/unmaintained/arm/allot/allot.factor

80 lines
2.3 KiB
Factor
Raw Normal View History

2007-09-20 18:09:08 -04:00
! Copyright (C) 2006, 2007 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel cpu.architecture cpu.arm.assembler
cpu.arm.architecture namespaces math sequences
2007-09-20 18:09:08 -04:00
generator generator.registers generator.fixup system layouts
alien ;
IN: cpu.arm.allot
: load-zone-ptr ( reg -- ) "nursery" f rot %alien-global ;
: %allot ( header size -- )
#! Store a pointer to 'size' bytes allocated from the
#! nursery in R11
2007-09-20 18:09:08 -04:00
8 align ! align the size
R12 load-zone-ptr ! nusery -> r12
R11 R12 cell <+> LDR ! nursery.here -> r11
R11 R11 pick ADD ! increment r11
R11 R12 cell <+> STR ! r11 -> nursery.here
R11 R11 rot SUB ! old value
2008-01-02 19:36:36 -05:00
R12 swap type-number tag-fixnum MOV ! compute header
R12 R11 0 <+> STR ! store header
2007-09-20 18:09:08 -04:00
;
: %store-tagged ( reg tag -- )
2007-10-18 02:37:52 -04:00
>r dup fresh-object v>operand R11 r> tag-number ORR ;
2007-09-20 18:09:08 -04:00
: %allot-bignum ( #digits -- )
#! 1 cell header, 1 cell length, 1 cell sign, + digits
#! length is the # of digits + sign
bignum over 3 + cells %allot
R12 swap 1+ v>operand MOV ! compute the length
R12 R11 cell <+> STR ! store the length
2007-09-20 18:09:08 -04:00
;
2007-10-18 02:37:52 -04:00
: %allot-bignum-signed-1 ( dst src -- )
2007-09-20 18:09:08 -04:00
#! on entry, reg is a 30-bit quantity sign-extended to
#! 32-bits.
2007-10-18 02:37:52 -04:00
#! exits with tagged ptr to bignum in reg.
2007-09-20 18:09:08 -04:00
[
"end" define-label
! is it zero?
dup v>operand 0 CMP
2007-10-21 15:18:31 -04:00
0 >bignum pick EQ load-literal
2007-09-20 18:09:08 -04:00
"end" get EQ B
! ! it is non-zero
1 %allot-bignum
! is the fixnum negative?
dup v>operand 0 CMP
! negative sign
R12 1 LT MOV
! negate fixnum
dup v>operand dup 0 LT RSB
! positive sign
R12 0 GE MOV
! store sign
R12 R11 2 cells <+> STR
2007-09-20 18:09:08 -04:00
! store the number
2007-10-18 02:37:52 -04:00
v>operand R11 3 cells <+> STR
2007-09-20 18:09:08 -04:00
! tag the bignum, store it in reg
2007-10-18 02:37:52 -04:00
bignum %store-tagged
2007-09-20 18:09:08 -04:00
"end" resolve-label
] with-scope ;
M: arm-backend %box-alien ( dst src -- )
"end" define-label
dup v>operand 0 CMP
2007-10-21 15:18:31 -04:00
over v>operand f v>operand EQ MOV
"end" get EQ B
alien 4 cells %allot
! Store offset
v>operand R11 3 cells <+> STR
2007-10-21 15:18:31 -04:00
R12 f v>operand MOV
! Store expired slot
R12 R11 1 cells <+> STR
! Store underlying-alien slot
R12 R11 2 cells <+> STR
! Store tagged ptr in reg
object %store-tagged
"end" resolve-label ;