]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/architecture/architecture.factor
Merge branch 'master' into experimental (untested!)
[factor.git] / basis / cpu / architecture / architecture.factor
1 ! Copyright (C) 2006, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays generic kernel kernel.private math
4 memory namespaces make sequences layouts system hashtables
5 classes alien byte-arrays combinators words sets fry ;
6 IN: cpu.architecture
7
8 ! Labels
9 TUPLE: label offset ;
10
11 : <label> ( -- label ) label new ;
12 : define-label ( name -- ) <label> swap set ;
13 : resolve-label ( label/name -- ) dup label? [ get ] unless , ;
14
15 ! Register classes
16 SINGLETON: int-regs
17 SINGLETON: single-float-regs
18 SINGLETON: double-float-regs
19 UNION: float-regs single-float-regs double-float-regs ;
20 UNION: reg-class int-regs float-regs ;
21
22 ! Mapping from register class to machine registers
23 HOOK: machine-registers cpu ( -- assoc )
24
25 ! A pseudo-register class for parameters spilled on the stack
26 SINGLETON: stack-params
27
28 ! Return values of this class go here
29 GENERIC: return-reg ( register-class -- reg )
30
31 ! Sequence of registers used for parameter passing in class
32 GENERIC: param-regs ( register-class -- regs )
33
34 GENERIC: param-reg ( n register-class -- reg )
35
36 M: object param-reg param-regs nth ;
37
38 HOOK: two-operand? cpu ( -- ? )
39
40 HOOK: %load-immediate cpu ( reg obj -- )
41 HOOK: %load-indirect cpu ( reg obj -- )
42
43 HOOK: %peek cpu ( vreg loc -- )
44 HOOK: %replace cpu ( vreg loc -- )
45 HOOK: %inc-d cpu ( n -- )
46 HOOK: %inc-r cpu ( n -- )
47
48 HOOK: stack-frame-size cpu ( stack-frame -- n )
49 HOOK: %call cpu ( word -- )
50 HOOK: %jump-label cpu ( label -- )
51 HOOK: %return cpu ( -- )
52
53 HOOK: %dispatch cpu ( src temp offset -- )
54 HOOK: %dispatch-label cpu ( word -- )
55
56 HOOK: %slot cpu ( dst obj slot tag temp -- )
57 HOOK: %slot-imm cpu ( dst obj slot tag -- )
58 HOOK: %set-slot cpu ( src obj slot tag temp -- )
59 HOOK: %set-slot-imm cpu ( src obj slot tag -- )
60
61 HOOK: %string-nth cpu ( dst obj index temp -- )
62 HOOK: %set-string-nth-fast cpu ( ch obj index temp -- )
63
64 HOOK: %add     cpu ( dst src1 src2 -- )
65 HOOK: %add-imm cpu ( dst src1 src2 -- )
66 HOOK: %sub     cpu ( dst src1 src2 -- )
67 HOOK: %sub-imm cpu ( dst src1 src2 -- )
68 HOOK: %mul     cpu ( dst src1 src2 -- )
69 HOOK: %mul-imm cpu ( dst src1 src2 -- )
70 HOOK: %and     cpu ( dst src1 src2 -- )
71 HOOK: %and-imm cpu ( dst src1 src2 -- )
72 HOOK: %or      cpu ( dst src1 src2 -- )
73 HOOK: %or-imm  cpu ( dst src1 src2 -- )
74 HOOK: %xor     cpu ( dst src1 src2 -- )
75 HOOK: %xor-imm cpu ( dst src1 src2 -- )
76 HOOK: %shl-imm cpu ( dst src1 src2 -- )
77 HOOK: %shr-imm cpu ( dst src1 src2 -- )
78 HOOK: %sar-imm cpu ( dst src1 src2 -- )
79 HOOK: %not     cpu ( dst src -- )
80 HOOK: %log2    cpu ( dst src -- )
81
82 HOOK: %fixnum-add cpu ( src1 src2 -- )
83 HOOK: %fixnum-add-tail cpu ( src1 src2 -- )
84 HOOK: %fixnum-sub cpu ( src1 src2 -- )
85 HOOK: %fixnum-sub-tail cpu ( src1 src2 -- )
86 HOOK: %fixnum-mul cpu ( src1 src2 temp1 temp2 -- )
87 HOOK: %fixnum-mul-tail cpu ( src1 src2 temp1 temp2 -- )
88
89 HOOK: %integer>bignum cpu ( dst src temp -- )
90 HOOK: %bignum>integer cpu ( dst src temp -- )
91
92 HOOK: %add-float cpu ( dst src1 src2 -- )
93 HOOK: %sub-float cpu ( dst src1 src2 -- )
94 HOOK: %mul-float cpu ( dst src1 src2 -- )
95 HOOK: %div-float cpu ( dst src1 src2 -- )
96
97 HOOK: %integer>float cpu ( dst src -- )
98 HOOK: %float>integer cpu ( dst src -- )
99
100 HOOK: %copy cpu ( dst src -- )
101 HOOK: %copy-float cpu ( dst src -- )
102 HOOK: %unbox-float cpu ( dst src -- )
103 HOOK: %unbox-any-c-ptr cpu ( dst src temp -- )
104 HOOK: %box-float cpu ( dst src temp -- )
105 HOOK: %box-alien cpu ( dst src temp -- )
106
107 HOOK: %alien-unsigned-1 cpu ( dst src -- )
108 HOOK: %alien-unsigned-2 cpu ( dst src -- )
109 HOOK: %alien-unsigned-4 cpu ( dst src -- )
110 HOOK: %alien-signed-1   cpu ( dst src -- )
111 HOOK: %alien-signed-2   cpu ( dst src -- )
112 HOOK: %alien-signed-4   cpu ( dst src -- )
113 HOOK: %alien-cell       cpu ( dst src -- )
114 HOOK: %alien-float      cpu ( dst src -- )
115 HOOK: %alien-double     cpu ( dst src -- )
116
117 HOOK: %set-alien-integer-1 cpu ( ptr value -- )
118 HOOK: %set-alien-integer-2 cpu ( ptr value -- )
119 HOOK: %set-alien-integer-4 cpu ( ptr value -- )
120 HOOK: %set-alien-cell      cpu ( ptr value -- )
121 HOOK: %set-alien-float     cpu ( ptr value -- )
122 HOOK: %set-alien-double    cpu ( ptr value -- )
123
124 HOOK: %alien-global cpu ( dst symbol library -- )
125
126 HOOK: %allot cpu ( dst size class temp -- )
127 HOOK: %write-barrier cpu ( src card# table -- )
128 HOOK: %gc cpu ( -- )
129
130 HOOK: %prologue cpu ( n -- )
131 HOOK: %epilogue cpu ( n -- )
132
133 HOOK: %compare cpu ( dst temp cc src1 src2 -- )
134 HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- )
135 HOOK: %compare-float cpu ( dst temp cc src1 src2 -- )
136
137 HOOK: %compare-branch cpu ( label cc src1 src2 -- )
138 HOOK: %compare-imm-branch cpu ( label cc src1 src2 -- )
139 HOOK: %compare-float-branch cpu ( label cc src1 src2 -- )
140
141 HOOK: %spill-integer cpu ( src n -- )
142 HOOK: %spill-float cpu ( src n -- )
143 HOOK: %reload-integer cpu ( dst n -- )
144 HOOK: %reload-float cpu ( dst n -- )
145
146 HOOK: %loop-entry cpu ( -- )
147
148 ! FFI stuff
149
150 ! Is this integer small enough to appear in value template
151 ! slots?
152 HOOK: small-enough? cpu ( n -- ? )
153
154 ! Is this structure small enough to be returned in registers?
155 HOOK: struct-small-enough? cpu ( c-type -- ? )
156
157 ! Do we pass this struct by value or hidden reference?
158 HOOK: value-struct? cpu ( c-type -- ? )
159
160 ! If t, all parameters are shadowed by dummy stack parameters
161 HOOK: dummy-stack-params? cpu ( -- ? )
162
163 ! If t, all FP parameters are shadowed by dummy int parameters
164 HOOK: dummy-int-params? cpu ( -- ? )
165
166 ! If t, all int parameters are shadowed by dummy FP parameters
167 HOOK: dummy-fp-params? cpu ( -- ? )
168
169 HOOK: %prepare-unbox cpu ( -- )
170
171 HOOK: %unbox cpu ( n reg-class func -- )
172
173 HOOK: %unbox-long-long cpu ( n func -- )
174
175 HOOK: %unbox-small-struct cpu ( c-type -- )
176
177 HOOK: %unbox-large-struct cpu ( n c-type -- )
178
179 HOOK: %box cpu ( n reg-class func -- )
180
181 HOOK: %box-long-long cpu ( n func -- )
182
183 HOOK: %prepare-box-struct cpu ( -- )
184
185 HOOK: %box-small-struct cpu ( c-type -- )
186
187 HOOK: %box-large-struct cpu ( n c-type -- )
188
189 GENERIC: %save-param-reg ( stack reg reg-class -- )
190
191 GENERIC: %load-param-reg ( stack reg reg-class -- )
192
193 HOOK: %prepare-alien-invoke cpu ( -- )
194
195 HOOK: %prepare-var-args cpu ( -- )
196
197 M: object %prepare-var-args ;
198
199 HOOK: %alien-invoke cpu ( function library -- )
200
201 HOOK: %cleanup cpu ( params -- )
202
203 M: object %cleanup ( params -- ) drop ;
204
205 HOOK: %prepare-alien-indirect cpu ( -- )
206
207 HOOK: %alien-indirect cpu ( -- )
208
209 HOOK: %alien-callback cpu ( quot -- )
210
211 HOOK: %callback-value cpu ( ctype -- )
212
213 ! Return to caller with stdcall unwinding (only for x86)
214 HOOK: %callback-return cpu ( params -- )
215
216 M: object %callback-return drop %return ;
217
218 M: stack-params param-reg drop ;
219
220 M: stack-params param-regs drop f ;