+++ /dev/null
-! 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
-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
- 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
- R12 swap type-number tag-fixnum MOV ! compute header
- R12 R11 0 <+> STR ! store header
- ;
-
-: %store-tagged ( reg tag -- )
- >r dup fresh-object v>operand R11 r> tag-number ORR ;
-
-: %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
- ;
-
-: %allot-bignum-signed-1 ( dst src -- )
- ! on entry, reg is a 30-bit quantity sign-extended to
- ! 32-bits.
- ! exits with tagged ptr to bignum in reg.
- [
- "end" define-label
- ! is it zero?
- dup v>operand 0 CMP
- 0 >bignum pick EQ load-literal
- "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
- ! store the number
- v>operand R11 3 cells <+> STR
- ! tag the bignum, store it in reg
- bignum %store-tagged
- "end" resolve-label
- ] with-scope ;
-
-M: arm-backend %box-alien ( dst src -- )
- "end" define-label
- dup v>operand 0 CMP
- over v>operand f v>operand EQ MOV
- "end" get EQ B
- alien 4 cells %allot
- ! Store offset
- v>operand R11 3 cells <+> STR
- 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 ;