From 867530223c0981b5d64a413403dc80b30af9f8c2 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 14 Jul 2010 17:47:21 -0400 Subject: [PATCH] cpu.x86: fix %load/store-stack-param for 32-bit --- basis/cpu/x86/32/32.factor | 18 ++++++++++++++++-- basis/cpu/x86/64/64.factor | 8 ++++++++ basis/cpu/x86/x86.factor | 8 ++------ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/basis/cpu/x86/32/32.factor b/basis/cpu/x86/32/32.factor index 5de875fb72..379c9c697f 100755 --- a/basis/cpu/x86/32/32.factor +++ b/basis/cpu/x86/32/32.factor @@ -96,6 +96,20 @@ M: x86.32 %prologue ( n -- ) M: x86.32 %prepare-jump pic-tail-reg 0 MOV xt-tail-pic-offset rc-absolute-cell rel-here ; +M: x86.32 %load-stack-param ( dst rep n -- ) + next-stack@ swap { + { int-rep [ [ EAX ] dip MOV ?spill-slot EAX MOV ] } + { float-rep [ FLDS ?spill-slot FSTPS ] } + { double-rep [ FLDL ?spill-slot FSTPL ] } + } case ; + +M: x86.32 %store-stack-param ( src rep n -- ) + reserved-stack-space + stack@ swap { + { int-rep [ [ [ EAX ] dip ?spill-slot MOV ] [ EAX MOV ] bi* ] } + { float-rep [ [ ?spill-slot FLDS ] [ FSTPS ] bi* ] } + { double-rep [ [ ?spill-slot FLDL ] [ FSTPL ] bi* ] } + } case ; + :: load-float-return ( dst x87-insn rep -- ) dst register? [ ESP 4 SUB @@ -192,10 +206,10 @@ M:: spill-slot float-function-param ( n dst src -- ) ! We can clobber dst here since its going to contain the ! final result dst src double-rep %copy - dst n double-rep %store-stack-param ; + dst double-rep n %store-stack-param ; M:: register float-function-param ( n dst src -- ) - src n double-rep %store-stack-param ; + src double-rep n %store-stack-param ; M:: x86.32 %unary-float-function ( dst src func -- ) 0 dst src float-function-param diff --git a/basis/cpu/x86/64/64.factor b/basis/cpu/x86/64/64.factor index 2dc5fb4e37..4cd081d324 100644 --- a/basis/cpu/x86/64/64.factor +++ b/basis/cpu/x86/64/64.factor @@ -81,6 +81,14 @@ M: x86.64 %mark-deck dup load-decks-offset [+] card-mark MOV ; +M:: x86.64 %load-stack-param ( vreg rep n -- ) + rep return-reg n next-stack@ rep %copy + dst rep return-reg rep %copy ; + +M:: x86.64 %store-stack-param ( vreg rep n -- ) + rep return-reg src rep %copy + n reserved-stack-space + stack@ rep return-reg rep %copy ; + M:: x86.64 %load-reg-param ( vreg rep reg -- ) vreg reg rep %copy ; diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 722ad0d0f0..c5fce25df0 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -600,13 +600,9 @@ M:: x86 %local-allot ( dst size align offset -- ) : return-reg ( rep -- reg ) reg-class-of return-regs at first ; -:: %load-stack-param ( dst rep n -- ) - rep return-reg n next-stack@ rep %copy - dst rep return-reg rep %copy ; +HOOK: %load-stack-param cpu ( vreg rep n -- ) -:: %store-stack-param ( src rep n -- ) - rep return-reg src rep %copy - n reserved-stack-space + stack@ rep return-reg rep %copy ; +HOOK: %store-stack-param cpu ( vreg rep n -- ) HOOK: %load-reg-param cpu ( vreg rep reg -- )