]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/architecture/architecture.factor
Merge Phil Dawes' VM work
[factor.git] / basis / cpu / architecture / architecture.factor
1 ! Copyright (C) 2006, 2009 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 ! Representations -- these are like low-level types
9
10 ! Unknown representation; this is used for ##copy instructions which
11 ! get eliminated later
12 SINGLETON: any-rep
13
14 ! Integer registers can contain data with one of these three representations
15 ! tagged-rep: tagged pointer or fixnum
16 ! int-rep: untagged fixnum, not a pointer
17 SINGLETONS: tagged-rep int-rep ;
18
19 ! Floating point registers can contain data with
20 ! one of these representations
21 SINGLETONS: float-rep double-rep ;
22
23 ! On x86, floating point registers are really vector registers
24 SINGLETONS:
25 float-4-rep
26 double-2-rep
27 char-16-rep
28 uchar-16-rep
29 short-8-rep
30 ushort-8-rep
31 int-4-rep
32 uint-4-rep ;
33
34 UNION: vector-rep
35 float-4-rep
36 double-2-rep
37 char-16-rep
38 uchar-16-rep
39 short-8-rep
40 ushort-8-rep
41 int-4-rep
42 uint-4-rep ;
43
44 UNION: representation
45 any-rep
46 tagged-rep
47 int-rep
48 float-rep
49 double-rep
50 vector-rep ;
51
52 ! Register classes
53 SINGLETONS: int-regs float-regs ;
54
55 UNION: reg-class int-regs float-regs ;
56 CONSTANT: reg-classes { int-regs float-regs }
57
58 ! A pseudo-register class for parameters spilled on the stack
59 SINGLETON: stack-params
60
61 GENERIC: reg-class-of ( rep -- reg-class )
62
63 M: tagged-rep reg-class-of drop int-regs ;
64 M: int-rep reg-class-of drop int-regs ;
65 M: float-rep reg-class-of drop float-regs ;
66 M: double-rep reg-class-of drop float-regs ;
67 M: vector-rep reg-class-of drop float-regs ;
68 M: stack-params reg-class-of drop stack-params ;
69
70 GENERIC: rep-size ( rep -- n ) foldable
71
72 M: tagged-rep rep-size drop cell ;
73 M: int-rep rep-size drop cell ;
74 M: float-rep rep-size drop 4 ;
75 M: double-rep rep-size drop 8 ;
76 M: stack-params rep-size drop cell ;
77 M: vector-rep rep-size drop 16 ;
78
79 GENERIC: scalar-rep-of ( rep -- rep' )
80
81 M: float-4-rep scalar-rep-of drop float-rep ;
82 M: double-2-rep scalar-rep-of drop double-rep ;
83
84 ! Mapping from register class to machine registers
85 HOOK: machine-registers cpu ( -- assoc )
86
87 HOOK: two-operand? cpu ( -- ? )
88
89 HOOK: %load-immediate cpu ( reg obj -- )
90 HOOK: %load-reference cpu ( reg obj -- )
91
92 HOOK: %peek cpu ( vreg loc -- )
93 HOOK: %replace cpu ( vreg loc -- )
94 HOOK: %inc-d cpu ( n -- )
95 HOOK: %inc-r cpu ( n -- )
96
97 HOOK: stack-frame-size cpu ( stack-frame -- n )
98 HOOK: %call cpu ( word -- )
99 HOOK: %jump cpu ( word -- )
100 HOOK: %jump-label cpu ( label -- )
101 HOOK: %return cpu ( -- )
102
103 HOOK: %dispatch cpu ( src temp -- )
104
105 HOOK: %slot cpu ( dst obj slot tag temp -- )
106 HOOK: %slot-imm cpu ( dst obj slot tag -- )
107 HOOK: %set-slot cpu ( src obj slot tag temp -- )
108 HOOK: %set-slot-imm cpu ( src obj slot tag -- )
109
110 HOOK: %string-nth cpu ( dst obj index temp -- )
111 HOOK: %set-string-nth-fast cpu ( ch obj index temp -- )
112
113 HOOK: %add     cpu ( dst src1 src2 -- )
114 HOOK: %add-imm cpu ( dst src1 src2 -- )
115 HOOK: %sub     cpu ( dst src1 src2 -- )
116 HOOK: %sub-imm cpu ( dst src1 src2 -- )
117 HOOK: %mul     cpu ( dst src1 src2 -- )
118 HOOK: %mul-imm cpu ( dst src1 src2 -- )
119 HOOK: %and     cpu ( dst src1 src2 -- )
120 HOOK: %and-imm cpu ( dst src1 src2 -- )
121 HOOK: %or      cpu ( dst src1 src2 -- )
122 HOOK: %or-imm  cpu ( dst src1 src2 -- )
123 HOOK: %xor     cpu ( dst src1 src2 -- )
124 HOOK: %xor-imm cpu ( dst src1 src2 -- )
125 HOOK: %shl     cpu ( dst src1 src2 -- )
126 HOOK: %shl-imm cpu ( dst src1 src2 -- )
127 HOOK: %shr     cpu ( dst src1 src2 -- )
128 HOOK: %shr-imm cpu ( dst src1 src2 -- )
129 HOOK: %sar     cpu ( dst src1 src2 -- )
130 HOOK: %sar-imm cpu ( dst src1 src2 -- )
131 HOOK: %min     cpu ( dst src1 src2 -- )
132 HOOK: %max     cpu ( dst src1 src2 -- )
133 HOOK: %not     cpu ( dst src -- )
134 HOOK: %log2    cpu ( dst src -- )
135
136 HOOK: %copy cpu ( dst src rep -- )
137
138 HOOK: %fixnum-add cpu ( label dst src1 src2 -- )
139 HOOK: %fixnum-sub cpu ( label dst src1 src2 -- )
140 HOOK: %fixnum-mul cpu ( label dst src1 src2 -- )
141
142 HOOK: %integer>bignum cpu ( dst src temp -- )
143 HOOK: %bignum>integer cpu ( dst src temp -- )
144
145 HOOK: %unbox-float cpu ( dst src -- )
146 HOOK: %box-float cpu ( dst src temp -- )
147
148 HOOK: %add-float cpu ( dst src1 src2 -- )
149 HOOK: %sub-float cpu ( dst src1 src2 -- )
150 HOOK: %mul-float cpu ( dst src1 src2 -- )
151 HOOK: %div-float cpu ( dst src1 src2 -- )
152 HOOK: %min-float cpu ( dst src1 src2 -- )
153 HOOK: %max-float cpu ( dst src1 src2 -- )
154 HOOK: %sqrt cpu ( dst src -- )
155 HOOK: %unary-float-function cpu ( dst src func -- )
156 HOOK: %binary-float-function cpu ( dst src1 src2 func -- )
157
158 HOOK: %single>double-float cpu ( dst src -- )
159 HOOK: %double>single-float cpu ( dst src -- )
160
161 HOOK: %integer>float cpu ( dst src -- )
162 HOOK: %float>integer cpu ( dst src -- )
163
164 HOOK: %box-vector cpu ( dst src temp rep -- )
165 HOOK: %unbox-vector cpu ( dst src rep -- )
166
167 HOOK: %broadcast-vector cpu ( dst src rep -- )
168 HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
169 HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
170
171 HOOK: %add-vector cpu ( dst src1 src2 rep -- )
172 HOOK: %sub-vector cpu ( dst src1 src2 rep -- )
173 HOOK: %mul-vector cpu ( dst src1 src2 rep -- )
174 HOOK: %div-vector cpu ( dst src1 src2 rep -- )
175 HOOK: %min-vector cpu ( dst src1 src2 rep -- )
176 HOOK: %max-vector cpu ( dst src1 src2 rep -- )
177 HOOK: %sqrt-vector cpu ( dst src rep -- )
178 HOOK: %horizontal-add-vector cpu ( dst src rep -- )
179
180 HOOK: %unbox-alien cpu ( dst src -- )
181 HOOK: %unbox-any-c-ptr cpu ( dst src temp -- )
182 HOOK: %box-alien cpu ( dst src temp -- )
183 HOOK: %box-displaced-alien cpu ( dst displacement base temp1 temp2 base-class -- )
184
185 HOOK: %alien-unsigned-1 cpu ( dst src -- )
186 HOOK: %alien-unsigned-2 cpu ( dst src -- )
187 HOOK: %alien-unsigned-4 cpu ( dst src -- )
188 HOOK: %alien-signed-1   cpu ( dst src -- )
189 HOOK: %alien-signed-2   cpu ( dst src -- )
190 HOOK: %alien-signed-4   cpu ( dst src -- )
191 HOOK: %alien-cell       cpu ( dst src -- )
192 HOOK: %alien-float      cpu ( dst src -- )
193 HOOK: %alien-double     cpu ( dst src -- )
194 HOOK: %alien-vector     cpu ( dst src rep -- )
195
196 HOOK: %set-alien-integer-1 cpu ( ptr value -- )
197 HOOK: %set-alien-integer-2 cpu ( ptr value -- )
198 HOOK: %set-alien-integer-4 cpu ( ptr value -- )
199 HOOK: %set-alien-cell      cpu ( ptr value -- )
200 HOOK: %set-alien-float     cpu ( ptr value -- )
201 HOOK: %set-alien-double    cpu ( ptr value -- )
202 HOOK: %set-alien-vector    cpu ( ptr value rep -- )
203
204 HOOK: %alien-global cpu ( dst symbol library -- )
205 HOOK: %vm-field-ptr cpu ( dst fieldname -- )
206
207 HOOK: %allot cpu ( dst size class temp -- )
208 HOOK: %write-barrier cpu ( src card# table -- )
209
210 ! GC checks
211 HOOK: %check-nursery cpu ( label temp1 temp2 -- )
212 HOOK: %save-gc-root cpu ( gc-root register -- )
213 HOOK: %load-gc-root cpu ( gc-root register -- )
214 HOOK: %call-gc cpu ( gc-root-count -- )
215
216 HOOK: %prologue cpu ( n -- )
217 HOOK: %epilogue cpu ( n -- )
218
219 HOOK: %compare cpu ( dst temp cc src1 src2 -- )
220 HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- )
221 HOOK: %compare-float-ordered cpu ( dst temp cc src1 src2 -- )
222 HOOK: %compare-float-unordered cpu ( dst temp cc src1 src2 -- )
223
224 HOOK: %compare-branch cpu ( label cc src1 src2 -- )
225 HOOK: %compare-imm-branch cpu ( label cc src1 src2 -- )
226 HOOK: %compare-float-ordered-branch cpu ( label cc src1 src2 -- )
227 HOOK: %compare-float-unordered-branch cpu ( label cc src1 src2 -- )
228
229 HOOK: %spill cpu ( src rep n -- )
230 HOOK: %reload cpu ( dst rep n -- )
231
232 HOOK: %loop-entry cpu ( -- )
233
234 ! FFI stuff
235
236 ! Return values of this class go here
237 GENERIC: return-reg ( reg-class -- reg )
238
239 ! Sequence of registers used for parameter passing in class
240 GENERIC: param-regs ( reg-class -- regs )
241
242 M: stack-params param-regs drop f ;
243
244 GENERIC: param-reg ( n reg-class -- reg )
245
246 M: reg-class param-reg param-regs nth ;
247
248 M: stack-params param-reg drop ;
249
250 ! Is this integer small enough to appear in value template
251 ! slots?
252 HOOK: small-enough? cpu ( n -- ? )
253
254 ! Is this structure small enough to be returned in registers?
255 HOOK: return-struct-in-registers? cpu ( c-type -- ? )
256
257 ! Do we pass this struct by value or hidden reference?
258 HOOK: value-struct? cpu ( c-type -- ? )
259
260 ! If t, all parameters are shadowed by dummy stack parameters
261 HOOK: dummy-stack-params? cpu ( -- ? )
262
263 ! If t, all FP parameters are shadowed by dummy int parameters
264 HOOK: dummy-int-params? cpu ( -- ? )
265
266 ! If t, all int parameters are shadowed by dummy FP parameters
267 HOOK: dummy-fp-params? cpu ( -- ? )
268
269 HOOK: %prepare-unbox cpu ( -- )
270
271 HOOK: %unbox cpu ( n rep func -- )
272
273 HOOK: %unbox-long-long cpu ( n func -- )
274
275 HOOK: %unbox-small-struct cpu ( c-type -- )
276
277 HOOK: %unbox-large-struct cpu ( n c-type -- )
278
279 HOOK: %box cpu ( n rep func -- )
280
281 HOOK: %box-long-long cpu ( n func -- )
282
283 HOOK: %prepare-box-struct cpu ( -- )
284
285 HOOK: %box-small-struct cpu ( c-type -- )
286
287 HOOK: %box-large-struct cpu ( n c-type -- )
288
289 HOOK: %save-param-reg cpu ( stack reg rep -- )
290
291 HOOK: %load-param-reg cpu ( stack reg rep -- )
292
293 HOOK: %save-context cpu ( temp1 temp2 callback-allowed? -- )
294
295 HOOK: %prepare-var-args cpu ( -- )
296
297 M: object %prepare-var-args ;
298
299 HOOK: %alien-invoke cpu ( function library -- )
300
301 HOOK: %vm-invoke-1st-arg cpu ( function -- )
302 HOOK: %vm-invoke-3rd-arg cpu ( function -- )
303
304 HOOK: %cleanup cpu ( params -- )
305
306 M: object %cleanup ( params -- ) drop ;
307
308 HOOK: %prepare-alien-indirect cpu ( -- )
309
310 HOOK: %alien-indirect cpu ( -- )
311
312 HOOK: %alien-callback cpu ( quot -- )
313
314 HOOK: %callback-value cpu ( ctype -- )
315
316 ! Return to caller with stdcall unwinding (only for x86)
317 HOOK: %callback-return cpu ( params -- )
318
319 M: object %callback-return drop %return ;