]> gitweb.factorcode.org Git - factor.git/commitdiff
make inline_gc regparm(3) and cleaned up %call-gc stack alignment
authorPhil Dawes <phil@phildawes.net>
Thu, 24 Sep 2009 20:45:56 +0000 (21:45 +0100)
committerPhil Dawes <phil@phildawes.net>
Thu, 24 Sep 2009 20:45:56 +0000 (21:45 +0100)
basis/cpu/x86/32/32.factor
basis/cpu/x86/64/64.factor
basis/cpu/x86/x86.factor
vm/data_gc.cpp
vm/data_gc.hpp

index 7a7d1befd92ff42fe6116a6775622e1770e13445..34d508fcf2677635e3451941ee0a5d044a94acdf 100755 (executable)
@@ -40,6 +40,7 @@ M:: x86.32 %dispatch ( src temp -- )
 ! Registers for fastcall
 M: x86.32 param-reg-1 EAX ;
 M: x86.32 param-reg-2 EDX ;
+M: x86.32 param-reg-3 ECX ;
 
 M: x86.32 pic-tail-reg EBX ;
 
index c33368fc91cb38d4ab7838f61af0bebb0843ade2..8363f7a18b1e2a2e028d9bafd66b39f487199004 100644 (file)
@@ -38,7 +38,7 @@ M:: x86.64 %dispatch ( src temp -- )
 
 M: x86.64 param-reg-1 int-regs param-regs first ;
 M: x86.64 param-reg-2 int-regs param-regs second ;
-: param-reg-3 ( -- reg ) int-regs param-regs third ; inline
+M: x86.64 param-reg-3 int-regs param-regs third ;
 
 M: x86.64 pic-tail-reg RBX ;
 
index 8585dfa697cea2d67c4447800838fb2f5faea915..25dca527f600732b756b2bcbade9dd8b58ba7bf7 100644 (file)
@@ -55,6 +55,7 @@ HOOK: temp-reg cpu ( -- reg )
 ! Fastcall calling convention
 HOOK: param-reg-1 cpu ( -- reg )
 HOOK: param-reg-2 cpu ( -- reg )
+HOOK: param-reg-3 cpu ( -- reg )
 
 HOOK: pic-tail-reg cpu ( -- reg )
 
@@ -832,8 +833,10 @@ M:: x86 %call-gc ( gc-root-count -- )
     param-reg-1 gc-root-base param@ LEA
     ! Pass number of roots as second parameter
     param-reg-2 gc-root-count MOV
+    ! Pass vm as third argument
+    param-reg-3 0 MOV rc-absolute-cell rt-vm rel-fixup
     ! Call GC
-    "inline_gc" %vm-invoke-3rd-arg ; 
+    "inline_gc" f %alien-invoke ; 
 
 M: x86 %alien-global ( dst symbol library -- )
     [ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;    
index 8766cc8c7c60a744d0ad69c8efc3763c55350eaf..590000611a5907cb76d5ec16d805a7544bd4dd4d 100755 (executable)
@@ -681,7 +681,7 @@ void factor_vm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
                gc_locals.pop_back();
 }
 
-VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factor_vm *myvm)
+VM_ASM_API_OVERFLOW void inline_gc(cell *gc_roots_base, cell gc_roots_size, factor_vm *myvm)
 {
        ASSERTVM();
        VM_PTR->inline_gc(gc_roots_base,gc_roots_size);
index 411c4d19fe2383a82319b756a4fe3114b9c4267f..4ef89c23272f8e4bcd6f0ba338ea481b88c52352 100755 (executable)
@@ -20,6 +20,6 @@ PRIMITIVE(gc_stats);
 PRIMITIVE(clear_gc_stats);
 PRIMITIVE(become);
 struct factor_vm;
-VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factor_vm *myvm);
+VM_ASM_API_OVERFLOW void inline_gc(cell *gc_roots_base, cell gc_roots_size, factor_vm *myvm);
 
 }