]> gitweb.factorcode.org Git - factor.git/commitdiff
cpu.x86: fix %load/store-stack-param for 32-bit
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 14 Jul 2010 21:47:21 +0000 (17:47 -0400)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 14 Jul 2010 21:50:40 +0000 (17:50 -0400)
basis/cpu/x86/32/32.factor
basis/cpu/x86/64/64.factor
basis/cpu/x86/x86.factor

index 5de875fb72385b9a69c615dfffe5a267c2874ff9..379c9c697f85f0ab124a34fcbcf62f7b566dcd91 100755 (executable)
@@ -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
index 2dc5fb4e37b9154bcb708523dd642561f398dd81..4cd081d32478a78a6ad4b3dcadcf94929963c2ca 100644 (file)
@@ -81,6 +81,14 @@ M: x86.64 %mark-deck
     dup load-decks-offset
     [+] card-mark <byte> 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 ;
 
index 722ad0d0f0d0b7717d87efed0f68420765a61f0c..c5fce25df037f52917eb9e4beef6ba0083215f8c 100644 (file)
@@ -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 -- )