]> gitweb.factorcode.org Git - factor.git/commitdiff
Fix some problems in the x86 backend
authorslava <slava@factorcode.org>
Sat, 29 Apr 2006 22:33:05 +0000 (22:33 +0000)
committerslava <slava@factorcode.org>
Sat, 29 Apr 2006 22:33:05 +0000 (22:33 +0000)
library/compiler/generator/architecture.factor
library/compiler/x86/alien.factor
library/compiler/x86/architecture.factor

index 0d154b8523aed80576d2cafc216a68e3b82f475c..c1224d442f9540d1017a440897ba8250a6c29870 100644 (file)
@@ -25,10 +25,10 @@ DEFER: vregs ( -- regs )
 G: load-literal ( obj vreg -- ) 1 standard-combination ;
 
 ! Set up caller stack frame (PowerPC and AMD64)
-: %prologue ( n -- ) drop ;
+: %prologue ( n -- ) drop ; inline
 
 ! Tear down stack frame (PowerPC and AMD64)
-: %epilogue ( n -- ) drop ;
+: %epilogue ( -- ) ; inline
 
 ! Tail call another word
 DEFER: %jump ( label -- )
index 1f8204c87fc757b0657e0c3dbb1c8a54191d9e90..8a809b80ea5fbb2123227e247271642e4adfb238 100644 (file)
@@ -63,7 +63,7 @@ M: float-regs load-return-reg
     drop-return-reg ;
 
 : %alien-callback ( quot -- )
-    EAX swap load-literal
+    T{ vreg f 0 } load-literal
     EAX PUSH
     "run_callback" f %alien-invoke
     EAX POP ;
@@ -76,6 +76,6 @@ M: float-regs load-return-reg
     ! Restore data/callstacks
     "unnest_stacks" f %alien-invoke
     ! Restore return register
-    dup pop-return-reg ;
+    pop-return-reg ;
 
 : %cleanup ( n -- ) dup zero? [ drop ] [ ESP swap ADD ] if ;
index d1f39683bee4feadfb89b69c5fd93e3cc588a274..e5bafe7fc2972d7bed645e084c09f76c226beaaa 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2005, 2006 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: compiler
 USING: alien arrays assembler generic kernel kernel-internals
 math memory namespaces sequences words ;
+IN: compiler
 
 ! x86 register assignments
 ! EAX, ECX, EDX vregs
@@ -44,9 +44,11 @@ M: float-regs fastcall-regs drop { } ;
 
 : prepare-division CDQ ; inline
 
-M: immediate load-literal ( dest literal -- ) address MOV ;
+M: immediate load-literal ( literal vreg -- )
+    v>operand swap address MOV ;
 
-M: object load-literal ( dest literal -- )
+M: object load-literal ( literal vreg -- )
+    v>operand swap
     add-literal [] MOV rel-absolute-cell rel-address ;
 
 : (%call) ( label -- label )
@@ -70,8 +72,8 @@ M: object load-literal ( dest literal -- )
     ! Add to jump table base. We use a temporary register since
     ! on AMD4 we have to load a 64-bit immediate. On x86, this
     ! is redundant.
-    "scratch" get HEX: ffffffff MOV "end" get absolute-cell
-    "n" operand "scratch" get ADD
+    "scratch" operand HEX: ffffffff MOV "end" get absolute-cell
+    "n" operand "scratch" operand ADD
     ! Jump to jump table entry
     "n" operand [] JMP
     ! Align for better performance
@@ -85,7 +87,7 @@ M: object load-literal ( dest literal -- )
 
 : %replace ( vreg loc -- ) swap %peek ;
 
-: (%inc) cells dup 0 > [ ADD ] [ neg SUB ] if ;
+: (%inc) swap cells dup 0 > [ ADD ] [ neg SUB ] if ;
 
 : %inc-d ( n -- ) ds-reg (%inc) ;