factor/core/cpu/architecture/architecture.factor

202 lines
4.5 KiB
Factor
Raw Normal View History

2008-04-20 06:15:46 -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: arrays generic kernel kernel.private math memory
namespaces sequences layouts system hashtables classes alien
byte-arrays combinators words sets ;
2007-09-20 18:09:08 -04:00
IN: cpu.architecture
2008-04-20 06:15:46 -04:00
! Register classes
SINGLETON: int-regs
SINGLETON: single-float-regs
SINGLETON: double-float-regs
UNION: float-regs single-float-regs double-float-regs ;
UNION: reg-class int-regs float-regs ;
2007-09-20 18:09:08 -04:00
! A pseudo-register class for parameters spilled on the stack
2008-04-04 04:46:30 -04:00
SINGLETON: stack-params
2007-09-20 18:09:08 -04:00
! Return values of this class go here
GENERIC: return-reg ( register-class -- reg )
! Sequence of registers used for parameter passing in class
GENERIC: param-regs ( register-class -- regs )
GENERIC: param-reg ( n register-class -- reg )
M: object param-reg param-regs nth ;
! Sequence mapping vreg-n to native assembler registers
GENERIC: vregs ( register-class -- regs )
! Load a literal (immediate or indirect)
GENERIC# load-literal 1 ( obj vreg -- )
HOOK: load-indirect cpu ( obj reg -- )
2007-09-20 18:09:08 -04:00
HOOK: stack-frame cpu ( frame-size -- n )
2007-09-20 18:09:08 -04:00
: stack-frame* ( -- n )
\ stack-frame get stack-frame ;
! Set up caller stack frame
HOOK: %prologue cpu ( n -- )
2007-09-20 18:09:08 -04:00
2008-06-08 16:32:55 -04:00
: %prologue-later ( -- ) \ %prologue-later , ;
2007-09-20 18:09:08 -04:00
! Tear down stack frame
HOOK: %epilogue cpu ( n -- )
2007-09-20 18:09:08 -04:00
2008-06-08 16:32:55 -04:00
: %epilogue-later ( -- ) \ %epilogue-later , ;
2007-09-20 18:09:08 -04:00
! Store word XT in stack frame
HOOK: %save-word-xt cpu ( -- )
2007-11-04 23:18:05 -05:00
! Store dispatch branch XT in stack frame
HOOK: %save-dispatch-xt cpu ( -- )
2007-11-04 23:18:05 -05:00
M: object %save-dispatch-xt %save-word-xt ;
2007-09-20 18:09:08 -04:00
2008-01-18 17:09:30 -05:00
! Call another word
HOOK: %call cpu ( word -- )
2007-09-20 18:09:08 -04:00
! Local jump for branches
HOOK: %jump-label cpu ( label -- )
2007-09-20 18:09:08 -04:00
! Test if vreg is 'f' or not
2008-04-17 04:06:55 -04:00
HOOK: %jump-f cpu ( label -- )
2007-09-20 18:09:08 -04:00
HOOK: %dispatch cpu ( -- )
HOOK: %dispatch-label cpu ( word -- )
2007-09-20 18:09:08 -04:00
! Return to caller
HOOK: %return cpu ( -- )
2007-09-20 18:09:08 -04:00
! Change datastack height
HOOK: %inc-d cpu ( n -- )
2007-09-20 18:09:08 -04:00
! Change callstack height
HOOK: %inc-r cpu ( n -- )
2007-09-20 18:09:08 -04:00
! Load stack into vreg
HOOK: %peek cpu ( vreg loc -- )
2007-09-20 18:09:08 -04:00
! Store vreg to stack
HOOK: %replace cpu ( vreg loc -- )
2007-09-20 18:09:08 -04:00
2007-09-27 21:23:24 -04:00
! Box and unbox floats
HOOK: %unbox-float cpu ( dst src -- )
HOOK: %box-float cpu ( dst src -- )
2007-09-20 18:09:08 -04:00
! FFI stuff
! Is this integer small enough to appear in value template
! slots?
HOOK: small-enough? cpu ( n -- ? )
2007-09-20 18:09:08 -04:00
! Is this structure small enough to be returned in registers?
HOOK: struct-small-enough? cpu ( size -- ? )
2007-09-20 18:09:08 -04:00
! Do we pass explode value structs?
HOOK: value-structs? cpu ( -- ? )
2007-09-20 18:09:08 -04:00
! If t, fp parameters are shadowed by dummy int parameters
HOOK: fp-shadows-int? cpu ( -- ? )
2007-09-20 18:09:08 -04:00
HOOK: %prepare-unbox cpu ( -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox cpu ( n reg-class func -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox-long-long cpu ( n func -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox-small-struct cpu ( size -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox-large-struct cpu ( n size -- )
2007-09-20 18:09:08 -04:00
HOOK: %box cpu ( n reg-class func -- )
2007-09-20 18:09:08 -04:00
HOOK: %box-long-long cpu ( n func -- )
2007-09-20 18:09:08 -04:00
HOOK: %prepare-box-struct cpu ( size -- )
2007-09-20 18:09:08 -04:00
HOOK: %box-small-struct cpu ( size -- )
2007-09-20 18:09:08 -04:00
HOOK: %box-large-struct cpu ( n size -- )
2007-09-20 18:09:08 -04:00
GENERIC: %save-param-reg ( stack reg reg-class -- )
GENERIC: %load-param-reg ( stack reg reg-class -- )
HOOK: %prepare-alien-invoke cpu ( -- )
2007-09-20 18:09:08 -04:00
HOOK: %prepare-var-args cpu ( -- )
2007-10-30 01:46:41 -04:00
M: object %prepare-var-args ;
HOOK: %alien-invoke cpu ( function library -- )
2007-09-20 18:09:08 -04:00
HOOK: %cleanup cpu ( alien-node -- )
2007-09-20 18:09:08 -04:00
HOOK: %alien-callback cpu ( quot -- )
2007-09-20 18:09:08 -04:00
HOOK: %callback-value cpu ( ctype -- )
2007-09-20 18:09:08 -04:00
! Return to caller with stdcall unwinding (only for x86)
HOOK: %unwind cpu ( n -- )
2007-09-20 18:09:08 -04:00
HOOK: %prepare-alien-indirect cpu ( -- )
2007-09-20 18:09:08 -04:00
HOOK: %alien-indirect cpu ( -- )
2007-09-20 18:09:08 -04:00
M: stack-params param-reg drop ;
GENERIC: v>operand ( obj -- operand )
2008-01-02 19:36:36 -05:00
M: integer v>operand tag-fixnum ;
2007-09-20 18:09:08 -04:00
M: f v>operand drop \ f tag-number ;
M: object load-literal v>operand load-indirect ;
2008-03-26 19:23:19 -04:00
PREDICATE: small-slot < integer cells small-enough? ;
2007-09-20 18:09:08 -04:00
2008-03-26 19:23:19 -04:00
PREDICATE: small-tagged < integer v>operand small-enough? ;
2007-09-20 18:09:08 -04:00
: if-small-struct ( n size true false -- ? )
>r >r over not over struct-small-enough? and
[ nip r> call r> drop ] [ r> drop r> call ] if ;
inline
: %unbox-struct ( n size -- )
[
%unbox-small-struct
] [
%unbox-large-struct
] if-small-struct ;
: %box-struct ( n size -- )
[
%box-small-struct
] [
%box-large-struct
] if-small-struct ;
! Alien accessors
HOOK: %unbox-byte-array cpu ( dst src -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox-alien cpu ( dst src -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox-f cpu ( dst src -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox-any-c-ptr cpu ( dst src -- )
2007-09-20 18:09:08 -04:00
HOOK: %box-alien cpu ( dst src -- )
2007-09-20 18:09:08 -04:00
2008-04-19 05:52:34 -04:00
! GC check
2008-06-08 16:32:55 -04:00
HOOK: %gc cpu ( -- )
2008-04-19 05:52:34 -04:00
2007-09-20 18:09:08 -04:00
: operand ( var -- op ) get v>operand ; inline
: unique-operands ( operands quot -- )
>r [ operand ] map prune r> each ; inline