]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/x86/64/64.factor
f098b6339ca420d39344056d8133f940db7f6bbe
[factor.git] / basis / cpu / x86 / 64 / 64.factor
1 ! Copyright (C) 2005, 2011 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types assocs combinators compiler.cfg.intrinsics
4 compiler.codegen.gc-maps compiler.codegen.labels
5 compiler.codegen.relocation compiler.constants cpu.architecture
6 cpu.x86 cpu.x86.assembler cpu.x86.assembler.operands cpu.x86.features
7 kernel locals math sequences specialized-arrays system vocabs ;
8 SPECIALIZED-ARRAY: uint
9 IN: cpu.x86.64
10
11 : param-reg ( n -- reg ) int-regs cdecl param-regs at nth ;
12
13 : param-reg-0 ( -- reg ) 0 param-reg ; inline
14 : param-reg-1 ( -- reg ) 1 param-reg ; inline
15 : param-reg-2 ( -- reg ) 2 param-reg ; inline
16 : param-reg-3 ( -- reg ) 3 param-reg ; inline
17
18 M: x86.64 pic-tail-reg RBX ;
19
20 M: x86.64 return-regs
21     {
22         { int-regs { RAX RDX } }
23         { float-regs { XMM0 XMM1 } }
24     } ;
25
26 M: x86.64 ds-reg R14 ;
27 M: x86.64 rs-reg R15 ;
28 M: x86.64 stack-reg RSP ;
29 M: x86.64 frame-reg RBP ;
30
31 M: x86.64 machine-registers
32     {
33         { int-regs { RAX RBX RCX RDX RBP RSI RDI R8 R9 R10 R11 R12 } }
34         { float-regs {
35             XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
36             XMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15
37         } }
38     } ;
39
40 : vm-reg ( -- reg ) R13 ; inline
41 : nv-reg ( -- reg ) RBX ; inline
42
43 M: x86.64 %vm-field ( dst offset -- )
44     [ vm-reg ] dip [+] MOV ;
45
46 M:: x86.64 %load-vector ( dst val rep -- )
47     dst 0 [RIP+] rep copy-memory* val rc-relative rel-binary-literal ;
48
49 M: x86.64 %set-vm-field ( src offset -- )
50     [ vm-reg ] dip [+] swap MOV ;
51
52 M: x86.64 %vm-field-ptr ( dst offset -- )
53     [ vm-reg ] dip [+] LEA ;
54
55 M: x86.64 %prepare-jump
56     pic-tail-reg xt-tail-pic-offset [RIP+] LEA ;
57
58 : load-cards-offset ( dst -- )
59     0 MOV rc-absolute-cell rel-cards-offset ;
60
61 M: x86.64 %mark-card
62     dup load-cards-offset
63     [+] card-mark <byte> MOV ;
64
65 : load-decks-offset ( dst -- )
66     0 MOV rc-absolute-cell rel-decks-offset ;
67
68 M: x86.64 %mark-deck
69     dup load-decks-offset
70     [+] card-mark <byte> MOV ;
71
72 M:: x86.64 %load-stack-param ( vreg rep n -- )
73     rep return-reg n next-stack@ rep %copy
74     vreg rep return-reg rep %copy ;
75
76 M:: x86.64 %store-stack-param ( vreg rep n -- )
77     rep return-reg vreg rep %copy
78     n reserved-stack-space + stack@ rep return-reg rep %copy ;
79
80 M:: x86.64 %load-reg-param ( vreg rep reg -- )
81     vreg reg rep %copy ;
82
83 M:: x86.64 %store-reg-param ( vreg rep reg -- )
84     reg vreg rep %copy ;
85
86 M: x86.64 %discard-reg-param ( rep reg -- )
87     2drop ;
88
89 M:: x86.64 %unbox ( dst src func rep -- )
90     param-reg-0 src tagged-rep %copy
91     param-reg-1 vm-reg MOV
92     func f f %c-invoke
93     dst rep %load-return ;
94
95 M:: x86.64 %box ( dst src func rep gc-map -- )
96     0 rep reg-class-of cdecl param-regs at nth src rep %copy
97     rep int-rep? os windows? or param-reg-1 param-reg-0 ? vm-reg MOV
98     func f gc-map %c-invoke
99     dst int-rep %load-return ;
100
101 M: x86.64 %c-invoke
102     [ R11 0 MOV rc-absolute-cell rel-dlsym R11 CALL ] dip
103     gc-map-here ;
104
105 M: x86.64 %begin-callback ( -- )
106     param-reg-0 vm-reg MOV
107     param-reg-1 0 MOV
108     "begin_callback" f f %c-invoke ;
109
110 M: x86.64 %end-callback ( -- )
111     param-reg-0 vm-reg MOV
112     "end_callback" f f %c-invoke ;
113
114 M: x86.64 stack-cleanup 3drop 0 ;
115
116 M: x86.64 %cleanup 0 assert= ;
117
118 M: x86.64 %safepoint
119     0 [RIP+] EAX MOV rc-relative rel-safepoint ;
120
121 M: x86.64 long-long-on-stack? f ;
122
123 M: x86.64 struct-return-on-stack? f ;
124
125 M: x86.64 (cpuid) ( rax rcx regs -- )
126     void { uint uint void* } cdecl [
127         RAX param-reg-0 MOV
128         RCX param-reg-1 MOV
129         RSI param-reg-2 MOV
130         CPUID
131         RSI [] EAX MOV
132         RSI 4 [+] EBX MOV
133         RSI 8 [+] ECX MOV
134         RSI 12 [+] EDX MOV
135     ] alien-assembly ;
136
137 {
138     { [ os unix? ] [ "cpu.x86.64.unix" require ] }
139     { [ os windows? ] [ "cpu.x86.64.windows" require ] }
140 } cond