]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/x86/64/unix/unix.factor
c7b8d4017a1e3b76b56dfb1684f6646a9566cc95
[factor.git] / basis / cpu / x86 / 64 / unix / unix.factor
1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays sequences math splitting make assocs
4 kernel layouts system alien.c-types classes.struct
5 cpu.architecture cpu.x86.assembler cpu.x86.assembler.operands
6 cpu.x86 compiler.cfg.builder.alien compiler.cfg.registers ;
7 IN: cpu.x86.64.unix
8
9 M: int-regs param-regs
10     2drop { RDI RSI RDX RCX R8 R9 } ;
11
12 M: float-regs param-regs
13     2drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ;
14
15 M: x86.64 reserved-stack-space 0 ;
16
17 : struct-types&offset ( struct-type -- pairs )
18     fields>> [
19         [ type>> ] [ offset>> ] bi 2array
20     ] map ;
21
22 : split-struct ( pairs -- seq )
23     [
24         [ 8 mod zero? [ t , ] when , ] assoc-each
25     ] { } make { t } split harvest ;
26
27 : flatten-small-struct ( c-type -- seq )
28     struct-types&offset split-struct [
29         [ c-type c-type-rep reg-class-of ] map
30         int-regs swap member? int-rep double-rep ?
31         f 2array
32     ] map ;
33
34 : flatten-large-struct ( c-type -- seq )
35     stack-size cell /i { int-rep t } <repetition> ;
36
37 M: x86.64 flatten-struct-type ( c-type -- seq )
38     dup heap-size 16 >
39     [ flatten-large-struct ]
40     [ flatten-small-struct ] if ;
41
42 M: x86.64 return-struct-in-registers? ( c-type -- ? )
43     heap-size 2 cells <= ;
44
45 M: x86.64 dummy-stack-params? f ;
46
47 M: x86.64 dummy-int-params? f ;
48
49 M: x86.64 dummy-fp-params? f ;
50
51 M: x86.64 temp-reg R8 ;