IN: compiler.cfg.builder.tests
USING: tools.test kernel sequences
-words sequences.private fry prettyprint alien
+words sequences.private fry prettyprint alien alien.accessors
math.private compiler.tree.builder compiler.tree.optimizer
-compiler.cfg.builder compiler.cfg.debugger ;
+compiler.cfg.builder compiler.cfg.debugger arrays locals byte-arrays
+kernel.private math ;
\ build-cfg must-infer
! Just ensure that various CFGs build correctly.
+: unit-test-cfg ( quot -- ) '[ _ test-cfg drop ] [ ] swap unit-test ;
+
{
[ ]
[ dup ]
[ swap ]
[ >r r> ]
[ fixnum+ ]
+ [ fixnum+fast ]
+ [ 3 fixnum+fast ]
+ [ fixnum*fast ]
+ [ 3 fixnum*fast ]
+ [ fixnum-shift-fast ]
+ [ 10 fixnum-shift-fast ]
+ [ -10 fixnum-shift-fast ]
+ [ 0 fixnum-shift-fast ]
+ [ fixnum-bitnot ]
+ [ eq? ]
+ [ "hi" eq? ]
[ fixnum< ]
+ [ 5 fixnum< ]
+ [ float+ ]
+ [ 3.0 float+ ]
+ [ float<= ]
+ [ fixnum>bignum ]
+ [ bignum>fixnum ]
+ [ fixnum>float ]
+ [ float>fixnum ]
+ [ 3 f <array> ]
[ [ 1 ] [ 2 ] if ]
[ fixnum< [ 1 ] [ 2 ] if ]
[ float+ [ 2.0 float* ] [ 3.0 float* ] bi float/f ]
[ "int" { "int" } "cdecl" alien-indirect ]
[ "int" { "int" } "cdecl" [ ] alien-callback ]
} [
- '[ _ test-cfg drop ] [ ] swap unit-test
+ unit-test-cfg
] each
: test-1 ( -- ) test-1 ;
test-1
test-2
test-3
-} [
- '[ _ test-cfg drop ] [ ] swap unit-test
+} [ unit-test-cfg ] each
+
+{
+ byte-array
+ simple-alien
+ alien
+ POSTPONE: f
+} [| class |
+ {
+ alien-signed-1
+ alien-signed-2
+ alien-signed-4
+ alien-unsigned-1
+ alien-unsigned-2
+ alien-unsigned-4
+ alien-cell
+ alien-float
+ alien-double
+ } [| word |
+ { class } word '[ _ declare 10 _ execute ] unit-test-cfg
+ { class fixnum } word '[ _ declare _ execute ] unit-test-cfg
+ ] each
+
+ {
+ set-alien-signed-1
+ set-alien-signed-2
+ set-alien-signed-4
+ set-alien-unsigned-1
+ set-alien-unsigned-2
+ set-alien-unsigned-4
+ } [| word |
+ { fixnum class } word '[ _ declare 10 _ execute ] unit-test-cfg
+ { fixnum class fixnum } word '[ _ declare _ execute ] unit-test-cfg
+ ] each
+
+ { float class } \ set-alien-float '[ _ declare 10 _ execute ] unit-test-cfg
+ { float class fixnum } \ set-alien-float '[ _ declare _ execute ] unit-test-cfg
+
+ { float class } \ set-alien-double '[ _ declare 10 _ execute ] unit-test-cfg
+ { float class fixnum } \ set-alien-double '[ _ declare _ execute ] unit-test-cfg
+
+ { pinned-c-ptr class } \ set-alien-cell '[ _ declare 10 _ execute ] unit-test-cfg
+ { pinned-c-ptr class fixnum } \ set-alien-cell '[ _ declare _ execute ] unit-test-cfg
] each
init-phantoms ;
: ##branch-t ( vreg -- )
- \ f tag-number cc/= ##binary-imm-branch ;
+ \ f tag-number cc/= ##compare-imm-branch ;
M: #if emit-node
phantom-pop ##branch-t emit-if iterate-next ;
: emit-dispatch ( node -- )
phantom-pop int-regs next-vreg
- [ finalize-phantoms ##epilogue ] 2dip ##dispatch
+ [ finalize-phantoms ##epilogue ] 2dip
+ [ ^^offset>slot ] dip
+ ##dispatch
dispatch-branches init-phantoms ;
: <dispatch-block> ( -- word )
: emit-tag ( -- )
phantom-pop tag-mask get ^^and-imm ^^tag-fixnum phantom-push ;
-: ^^offset>slot ( vreg -- vreg' ) cell 4 = [ 1 ^^shr-imm ] when ;
-
: (emit-slot) ( infos -- dst )
[ 2phantom-pop ] [ third literal>> ] bi*
^^slot ;
: (emit-set-slot) ( infos -- )
[ 3phantom-pop ] [ fourth literal>> ] bi*
- ##set-slot ;
+ ^^set-slot ;
: (emit-set-slot-imm) ( infos -- )
1 phantom-drop
[ infos imm-insn (emit-fixnum-imm-op) ]
[ insn (emit-fixnum-op) ]
if
+ phantom-push
] ; inline
: emit-primitive ( node -- )
phantom-push ;
: emit-fixnum-comparison ( node cc -- )
- [ '[ _ ##boolean ] ] [ '[ _ ##boolean-imm ] ] bi
+ [ '[ _ ^^compare ] ] [ '[ _ ^^compare-imm ] ] bi
emit-fixnum-op ;
: emit-bignum>fixnum ( -- )
phantom-pop ^^untag-fixnum ^^integer>bignum phantom-push ;
: emit-float-op ( insn -- )
- [ 2phantom-pop [ ^^unbox-float ] bi@ ] dip call ^^box-float ; inline
+ [ 2phantom-pop [ ^^unbox-float ] bi@ ] dip call ^^box-float
+ phantom-push ; inline
: emit-float-comparison ( cc -- )
- '[ _ ##boolean ] emit-float-op ;
+ [ 2phantom-pop [ ^^unbox-float ] bi@ ] dip ^^compare-float
+ phantom-push ; inline
: emit-float>fixnum ( -- )
phantom-pop ^^unbox-float ^^float>integer ^^tag-fixnum phantom-push ;
! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: kernel cpu.architecture compiler.cfg.registers
+USING: kernel layouts cpu.architecture compiler.cfg.registers
compiler.cfg.instructions ;
IN: compiler.cfg.builder.hats
: ^^load-literal ( obj -- dst ) ^^i1 ##load-literal ; inline
: ^^peek ( loc -- dst ) ^^i1 ##peek ; inline
-: ^^slot ( obj slot tag -- dst ) ^^i3 ##slot ; inline
+: ^^slot ( obj slot tag -- dst ) ^^i3 i ##slot ; inline
: ^^slot-imm ( obj slot tag -- dst ) ^^i3 ##slot-imm ; inline
+: ^^set-slot ( src obj slot tag -- ) i ##set-slot ; inline
: ^^add ( src1 src2 -- dst ) ^^i2 ##add ; inline
: ^^add-imm ( src1 src2 -- dst ) ^^i2 ##add-imm ; inline
: ^^sub ( src1 src2 -- dst ) ^^i2 ##sub ; inline
: ^^shr-imm ( src1 src2 -- dst ) ^^i2 ##shr-imm ; inline
: ^^sar-imm ( src1 src2 -- dst ) ^^i2 ##sar-imm ; inline
: ^^not ( src -- dst ) ^^i1 ##not ; inline
-: ^^bignum>integer ( src -- dst ) ^^i1 ##bignum>integer ; inline
+: ^^bignum>integer ( src -- dst ) ^^i1 i ##bignum>integer ; inline
: ^^integer>bignum ( src -- dst ) ^^i1 i ##integer>bignum ; inline
: ^^add-float ( src1 src2 -- dst ) ^^d2 ##add-float ; inline
: ^^sub-float ( src1 src2 -- dst ) ^^d2 ##sub-float ; inline
: ^^mul-float ( src1 src2 -- dst ) ^^d2 ##mul-float ; inline
: ^^div-float ( src1 src2 -- dst ) ^^d2 ##div-float ; inline
: ^^float>integer ( src -- dst ) ^^i1 ##float>integer ; inline
-: ^^integer>float ( src -- dst ) ^^d1 i ##integer>float ; inline
+: ^^integer>float ( src -- dst ) ^^d1 ##integer>float ; inline
: ^^allot ( size type tag -- dst ) ^^i3 i ##allot ; inline
: ^^write-barrier ( src -- ) i i ##write-barrier ; inline
: ^^box-float ( src -- dst ) ^^i1 i ##box-float ; inline
: ^^unbox-float ( src -- dst ) ^^d1 ##unbox-float ; inline
: ^^box-alien ( src -- dst ) ^^i1 i ##box-alien ; inline
: ^^unbox-alien ( src -- dst ) ^^i1 ##unbox-alien ; inline
-: ^^unbox-c-ptr ( src class -- dst ) ^^i2 ##unbox-c-ptr ;
+: ^^unbox-c-ptr ( src class -- dst ) ^^i2 i ##unbox-c-ptr ;
: ^^alien-unsigned-1 ( src -- dst ) ^^i1 ##alien-unsigned-1 ; inline
: ^^alien-unsigned-2 ( src -- dst ) ^^i1 ##alien-unsigned-2 ; inline
: ^^alien-unsigned-4 ( src -- dst ) ^^i1 ##alien-unsigned-4 ; inline
: ^^alien-signed-1 ( src -- dst ) ^^i1 ##alien-signed-1 ; inline
: ^^alien-signed-2 ( src -- dst ) ^^i1 ##alien-signed-2 ; inline
-: ^^alien-signed-4 ( src -- dst ) ^^i1 ##alien-signed-3 ; inline
+: ^^alien-signed-4 ( src -- dst ) ^^i1 ##alien-signed-4 ; inline
: ^^alien-cell ( src -- dst ) ^^i1 ##alien-cell ; inline
: ^^alien-float ( src -- dst ) ^^i1 ##alien-float ; inline
: ^^alien-double ( src -- dst ) ^^i1 ##alien-double ; inline
+: ^^compare ( src1 src2 -- dst ) ^^i2 ##compare ; inline
+: ^^compare-imm ( src1 src2 -- dst ) ^^i2 ##compare-imm ; inline
+: ^^compare-float ( src1 src2 -- dst ) ^^i2 ##compare-float ; inline
+: ^^offset>slot ( vreg -- vreg' ) cell 4 = [ 1 ^^shr-imm ] when ; inline
GENERIC: defs-vregs ( insn -- seq )
GENERIC: uses-vregs ( insn -- seq )
-: allot-defs-vregs ( insn -- seq ) [ dst>> ] [ temp>> ] bi 2array ;
+: dst/tmp-vregs ( insn -- seq ) [ dst>> ] [ temp>> ] bi 2array ;
M: ##flushable defs-vregs dst>> 1array ;
M: ##write-barrier defs-vregs [ card#>> ] [ table>> ] bi 2array ;
-M: ##boxer defs-vregs allot-defs-vregs ;
-M: ##allot defs-vregs allot-defs-vregs ;
+M: ##unary/temp defs-vregs dst/tmp-vregs ;
+M: ##allot defs-vregs dst/tmp-vregs ;
M: ##dispatch defs-vregs temp>> 1array ;
M: insn defs-vregs drop f ;
M: ##slot-imm uses-vregs obj>> 1array ;
M: ##set-slot uses-vregs [ src>> ] [ obj>> ] [ slot>> ] tri 3array ;
M: ##set-slot-imm uses-vregs [ src>> ] [ obj>> ] bi 2array ;
-M: ##binary-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ;
-M: ##binary-imm-branch uses-vregs src1>> 1array ;
+M: ##conditional-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ;
+M: ##compare-imm-branch uses-vregs src1>> 1array ;
M: ##dispatch uses-vregs src>> 1array ;
-M: _binary-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ;
-M: _binary-imm-branch uses-vregs src1>> 1array ;
+M: _conditional-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ;
+M: _compare-imm-branch uses-vregs src1>> 1array ;
M: insn uses-vregs drop f ;
! See http://factorcode.org/license.txt for BSD license.
USING: assocs accessors arrays kernel sequences namespaces words
math math.order layouts classes.algebra alien byte-arrays
-combinators compiler.cfg.registers
+compiler.constants combinators compiler.cfg.registers
compiler.cfg.instructions.syntax ;
IN: compiler.cfg.instructions
TUPLE: ##pure < ##flushable ;
TUPLE: ##unary < ##pure { src vreg } ;
-TUPLE: ##boxer < ##unary { temp vreg } ;
+TUPLE: ##unary/temp < ##unary { temp vreg } ;
TUPLE: ##binary < ##pure { src1 vreg } { src2 vreg } ;
TUPLE: ##binary-imm < ##pure { src1 vreg } { src2 integer } ;
TUPLE: ##commutative < ##binary ;
INSN: ##dispatch-label label ;
! Slot access
-INSN: ##slot < ##read { obj vreg } { slot vreg } { tag integer } ;
+INSN: ##slot < ##read { obj vreg } { slot vreg } { tag integer } { temp vreg } ;
INSN: ##slot-imm < ##read { obj vreg } { slot integer } { tag integer } ;
-INSN: ##set-slot < ##write { obj vreg } { slot vreg } { tag integer } ;
+INSN: ##set-slot < ##write { obj vreg } { slot vreg } { tag integer } { temp vreg } ;
INSN: ##set-slot-imm < ##write { obj vreg } { slot integer } { tag integer } ;
! Integer arithmetic
INSN: ##not < ##unary ;
! Bignum/integer conversion
-INSN: ##integer>bignum < ##boxer ;
-INSN: ##bignum>integer < ##unary ;
+INSN: ##integer>bignum < ##unary/temp ;
+INSN: ##bignum>integer < ##unary/temp ;
! Float arithmetic
INSN: ##add-float < ##commutative ;
INSN: ##copy < ##unary ;
INSN: ##copy-float < ##unary ;
INSN: ##unbox-float < ##unary ;
-INSN: ##unbox-f < ##unary ;
-INSN: ##unbox-alien < ##unary ;
-INSN: ##unbox-byte-array < ##unary ;
-INSN: ##unbox-any-c-ptr < ##unary ;
-INSN: ##box-float < ##boxer ;
-INSN: ##box-alien < ##boxer ;
-
-: ##unbox-c-ptr ( dst src class -- )
+INSN: ##unbox-any-c-ptr < ##unary/temp ;
+INSN: ##box-float < ##unary/temp ;
+INSN: ##box-alien < ##unary/temp ;
+
+: ##unbox-f ( dst src -- ) drop 0 ##load-immediate ;
+: ##unbox-byte-array ( dst src -- ) byte-array-offset ##add-imm ;
+: ##unbox-alien ( dst src -- ) 3 object tag-number ##slot-imm ;
+
+: ##unbox-c-ptr ( dst src class temp -- )
{
- { [ dup \ f class<= ] [ drop ##unbox-f ] }
- { [ dup simple-alien class<= ] [ drop ##unbox-alien ] }
- { [ dup byte-array class<= ] [ drop ##unbox-byte-array ] }
- [ drop ##unbox-any-c-ptr ]
- } cond ; inline
+ { [ over \ f class<= ] [ 2drop ##unbox-f ] }
+ { [ over simple-alien class<= ] [ 2drop ##unbox-alien ] }
+ { [ over byte-array class<= ] [ 2drop ##unbox-byte-array ] }
+ [ nip ##unbox-any-c-ptr ]
+ } cond ;
! Alien accessors
INSN: ##alien-unsigned-1 < ##alien-getter ;
INSN: ##alien-unsigned-4 < ##alien-getter ;
INSN: ##alien-signed-1 < ##alien-getter ;
INSN: ##alien-signed-2 < ##alien-getter ;
-INSN: ##alien-signed-3 < ##alien-getter ;
+INSN: ##alien-signed-4 < ##alien-getter ;
INSN: ##alien-cell < ##alien-getter ;
INSN: ##alien-float < ##alien-getter ;
INSN: ##alien-double < ##alien-getter ;
{ cc/= { +lt+ +gt+ } }
} at memq? ;
-INSN: ##binary-branch { src1 vreg } { src2 vreg } cc ;
-INSN: ##binary-imm-branch { src1 vreg } { src2 integer } cc ;
+TUPLE: ##conditional-branch < insn { src1 vreg } { src2 vreg } cc ;
+
+INSN: ##compare-branch < ##conditional-branch ;
+INSN: ##compare-imm-branch { src1 vreg } { src2 integer } cc ;
-INSN: ##boolean < ##binary cc ;
-INSN: ##boolean-imm < ##binary-imm cc ;
+INSN: ##compare < ##binary cc ;
+INSN: ##compare-imm < ##binary-imm cc ;
+
+INSN: ##compare-float-branch < ##conditional-branch ;
+INSN: ##compare-float < ##binary cc ;
! Instructions used by machine IR only.
INSN: _prologue stack-frame ;
INSN: _branch label ;
-INSN: _binary-branch label { src1 vreg } { src2 vreg } cc ;
-INSN: _binary-imm-branch label { src1 vreg } { src2 integer } cc ;
+TUPLE: _conditional-branch < insn label { src1 vreg } { src2 vreg } cc ;
+
+INSN: _compare-branch < _conditional-branch ;
+INSN: _compare-imm-branch label { src1 vreg } { src2 integer } cc ;
+
+INSN: _compare-float-branch < _conditional-branch ;
! These instructions operate on machine registers and not
! virtual registers
: binary-conditional ( basic-block insn -- basic-block successor label2 src1 src2 cc )
[ conditional ] [ [ src1>> ] [ src2>> ] [ cc>> ] tri ] bi* ; inline
-M: ##binary-branch linearize-insn
- binary-conditional _binary-branch emit-branch ;
+M: ##compare-branch linearize-insn
+ binary-conditional _compare-branch emit-branch ;
-M: ##binary-imm-branch linearize-insn
- binary-conditional _binary-imm-branch emit-branch ;
+M: ##compare-imm-branch linearize-insn
+ binary-conditional _compare-imm-branch emit-branch ;
+
+M: ##compare-float-branch linearize-insn
+ binary-conditional _compare-float-branch emit-branch ;
: linearize-basic-block ( bb -- )
[ number>> _label ] [ linearize-insns ] bi ;
[ tag>> ]
} cleave ; inline
-M: ##slot generate-insn >slot< %slot ;
+M: ##slot generate-insn
+ [ >slot< ] [ temp>> register ] bi %slot ;
-M: ##slot-imm generate-insn >slot< %slot-imm ;
+M: ##slot-imm generate-insn
+ >slot< %slot-imm ;
: >set-slot<
{
[ tag>> ]
} cleave ; inline
-M: ##set-slot generate-insn >set-slot< %set-slot ;
+M: ##set-slot generate-insn
+ [ >set-slot< ] [ temp>> register ] bi %set-slot ;
-M: ##set-slot-imm generate-insn >set-slot< %set-slot-imm ;
+M: ##set-slot-imm generate-insn
+ >set-slot< %set-slot-imm ;
: dst/src ( insn -- dst src )
[ dst>> register ] [ src>> register ] bi ; inline
M: ##copy generate-insn dst/src %copy ;
M: ##copy-float generate-insn dst/src %copy-float ;
M: ##unbox-float generate-insn dst/src %unbox-float ;
-M: ##unbox-f generate-insn dst/src %unbox-f ;
-M: ##unbox-alien generate-insn dst/src %unbox-alien ;
-M: ##unbox-byte-array generate-insn dst/src %unbox-byte-array ;
M: ##unbox-any-c-ptr generate-insn dst/src %unbox-any-c-ptr ;
M: ##box-float generate-insn dst/src/temp %box-float ;
M: ##box-alien generate-insn dst/src/temp %box-alien ;
M: ##alien-unsigned-4 generate-insn dst/src %alien-unsigned-4 ;
M: ##alien-signed-1 generate-insn dst/src %alien-signed-1 ;
M: ##alien-signed-2 generate-insn dst/src %alien-signed-2 ;
-M: ##alien-signed-3 generate-insn dst/src %alien-signed-3 ;
+M: ##alien-signed-4 generate-insn dst/src %alien-signed-4 ;
M: ##alien-cell generate-insn dst/src %alien-cell ;
M: ##alien-float generate-insn dst/src %alien-float ;
M: ##alien-double generate-insn dst/src %alien-double ;
M: _branch generate-insn
label>> lookup-label %jump-label ;
-: >binary-branch< ( insn -- label src1 src2 cc )
+: >binary-branch< ( insn -- label cc src1 src2 )
{
[ label>> lookup-label ]
+ [ cc>> ]
[ src1>> register ]
[ src2>> dup vreg? [ register ] when ]
- [ cc>> ]
} cleave ;
-M: _binary-branch generate-insn
- >binary-branch< %binary-branch ;
+M: _compare-branch generate-insn
+ >binary-branch< %compare-branch ;
+
+M: _compare-imm-branch generate-insn
+ >binary-branch< %compare-imm-branch ;
-M: _binary-imm-branch generate-insn
- >binary-branch< %binary-imm-branch ;
+M: _compare-float-branch generate-insn
+ >binary-branch< %compare-float-branch ;
M: _spill generate-insn
[ src>> ] [ n>> ] [ class>> ] tri {
HOOK: %dispatch cpu ( src temp -- )
HOOK: %dispatch-label cpu ( word -- )
-HOOK: %slot cpu ( dst obj slot tag -- )
+HOOK: %slot cpu ( dst obj slot tag temp -- )
HOOK: %slot-imm cpu ( dst obj slot tag -- )
-HOOK: %set-slot cpu ( src obj slot tag -- )
+HOOK: %set-slot cpu ( src obj slot tag temp -- )
HOOK: %set-slot-imm cpu ( src obj slot tag -- )
HOOK: %add cpu ( dst src1 src2 -- )
HOOK: %sar-imm cpu ( dst src1 src2 -- )
HOOK: %not cpu ( dst src -- )
-HOOK: %integer>bignum cpu ( dst src -- )
-HOOK: %bignum>integer cpu ( dst src -- )
+HOOK: %integer>bignum cpu ( dst src temp -- )
+HOOK: %bignum>integer cpu ( dst src temp -- )
-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 -- )
+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 -- )
-HOOK: %integer>float cpu ( dst src -- )
-HOOK: %float>integer cpu ( dst src -- )
+HOOK: %integer>float cpu ( dst src -- )
+HOOK: %float>integer cpu ( dst src -- )
HOOK: %copy cpu ( dst src -- )
HOOK: %copy-float cpu ( dst src -- )
HOOK: %unbox-float cpu ( dst src -- )
-HOOK: %unbox-f cpu ( dst src -- )
-HOOK: %unbox-alien cpu ( dst src -- )
-HOOK: %unbox-byte-array cpu ( dst src -- )
-HOOK: %unbox-any-c-ptr cpu ( dst src -- )
+HOOK: %unbox-any-c-ptr cpu ( dst src temp -- )
HOOK: %box-float cpu ( dst src temp -- )
HOOK: %box-alien cpu ( dst src temp -- )
HOOK: %alien-unsigned-4 cpu ( dst src -- )
HOOK: %alien-signed-1 cpu ( dst src -- )
HOOK: %alien-signed-2 cpu ( dst src -- )
-HOOK: %alien-signed-3 cpu ( dst src -- )
+HOOK: %alien-signed-4 cpu ( dst src -- )
HOOK: %alien-cell cpu ( dst src -- )
HOOK: %alien-float cpu ( dst src -- )
HOOK: %alien-double cpu ( dst src -- )
-HOOK: %set-alien-integer-1 cpu ( src value -- )
-HOOK: %set-alien-integer-2 cpu ( src value -- )
-HOOK: %set-alien-integer-4 cpu ( src value -- )
-HOOK: %set-alien-cell cpu ( src value -- )
-HOOK: %set-alien-float cpu ( src value -- )
-HOOK: %set-alien-double cpu ( src value -- )
+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 -- )
HOOK: %allot cpu ( dst size type tag temp -- )
HOOK: %write-barrier cpu ( src card# table -- )
HOOK: %prologue cpu ( n -- )
HOOK: %epilogue cpu ( n -- )
-HOOK: %binary-branch cpu ( label src1 src2 label cc -- )
-HOOK: %binary-imm-branch cpu ( label src1 src2 label cc -- )
+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 -- )
HOOK: %spill-integer cpu ( src n -- )
HOOK: %spill-float cpu ( src n -- )