compiling a prologue and epilogue on PowerPC

cvs
Slava Pestov 2005-03-15 23:18:33 +00:00
parent 15c55fcc17
commit 70d534d587
4 changed files with 37 additions and 2 deletions

View File

@ -31,6 +31,12 @@ SYMBOL: #target ( part of jump table )
SYMBOL: #target-label SYMBOL: #target-label
SYMBOL: #end-dispatch SYMBOL: #end-dispatch
! on PowerPC, compiled definitions that make subroutine calls
! must have a prologue and epilogue to set up and tear down the
! link register.
SYMBOL: #prologue
SYMBOL: #epilogue
: linear, ( node -- ) : linear, ( node -- )
#! Add a node to the linear IR. #! Add a node to the linear IR.
[ node-op get node-param get ] bind cons , ; [ node-op get node-param get ] bind cons , ;
@ -50,7 +56,7 @@ SYMBOL: #end-dispatch
#! jumps and labels, and turns dataflow IR nodes into #! jumps and labels, and turns dataflow IR nodes into
#! lists where the first element is an operation, and the #! lists where the first element is an operation, and the
#! rest is arguments. #! rest is arguments.
[ (linearize) ] make-list ; [ [ #prologue ] , (linearize) ] make-list ;
: immediate? ( obj -- ? ) : immediate? ( obj -- ? )
#! fixnums and f have a pointerless representation, and #! fixnums and f have a pointerless representation, and
@ -83,6 +89,8 @@ SYMBOL: #end-dispatch
linearize-simple-label linearize-simple-label
] "linearizer" set-word-prop ] "linearizer" set-word-prop
: return, [ #epilogue ] , [ #return ] , ;
: linearize-label ( node -- ) : linearize-label ( node -- )
#! Labels are tricky, because they might contain non-tail #! Labels are tricky, because they might contain non-tail
#! calls. So we push the address of the location right after #! calls. So we push the address of the location right after
@ -92,7 +100,7 @@ SYMBOL: #end-dispatch
#! not contain non-tail recursive calls to itself. #! not contain non-tail recursive calls to itself.
<label> dup #return-to swons , >r <label> dup #return-to swons , >r
linearize-simple-label linearize-simple-label
[ #return ] , return,
r> label, ; r> label, ;
#label [ #label [
@ -136,3 +144,5 @@ SYMBOL: #end-dispatch
] "linearizer" set-word-prop ] "linearizer" set-word-prop
#values [ drop ] "linearizer" set-word-prop #values [ drop ] "linearizer" set-word-prop
#return [ drop return, ] "linearizer" set-word-prop

View File

@ -3,4 +3,23 @@
IN: compiler IN: compiler
USING: assembler inference kernel words ; USING: assembler inference kernel words ;
! At the start of each word that calls a subroutine, we store
! the link register in r0, then push r0 on the C stack.
#prologue [
drop
0 MFLR
0 1 -4 STWU
] "generator" set-word-prop
! At the end of each word that calls a subroutine, we store
! the previous link register value in r0 by popping it off the
! stack, set the link register to the contents of r0, and jump
! to the link register.
#epilogue [
drop
0 1 0 LWZ
1 1 4 ADDI
0 MTLR
] "generator" set-word-prop
#return [ drop BLR ] "generator" set-word-prop #return [ drop BLR ] "generator" set-word-prop

View File

@ -92,6 +92,8 @@ SYMBOL: simplifying
car cdr find-label cdr car cdr find-label cdr
] "next-logical" set-word-prop ] "next-logical" set-word-prop
#epilogue [ cdr ] "next-logical" set-word-prop
: next-logical? ( op linear -- ? ) : next-logical? ( op linear -- ? )
next-logical dup [ car car = ] [ 2drop f ] ifte ; next-logical dup [ car car = ] [ 2drop f ] ifte ;

View File

@ -4,6 +4,10 @@ IN: compiler
USING: alien assembler inference kernel kernel-internals lists USING: alien assembler inference kernel kernel-internals lists
math memory namespaces words ; math memory namespaces words ;
! Not used on x86
#prologue [ drop ] "generator" set-word-prop
#epilogue [ drop ] "generator" set-word-prop
\ slot [ \ slot [
PEEK-DS PEEK-DS
2unlist type-tag >r cell * r> - EAX swap 2list EAX swap MOV 2unlist type-tag >r cell * r> - EAX swap 2list EAX swap MOV