cpu.x86: use push and pop when emitting %prologue and %epilogue

push/pop REG has the same effect as sub/add rsp, 8 so use them instead
when applicable to generate a little shorter code
db4
Björn Lindqvist 2015-07-21 23:45:25 +02:00 committed by John Benediktsson
parent 35d81c742d
commit e41aef9a50
3 changed files with 37 additions and 10 deletions

View File

@ -61,10 +61,13 @@ HELP: (%slot)
}
} ;
HELP: decr-stack-reg
{ $values { "n" number } }
{ $description "Emits an instruction for decrementing the stack register the given number of bytes." } ;
{ $description "Emits an instruction for decrementing the stack register the given number of bytes. If n is equal to the " { $link cell } " size, then a " { $link PUSH } " instruction is emitted instead because it has a shorter encoding." } ;
HELP: incr-stack-reg
{ $values { "n" number } }
{ $description "Emits an instruction for incrementing the stack register the given number of bytes. If n is equal to the " { $link cell } " size, then a " { $link POP } " instruction is emitted instead because it has a shorter encoding." } ;
HELP: load-zone-offset
{ $values { "nursery-ptr" "a register symbol" } }
@ -106,3 +109,11 @@ HELP: copy-register*
"0000000533c61fe0: 0f28ca movaps xmm1, xmm2"
}
} ;
ARTICLE: "cpu.x86" "x86 compiler backend"
"Implementation of " { $vocab-link "cpu.architecture" } " for x86 machines."
$nl
{ $link ADD } " and " { $link SUB } " variants:"
{ $subsections (%inc) decr-stack-reg incr-stack-reg } ;
ABOUT: "cpu.x86"

View File

@ -1,6 +1,7 @@
USING: compiler.cfg.debugger compiler.cfg.instructions
compiler.codegen.gc-maps compiler.codegen.relocation compiler.cfg.registers
cpu.architecture cpu.x86.features kernel kernel.private make math math.libm
compiler.cfg.registers compiler.codegen.gc-maps
compiler.codegen.relocation cpu.architecture cpu.x86 cpu.x86.assembler
cpu.x86.features kernel kernel.private layouts make math math.libm
namespaces sequences system tools.test ;
IN: cpu.x86.tests
@ -37,3 +38,14 @@ IN: cpu.x86.tests
[ D 0 %clear ] B{ } make
cpu x86.32? B{ 199 6 144 18 0 0 } B{ 73 199 6 144 18 0 0 } ? =
] unit-test
! %prologue
{ t } [
[ 2 cells %prologue ] B{ } make
[ pic-tail-reg PUSH ] B{ } make =
] unit-test
{ t } [
[ 8 cells %prologue ] B{ } make
[ stack-reg 7 cells SUB ] B{ } make =
] unit-test

View File

@ -30,6 +30,8 @@ HOOK: stack-reg cpu ( -- reg )
HOOK: reserved-stack-space cpu ( -- n )
HOOK: pic-tail-reg cpu ( -- reg )
: stack@ ( n -- op ) stack-reg swap [+] ;
: special-offset ( m -- n )
@ -37,11 +39,17 @@ HOOK: reserved-stack-space cpu ( -- n )
: spill@ ( n -- op ) spill-offset special-offset stack@ ;
: (%inc) ( n reg -- ) swap cells dup 0 > [ ADD ] [ neg SUB ] if ; inline
: decr-stack-reg ( n -- )
[ stack-reg swap SUB ] unless-zero ;
[
dup cell = [ drop pic-tail-reg PUSH ] [ stack-reg swap SUB ] if
] unless-zero ;
: incr-stack-reg ( n -- )
[ stack-reg swap ADD ] unless-zero ;
[
dup cell = [ drop pic-tail-reg POP ] [ stack-reg swap ADD ] if
] unless-zero ;
: align-stack ( n -- n' ) 16 align ;
@ -51,8 +59,6 @@ M: x86 stack-frame-size ( stack-frame -- i )
cell +
align-stack ;
HOOK: pic-tail-reg cpu ( -- reg )
M: x86 complex-addressing? t ;
M: x86 fused-unboxing? t ;
@ -93,8 +99,6 @@ M: x86 %replace-imm
M: x86 %clear ( loc -- )
297 swap %replace-imm ;
: (%inc) ( n reg -- ) swap cells dup 0 > [ ADD ] [ neg SUB ] if ; inline
M: x86 %inc ( loc -- )
[ n>> ] [ ds-loc? ds-reg rs-reg ? ] bi (%inc) ;