diff --git a/core/cpu/x86/architecture/architecture.factor b/core/cpu/x86/architecture/architecture.factor index f3217af670..328f96b5a9 100644 --- a/core/cpu/x86/architecture/architecture.factor +++ b/core/cpu/x86/architecture/architecture.factor @@ -47,14 +47,16 @@ M: x86-backend stack-frame ( n -- i ) M: x86-backend %save-xt ( -- ) xt-reg compiling-label get MOV ; +: factor-area-size 4 cells ; + M: x86-backend %prologue ( n -- ) xt-reg PUSH - xt-reg stack-reg pick stack-frame 4 cells + neg [+] LEA + xt-reg stack-reg pick factor-area-size + neg [+] LEA xt-reg PUSH - stack-reg swap stack-frame 2 cells - SUB ; + stack-reg swap 2 cells - SUB ; M: x86-backend %epilogue ( n -- ) - stack-reg swap stack-frame ADD ; + stack-reg swap ADD ; : %alien-global ( symbol dll register -- ) [ 0 MOV rc-absolute-cell rel-dlsym ] keep dup [] MOV ; diff --git a/core/generator/fixup/fixup.factor b/core/generator/fixup/fixup.factor index a339f950b4..b45f463bbe 100644 --- a/core/generator/fixup/fixup.factor +++ b/core/generator/fixup/fixup.factor @@ -35,7 +35,8 @@ M: label fixup* : resolve-label ( label/name -- ) dup label? [ get ] unless , ; : if-stack-frame ( frame-size quot -- ) - over no-stack-frame = [ 2drop ] [ call ] if ; inline + swap dup no-stack-frame = + [ 2drop ] [ stack-frame swap call ] if ; inline M: word fixup* {