]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/cpu/x86/64/unix/unix.factor
FFI rewrite part 5: return value boxing and callback parameter boxing now uses vregs...
[factor.git] / basis / cpu / x86 / 64 / unix / unix.factor
index c7b8d4017a1e3b76b56dfb1684f6646a9566cc95..4d75e55479daee0cec9f58f99d470edfe08911b6 100644 (file)
@@ -3,14 +3,18 @@
 USING: accessors arrays sequences math splitting make assocs
 kernel layouts system alien.c-types classes.struct
 cpu.architecture cpu.x86.assembler cpu.x86.assembler.operands
-cpu.x86 compiler.cfg.builder.alien compiler.cfg.registers ;
+cpu.x86 cpu.x86.64 compiler.cfg.builder.alien
+compiler.cfg.builder.alien.boxing compiler.cfg.registers ;
 IN: cpu.x86.64.unix
 
 M: int-regs param-regs
     2drop { RDI RSI RDX RCX R8 R9 } ;
 
-M: float-regs param-regs
-    2drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ;
+M: x86.64 param-regs
+    drop {
+        { int-regs { RDI RSI RDX RCX R8 R9 } }
+        { float-regs { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } }
+    } ;
 
 M: x86.64 reserved-stack-space 0 ;
 
@@ -31,13 +35,9 @@ M: x86.64 reserved-stack-space 0 ;
         f 2array
     ] map ;
 
-: flatten-large-struct ( c-type -- seq )
-    stack-size cell /i { int-rep t } <repetition> ;
-
 M: x86.64 flatten-struct-type ( c-type -- seq )
-    dup heap-size 16 >
-    [ flatten-large-struct ]
-    [ flatten-small-struct ] if ;
+    dup heap-size 16 <=
+    [ flatten-small-struct ] [ call-next-method [ first t 2array ] map ] if ;
 
 M: x86.64 return-struct-in-registers? ( c-type -- ? )
     heap-size 2 cells <= ;