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 codedb4
parent
35d81c742d
commit
e41aef9a50
|
@ -61,10 +61,13 @@ HELP: (%slot)
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
HELP: decr-stack-reg
|
HELP: decr-stack-reg
|
||||||
{ $values { "n" number } }
|
{ $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
|
HELP: load-zone-offset
|
||||||
{ $values { "nursery-ptr" "a register symbol" } }
|
{ $values { "nursery-ptr" "a register symbol" } }
|
||||||
|
@ -106,3 +109,11 @@ HELP: copy-register*
|
||||||
"0000000533c61fe0: 0f28ca movaps xmm1, xmm2"
|
"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"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
USING: compiler.cfg.debugger compiler.cfg.instructions
|
USING: compiler.cfg.debugger compiler.cfg.instructions
|
||||||
compiler.codegen.gc-maps compiler.codegen.relocation compiler.cfg.registers
|
compiler.cfg.registers compiler.codegen.gc-maps
|
||||||
cpu.architecture cpu.x86.features kernel kernel.private make math math.libm
|
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 ;
|
namespaces sequences system tools.test ;
|
||||||
IN: cpu.x86.tests
|
IN: cpu.x86.tests
|
||||||
|
|
||||||
|
@ -37,3 +38,14 @@ IN: cpu.x86.tests
|
||||||
[ D 0 %clear ] B{ } make
|
[ D 0 %clear ] B{ } make
|
||||||
cpu x86.32? B{ 199 6 144 18 0 0 } B{ 73 199 6 144 18 0 0 } ? =
|
cpu x86.32? B{ 199 6 144 18 0 0 } B{ 73 199 6 144 18 0 0 } ? =
|
||||||
] unit-test
|
] 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
|
||||||
|
|
|
@ -30,6 +30,8 @@ HOOK: stack-reg cpu ( -- reg )
|
||||||
|
|
||||||
HOOK: reserved-stack-space cpu ( -- n )
|
HOOK: reserved-stack-space cpu ( -- n )
|
||||||
|
|
||||||
|
HOOK: pic-tail-reg cpu ( -- reg )
|
||||||
|
|
||||||
: stack@ ( n -- op ) stack-reg swap [+] ;
|
: stack@ ( n -- op ) stack-reg swap [+] ;
|
||||||
|
|
||||||
: special-offset ( m -- n )
|
: special-offset ( m -- n )
|
||||||
|
@ -37,11 +39,17 @@ HOOK: reserved-stack-space cpu ( -- n )
|
||||||
|
|
||||||
: spill@ ( n -- op ) spill-offset special-offset stack@ ;
|
: spill@ ( n -- op ) spill-offset special-offset stack@ ;
|
||||||
|
|
||||||
|
: (%inc) ( n reg -- ) swap cells dup 0 > [ ADD ] [ neg SUB ] if ; inline
|
||||||
|
|
||||||
: decr-stack-reg ( n -- )
|
: 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 -- )
|
: 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 ;
|
: align-stack ( n -- n' ) 16 align ;
|
||||||
|
|
||||||
|
@ -51,8 +59,6 @@ M: x86 stack-frame-size ( stack-frame -- i )
|
||||||
cell +
|
cell +
|
||||||
align-stack ;
|
align-stack ;
|
||||||
|
|
||||||
HOOK: pic-tail-reg cpu ( -- reg )
|
|
||||||
|
|
||||||
M: x86 complex-addressing? t ;
|
M: x86 complex-addressing? t ;
|
||||||
|
|
||||||
M: x86 fused-unboxing? t ;
|
M: x86 fused-unboxing? t ;
|
||||||
|
@ -93,8 +99,6 @@ M: x86 %replace-imm
|
||||||
M: x86 %clear ( loc -- )
|
M: x86 %clear ( loc -- )
|
||||||
297 swap %replace-imm ;
|
297 swap %replace-imm ;
|
||||||
|
|
||||||
: (%inc) ( n reg -- ) swap cells dup 0 > [ ADD ] [ neg SUB ] if ; inline
|
|
||||||
|
|
||||||
M: x86 %inc ( loc -- )
|
M: x86 %inc ( loc -- )
|
||||||
[ n>> ] [ ds-loc? ds-reg rs-reg ? ] bi (%inc) ;
|
[ n>> ] [ ds-loc? ds-reg rs-reg ? ] bi (%inc) ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue