factor/basis/cpu/architecture/architecture.factor

210 lines
6.0 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.
2008-10-06 01:20:00 -04:00
USING: accessors arrays generic kernel kernel.private math
memory namespaces make sequences layouts system hashtables
2008-10-20 02:56:28 -04:00
classes alien byte-arrays combinators words sets fry ;
2007-09-20 18:09:08 -04:00
IN: cpu.architecture
2008-10-07 17:42:11 -04:00
! Labels
TUPLE: label offset ;
: <label> ( -- label ) label new ;
: define-label ( name -- ) <label> swap set ;
: resolve-label ( label/name -- ) dup label? [ get ] unless , ;
2008-10-07 21:00:38 -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 ;
2008-10-07 17:42:11 -04:00
! Mapping from register class to machine registers
HOOK: machine-registers cpu ( -- assoc )
2008-04-20 06:15:46 -04:00
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 ;
2008-10-28 05:38:37 -04:00
HOOK: two-operand? cpu ( -- ? )
2008-10-20 02:56:28 -04:00
HOOK: %load-immediate cpu ( reg obj -- )
HOOK: %load-indirect cpu ( reg obj -- )
2007-09-20 18:09:08 -04:00
2008-10-20 02:56:28 -04:00
HOOK: %peek cpu ( vreg loc -- )
HOOK: %replace cpu ( vreg loc -- )
HOOK: %inc-d cpu ( n -- )
HOOK: %inc-r cpu ( n -- )
2007-09-20 18:09:08 -04:00
2008-10-19 02:10:45 -04:00
HOOK: stack-frame-size cpu ( stack-frame -- n )
HOOK: %call cpu ( word -- )
HOOK: %jump-label cpu ( label -- )
2008-10-20 02:56:28 -04:00
HOOK: %return cpu ( -- )
2008-10-07 17:17:55 -04:00
HOOK: %dispatch cpu ( src temp offset -- )
HOOK: %dispatch-label cpu ( word -- )
2007-09-20 18:09:08 -04:00
HOOK: %slot cpu ( dst obj slot tag temp -- )
2008-10-20 02:56:28 -04:00
HOOK: %slot-imm cpu ( dst obj slot tag -- )
HOOK: %set-slot cpu ( src obj slot tag temp -- )
2008-10-20 02:56:28 -04:00
HOOK: %set-slot-imm cpu ( src obj slot tag -- )
2008-11-06 02:11:28 -05:00
HOOK: %string-nth cpu ( dst obj index temp -- )
2008-10-20 02:56:28 -04:00
HOOK: %add cpu ( dst src1 src2 -- )
HOOK: %add-imm cpu ( dst src1 src2 -- )
HOOK: %sub cpu ( dst src1 src2 -- )
HOOK: %sub-imm cpu ( dst src1 src2 -- )
HOOK: %mul cpu ( dst src1 src2 -- )
HOOK: %mul-imm cpu ( dst src1 src2 -- )
HOOK: %and cpu ( dst src1 src2 -- )
HOOK: %and-imm cpu ( dst src1 src2 -- )
HOOK: %or cpu ( dst src1 src2 -- )
HOOK: %or-imm cpu ( dst src1 src2 -- )
HOOK: %xor cpu ( dst src1 src2 -- )
HOOK: %xor-imm cpu ( dst src1 src2 -- )
HOOK: %shl-imm cpu ( dst src1 src2 -- )
HOOK: %shr-imm cpu ( dst src1 src2 -- )
HOOK: %sar-imm cpu ( dst src1 src2 -- )
HOOK: %not cpu ( dst src -- )
HOOK: %integer>bignum cpu ( dst src temp -- )
HOOK: %bignum>integer cpu ( dst src temp -- )
2008-10-20 02:56:28 -04:00
HOOK: %add-float cpu ( dst src1 src2 -- )
HOOK: %sub-float cpu ( dst src1 src2 -- )
HOOK: %mul-float cpu ( dst src1 src2 -- )
HOOK: %div-float cpu ( dst src1 src2 -- )
2008-10-20 02:56:28 -04:00
HOOK: %integer>float cpu ( dst src -- )
HOOK: %float>integer cpu ( dst src -- )
2007-09-20 18:09:08 -04:00
2008-10-20 02:56:28 -04:00
HOOK: %copy cpu ( dst src -- )
HOOK: %copy-float cpu ( dst src -- )
HOOK: %unbox-float cpu ( dst src -- )
HOOK: %unbox-any-c-ptr cpu ( dst src temp -- )
2008-10-20 02:56:28 -04:00
HOOK: %box-float cpu ( dst src temp -- )
HOOK: %box-alien cpu ( dst src temp -- )
2007-09-20 18:09:08 -04:00
2008-10-20 02:56:28 -04:00
HOOK: %alien-unsigned-1 cpu ( dst src -- )
HOOK: %alien-unsigned-2 cpu ( dst src -- )
HOOK: %alien-unsigned-4 cpu ( dst src -- )
HOOK: %alien-signed-1 cpu ( dst src -- )
HOOK: %alien-signed-2 cpu ( dst src -- )
HOOK: %alien-signed-4 cpu ( dst src -- )
2008-10-20 02:56:28 -04:00
HOOK: %alien-cell cpu ( dst src -- )
HOOK: %alien-float cpu ( dst src -- )
HOOK: %alien-double cpu ( dst src -- )
HOOK: %set-alien-integer-1 cpu ( ptr value -- )
HOOK: %set-alien-integer-2 cpu ( ptr value -- )
HOOK: %set-alien-integer-4 cpu ( ptr value -- )
HOOK: %set-alien-cell cpu ( ptr value -- )
HOOK: %set-alien-float cpu ( ptr value -- )
HOOK: %set-alien-double cpu ( ptr value -- )
2007-09-20 18:09:08 -04:00
HOOK: %allot cpu ( dst size class temp -- )
2008-10-20 02:56:28 -04:00
HOOK: %write-barrier cpu ( src card# table -- )
HOOK: %gc cpu ( -- )
2007-09-20 18:09:08 -04:00
2008-10-20 02:56:28 -04:00
HOOK: %prologue cpu ( n -- )
HOOK: %epilogue cpu ( n -- )
2007-09-20 18:09:08 -04:00
HOOK: %compare cpu ( dst temp cc src1 src2 -- )
HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- )
HOOK: %compare-float cpu ( dst temp cc src1 src2 -- )
2008-10-21 04:21:29 -04:00
HOOK: %compare-branch cpu ( label cc src1 src2 -- )
HOOK: %compare-imm-branch cpu ( label cc src1 src2 -- )
HOOK: %compare-float-branch cpu ( label cc src1 src2 -- )
2008-10-07 17:17:55 -04:00
2008-10-20 02:56:28 -04:00
HOOK: %spill-integer cpu ( src n -- )
HOOK: %spill-float cpu ( src n -- )
HOOK: %reload-integer cpu ( dst n -- )
HOOK: %reload-float cpu ( dst n -- )
2007-09-20 18:09:08 -04:00
HOOK: %loop-entry cpu ( -- )
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?
2008-11-17 14:34:37 -05:00
HOOK: struct-small-enough? cpu ( c-type -- ? )
2007-09-20 18:09:08 -04:00
2008-11-17 14:34:37 -05:00
! Do we pass this struct by value or hidden reference?
HOOK: value-struct? cpu ( c-type -- ? )
2007-09-20 18:09:08 -04:00
2008-11-08 22:40:47 -05:00
! If t, all parameters are shadowed by dummy stack parameters
HOOK: dummy-stack-params? cpu ( -- ? )
! If t, all FP parameters are shadowed by dummy int parameters
HOOK: dummy-int-params? cpu ( -- ? )
! If t, all int parameters are shadowed by dummy FP parameters
HOOK: dummy-fp-params? 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 ( c-type -- )
2007-09-20 18:09:08 -04:00
HOOK: %unbox-large-struct cpu ( n c-type -- )
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
2008-10-06 01:20:00 -04:00
HOOK: %prepare-box-struct cpu ( -- )
2007-09-20 18:09:08 -04:00
HOOK: %box-small-struct cpu ( c-type -- )
2007-09-20 18:09:08 -04:00
HOOK: %box-large-struct cpu ( n c-type -- )
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
2008-10-13 00:32:14 -04:00
HOOK: %cleanup cpu ( params -- )
M: object %cleanup ( params -- ) drop ;
2007-09-20 18:09:08 -04:00
2008-10-20 02:56:28 -04:00
HOOK: %prepare-alien-indirect cpu ( -- )
HOOK: %alien-indirect cpu ( -- )
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)
2008-10-13 00:32:14 -04:00
HOOK: %callback-return cpu ( params -- )
M: object %callback-return drop %return ;
2007-09-20 18:09:08 -04:00
M: stack-params param-reg drop ;
M: stack-params param-regs drop f ;