]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/architecture/architecture.factor
Merge branch 'master' of git://factorcode.org/git/factor into abi-symbols
[factor.git] / basis / cpu / architecture / architecture.factor
1 ! Copyright (C) 2006, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs generic kernel kernel.private
4 math 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 char-16-rep
26 uchar-16-rep
27 short-8-rep
28 ushort-8-rep
29 int-4-rep
30 uint-4-rep
31 longlong-2-rep
32 ulonglong-2-rep ;
33
34 ! Scalar values in the high component of a vector register
35 SINGLETONS:
36 char-scalar-rep
37 uchar-scalar-rep
38 short-scalar-rep
39 ushort-scalar-rep
40 int-scalar-rep
41 uint-scalar-rep
42 longlong-scalar-rep
43 ulonglong-scalar-rep ;
44
45 SINGLETONS:
46 float-4-rep
47 double-2-rep ;
48
49 UNION: int-vector-rep
50 char-16-rep
51 uchar-16-rep
52 short-8-rep
53 ushort-8-rep
54 int-4-rep
55 uint-4-rep
56 longlong-2-rep
57 ulonglong-2-rep ;
58
59 UNION: signed-int-vector-rep
60 char-16-rep
61 short-8-rep
62 int-4-rep
63 longlong-2-rep ;
64
65 UNION: unsigned-int-vector-rep
66 uchar-16-rep
67 ushort-8-rep
68 uint-4-rep
69 ulonglong-2-rep ;
70
71 UNION: scalar-rep
72 char-scalar-rep
73 uchar-scalar-rep
74 short-scalar-rep
75 ushort-scalar-rep
76 int-scalar-rep
77 uint-scalar-rep
78 longlong-scalar-rep
79 ulonglong-scalar-rep ;
80
81 UNION: float-vector-rep
82 float-4-rep
83 double-2-rep ;
84
85 UNION: vector-rep
86 int-vector-rep
87 float-vector-rep ;
88
89 UNION: representation
90 any-rep
91 tagged-rep
92 int-rep
93 float-rep
94 double-rep
95 vector-rep
96 scalar-rep ;
97
98 : signed-rep ( rep -- rep' )
99     {
100         { uint-4-rep           int-4-rep }
101         { ulonglong-2-rep      longlong-2-rep }
102         { ushort-8-rep         short-8-rep }
103         { uchar-16-rep         char-16-rep }
104         { uchar-scalar-rep     char-scalar-rep }
105         { ushort-scalar-rep    short-scalar-rep }
106         { uint-scalar-rep      int-scalar-rep }
107         { ulonglong-scalar-rep longlong-scalar-rep }
108     } ?at drop ; foldable
109
110 : widen-vector-rep ( rep -- rep' )
111     {
112         { char-16-rep     short-8-rep     }
113         { short-8-rep     int-4-rep       }
114         { int-4-rep       longlong-2-rep  }
115         { uchar-16-rep    ushort-8-rep    }
116         { ushort-8-rep    uint-4-rep      }
117         { uint-4-rep      ulonglong-2-rep }
118         { float-4-rep     double-2-rep    }
119     } at ; foldable
120
121 : narrow-vector-rep ( rep -- rep' )
122     {
123         { short-8-rep     char-16-rep     }
124         { int-4-rep       short-8-rep     }
125         { longlong-2-rep  int-4-rep       }
126         { ushort-8-rep    uchar-16-rep    }
127         { uint-4-rep      ushort-8-rep    }
128         { ulonglong-2-rep uint-4-rep      }
129         { double-2-rep    float-4-rep     }
130     } at ; foldable
131
132 ! Register classes
133 SINGLETONS: int-regs float-regs ;
134
135 UNION: reg-class int-regs float-regs ;
136 CONSTANT: reg-classes { int-regs float-regs }
137
138 ! A pseudo-register class for parameters spilled on the stack
139 SINGLETON: stack-params
140
141 ! On x86, vectors and floats are stored in the same register bank
142 ! On PowerPC they are distinct
143 HOOK: vector-regs cpu ( -- reg-class )
144
145 GENERIC: reg-class-of ( rep -- reg-class )
146
147 M: tagged-rep reg-class-of drop int-regs ;
148 M: int-rep reg-class-of drop int-regs ;
149 M: float-rep reg-class-of drop float-regs ;
150 M: double-rep reg-class-of drop float-regs ;
151 M: vector-rep reg-class-of drop vector-regs ;
152 M: scalar-rep reg-class-of drop vector-regs ;
153 M: stack-params reg-class-of drop stack-params ;
154
155 GENERIC: rep-size ( rep -- n ) foldable
156
157 M: tagged-rep rep-size drop cell ;
158 M: int-rep rep-size drop cell ;
159 M: float-rep rep-size drop 4 ;
160 M: double-rep rep-size drop 8 ;
161 M: stack-params rep-size drop cell ;
162 M: vector-rep rep-size drop 16 ;
163 M: char-scalar-rep rep-size drop 1 ;
164 M: uchar-scalar-rep rep-size drop 1 ;
165 M: short-scalar-rep rep-size drop 2 ;
166 M: ushort-scalar-rep rep-size drop 2 ;
167 M: int-scalar-rep rep-size drop 4 ;
168 M: uint-scalar-rep rep-size drop 4 ;
169 M: longlong-scalar-rep rep-size drop 8 ;
170 M: ulonglong-scalar-rep rep-size drop 8 ;
171
172 GENERIC: rep-length ( rep -- n ) foldable
173
174 M: char-16-rep rep-length drop 16 ;
175 M: uchar-16-rep rep-length drop 16 ;
176 M: short-8-rep rep-length drop 8 ;
177 M: ushort-8-rep rep-length drop 8 ;
178 M: int-4-rep rep-length drop 4 ;
179 M: uint-4-rep rep-length drop 4 ;
180 M: longlong-2-rep rep-length drop 2 ;
181 M: ulonglong-2-rep rep-length drop 2 ;
182 M: float-4-rep rep-length drop 4 ;
183 M: double-2-rep rep-length drop 2 ;
184
185 GENERIC: rep-component-type ( rep -- n )
186
187 ! Methods defined in alien.c-types
188
189 GENERIC: scalar-rep-of ( rep -- rep' )
190
191 M: float-4-rep scalar-rep-of drop float-rep ;
192 M: double-2-rep scalar-rep-of drop double-rep ;
193 M: char-16-rep scalar-rep-of drop char-scalar-rep ;
194 M: uchar-16-rep scalar-rep-of drop uchar-scalar-rep ;
195 M: short-8-rep scalar-rep-of drop short-scalar-rep ;
196 M: ushort-8-rep scalar-rep-of drop ushort-scalar-rep ;
197 M: int-4-rep scalar-rep-of drop int-scalar-rep ;
198 M: uint-4-rep scalar-rep-of drop uint-scalar-rep ;
199 M: longlong-2-rep scalar-rep-of drop longlong-scalar-rep ;
200 M: ulonglong-2-rep scalar-rep-of drop ulonglong-scalar-rep ;
201
202 ! Mapping from register class to machine registers
203 HOOK: machine-registers cpu ( -- assoc )
204
205 HOOK: %load-immediate cpu ( reg obj -- )
206 HOOK: %load-reference cpu ( reg obj -- )
207
208 HOOK: %peek cpu ( vreg loc -- )
209 HOOK: %replace cpu ( vreg loc -- )
210 HOOK: %inc-d cpu ( n -- )
211 HOOK: %inc-r cpu ( n -- )
212
213 HOOK: stack-frame-size cpu ( stack-frame -- n )
214 HOOK: %call cpu ( word -- )
215 HOOK: %jump cpu ( word -- )
216 HOOK: %jump-label cpu ( label -- )
217 HOOK: %return cpu ( -- )
218
219 HOOK: %dispatch cpu ( src temp -- )
220
221 HOOK: %slot cpu ( dst obj slot -- )
222 HOOK: %slot-imm cpu ( dst obj slot tag -- )
223 HOOK: %set-slot cpu ( src obj slot -- )
224 HOOK: %set-slot-imm cpu ( src obj slot tag -- )
225
226 HOOK: %string-nth cpu ( dst obj index temp -- )
227 HOOK: %set-string-nth-fast cpu ( ch obj index temp -- )
228
229 HOOK: %add     cpu ( dst src1 src2 -- )
230 HOOK: %add-imm cpu ( dst src1 src2 -- )
231 HOOK: %sub     cpu ( dst src1 src2 -- )
232 HOOK: %sub-imm cpu ( dst src1 src2 -- )
233 HOOK: %mul     cpu ( dst src1 src2 -- )
234 HOOK: %mul-imm cpu ( dst src1 src2 -- )
235 HOOK: %and     cpu ( dst src1 src2 -- )
236 HOOK: %and-imm cpu ( dst src1 src2 -- )
237 HOOK: %or      cpu ( dst src1 src2 -- )
238 HOOK: %or-imm  cpu ( dst src1 src2 -- )
239 HOOK: %xor     cpu ( dst src1 src2 -- )
240 HOOK: %xor-imm cpu ( dst src1 src2 -- )
241 HOOK: %shl     cpu ( dst src1 src2 -- )
242 HOOK: %shl-imm cpu ( dst src1 src2 -- )
243 HOOK: %shr     cpu ( dst src1 src2 -- )
244 HOOK: %shr-imm cpu ( dst src1 src2 -- )
245 HOOK: %sar     cpu ( dst src1 src2 -- )
246 HOOK: %sar-imm cpu ( dst src1 src2 -- )
247 HOOK: %min     cpu ( dst src1 src2 -- )
248 HOOK: %max     cpu ( dst src1 src2 -- )
249 HOOK: %not     cpu ( dst src -- )
250 HOOK: %neg     cpu ( dst src -- )
251 HOOK: %log2    cpu ( dst src -- )
252
253 HOOK: %copy cpu ( dst src rep -- )
254
255 HOOK: %fixnum-add cpu ( label dst src1 src2 -- )
256 HOOK: %fixnum-sub cpu ( label dst src1 src2 -- )
257 HOOK: %fixnum-mul cpu ( label dst src1 src2 -- )
258
259 HOOK: %add-float cpu ( dst src1 src2 -- )
260 HOOK: %sub-float cpu ( dst src1 src2 -- )
261 HOOK: %mul-float cpu ( dst src1 src2 -- )
262 HOOK: %div-float cpu ( dst src1 src2 -- )
263 HOOK: %min-float cpu ( dst src1 src2 -- )
264 HOOK: %max-float cpu ( dst src1 src2 -- )
265 HOOK: %sqrt cpu ( dst src -- )
266 HOOK: %unary-float-function cpu ( dst src func -- )
267 HOOK: %binary-float-function cpu ( dst src1 src2 func -- )
268
269 HOOK: %single>double-float cpu ( dst src -- )
270 HOOK: %double>single-float cpu ( dst src -- )
271
272 HOOK: %integer>float cpu ( dst src -- )
273 HOOK: %float>integer cpu ( dst src -- )
274
275 HOOK: %zero-vector cpu ( dst rep -- )
276 HOOK: %fill-vector cpu ( dst rep -- )
277 HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
278 HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
279 HOOK: %shuffle-vector cpu ( dst src shuffle rep -- )
280 HOOK: %shuffle-vector-imm cpu ( dst src shuffle rep -- )
281 HOOK: %tail>head-vector cpu ( dst src rep -- )
282 HOOK: %merge-vector-head cpu ( dst src1 src2 rep -- )
283 HOOK: %merge-vector-tail cpu ( dst src1 src2 rep -- )
284 HOOK: %signed-pack-vector cpu ( dst src1 src2 rep -- )
285 HOOK: %unsigned-pack-vector cpu ( dst src1 src2 rep -- )
286 HOOK: %unpack-vector-head cpu ( dst src rep -- )
287 HOOK: %unpack-vector-tail cpu ( dst src rep -- )
288 HOOK: %integer>float-vector cpu ( dst src rep -- )
289 HOOK: %float>integer-vector cpu ( dst src rep -- )
290 HOOK: %compare-vector cpu ( dst src1 src2 rep cc -- )
291 HOOK: %test-vector cpu ( dst src1 temp rep vcc -- )
292 HOOK: %test-vector-branch cpu ( label src1 temp rep vcc -- )
293 HOOK: %add-vector cpu ( dst src1 src2 rep -- )
294 HOOK: %saturated-add-vector cpu ( dst src1 src2 rep -- )
295 HOOK: %add-sub-vector cpu ( dst src1 src2 rep -- )
296 HOOK: %sub-vector cpu ( dst src1 src2 rep -- )
297 HOOK: %saturated-sub-vector cpu ( dst src1 src2 rep -- )
298 HOOK: %mul-vector cpu ( dst src1 src2 rep -- )
299 HOOK: %mul-high-vector cpu ( dst src1 src2 rep -- )
300 HOOK: %mul-horizontal-add-vector cpu ( dst src1 src2 rep -- )
301 HOOK: %saturated-mul-vector cpu ( dst src1 src2 rep -- )
302 HOOK: %div-vector cpu ( dst src1 src2 rep -- )
303 HOOK: %min-vector cpu ( dst src1 src2 rep -- )
304 HOOK: %max-vector cpu ( dst src1 src2 rep -- )
305 HOOK: %avg-vector cpu ( dst src1 src2 rep -- )
306 HOOK: %dot-vector cpu ( dst src1 src2 rep -- )
307 HOOK: %sad-vector cpu ( dst src1 src2 rep -- )
308 HOOK: %sqrt-vector cpu ( dst src rep -- )
309 HOOK: %horizontal-add-vector cpu ( dst src1 src2 rep -- )
310 HOOK: %horizontal-sub-vector cpu ( dst src1 src2 rep -- )
311 HOOK: %abs-vector cpu ( dst src rep -- )
312 HOOK: %and-vector cpu ( dst src1 src2 rep -- )
313 HOOK: %andn-vector cpu ( dst src1 src2 rep -- )
314 HOOK: %or-vector cpu ( dst src1 src2 rep -- )
315 HOOK: %xor-vector cpu ( dst src1 src2 rep -- )
316 HOOK: %not-vector cpu ( dst src rep -- )
317 HOOK: %shl-vector cpu ( dst src1 src2 rep -- )
318 HOOK: %shr-vector cpu ( dst src1 src2 rep -- )
319 HOOK: %shl-vector-imm cpu ( dst src1 src2 rep -- )
320 HOOK: %shr-vector-imm cpu ( dst src1 src2 rep -- )
321 HOOK: %horizontal-shl-vector-imm cpu ( dst src1 src2 rep -- )
322 HOOK: %horizontal-shr-vector-imm cpu ( dst src1 src2 rep -- )
323
324 HOOK: %integer>scalar cpu ( dst src rep -- )
325 HOOK: %scalar>integer cpu ( dst src rep -- )
326 HOOK: %vector>scalar cpu ( dst src rep -- )
327 HOOK: %scalar>vector cpu ( dst src rep -- )
328
329 HOOK: %zero-vector-reps cpu ( -- reps )
330 HOOK: %fill-vector-reps cpu ( -- reps )
331 HOOK: %gather-vector-2-reps cpu ( -- reps )
332 HOOK: %gather-vector-4-reps cpu ( -- reps )
333 HOOK: %alien-vector-reps cpu ( -- reps )
334 HOOK: %shuffle-vector-reps cpu ( -- reps )
335 HOOK: %shuffle-vector-imm-reps cpu ( -- reps )
336 HOOK: %merge-vector-reps cpu ( -- reps )
337 HOOK: %signed-pack-vector-reps cpu ( -- reps )
338 HOOK: %unsigned-pack-vector-reps cpu ( -- reps )
339 HOOK: %unpack-vector-head-reps cpu ( -- reps )
340 HOOK: %unpack-vector-tail-reps cpu ( -- reps )
341 HOOK: %integer>float-vector-reps cpu ( -- reps )
342 HOOK: %float>integer-vector-reps cpu ( -- reps )
343 HOOK: %compare-vector-reps cpu ( cc -- reps )
344 HOOK: %compare-vector-ccs cpu ( rep cc -- {cc,swap?}s not? )
345 HOOK: %test-vector-reps cpu ( -- reps )
346 HOOK: %add-vector-reps cpu ( -- reps )
347 HOOK: %saturated-add-vector-reps cpu ( -- reps )
348 HOOK: %add-sub-vector-reps cpu ( -- reps )
349 HOOK: %sub-vector-reps cpu ( -- reps )
350 HOOK: %saturated-sub-vector-reps cpu ( -- reps )
351 HOOK: %mul-vector-reps cpu ( -- reps )
352 HOOK: %mul-high-vector-reps cpu ( -- reps )
353 HOOK: %mul-horizontal-add-vector-reps cpu ( -- reps )
354 HOOK: %saturated-mul-vector-reps cpu ( -- reps )
355 HOOK: %div-vector-reps cpu ( -- reps )
356 HOOK: %min-vector-reps cpu ( -- reps )
357 HOOK: %max-vector-reps cpu ( -- reps )
358 HOOK: %avg-vector-reps cpu ( -- reps )
359 HOOK: %dot-vector-reps cpu ( -- reps )
360 HOOK: %sad-vector-reps cpu ( -- reps )
361 HOOK: %sqrt-vector-reps cpu ( -- reps )
362 HOOK: %horizontal-add-vector-reps cpu ( -- reps )
363 HOOK: %horizontal-sub-vector-reps cpu ( -- reps )
364 HOOK: %abs-vector-reps cpu ( -- reps )
365 HOOK: %and-vector-reps cpu ( -- reps )
366 HOOK: %andn-vector-reps cpu ( -- reps )
367 HOOK: %or-vector-reps cpu ( -- reps )
368 HOOK: %xor-vector-reps cpu ( -- reps )
369 HOOK: %not-vector-reps cpu ( -- reps )
370 HOOK: %shl-vector-reps cpu ( -- reps )
371 HOOK: %shr-vector-reps cpu ( -- reps )
372 HOOK: %shl-vector-imm-reps cpu ( -- reps )
373 HOOK: %shr-vector-imm-reps cpu ( -- reps )
374 HOOK: %horizontal-shl-vector-imm-reps cpu ( -- reps )
375 HOOK: %horizontal-shr-vector-imm-reps cpu ( -- reps )
376
377 M: object %zero-vector-reps { } ;
378 M: object %fill-vector-reps { } ;
379 M: object %gather-vector-2-reps { } ;
380 M: object %gather-vector-4-reps { } ;
381 M: object %alien-vector-reps { } ;
382 M: object %shuffle-vector-reps { } ;
383 M: object %shuffle-vector-imm-reps { } ;
384 M: object %merge-vector-reps { } ;
385 M: object %signed-pack-vector-reps { } ;
386 M: object %unsigned-pack-vector-reps { } ;
387 M: object %unpack-vector-head-reps { } ;
388 M: object %unpack-vector-tail-reps { } ;
389 M: object %integer>float-vector-reps { } ;
390 M: object %float>integer-vector-reps { } ;
391 M: object %compare-vector-reps drop { } ;
392 M: object %compare-vector-ccs 2drop { } f ;
393 M: object %test-vector-reps { } ;
394 M: object %add-vector-reps { } ;
395 M: object %saturated-add-vector-reps { } ;
396 M: object %add-sub-vector-reps { } ;
397 M: object %sub-vector-reps { } ;
398 M: object %saturated-sub-vector-reps { } ;
399 M: object %mul-vector-reps { } ;
400 M: object %saturated-mul-vector-reps { } ;
401 M: object %div-vector-reps { } ;
402 M: object %min-vector-reps { } ;
403 M: object %max-vector-reps { } ;
404 M: object %dot-vector-reps { } ;
405 M: object %sqrt-vector-reps { } ;
406 M: object %horizontal-add-vector-reps { } ;
407 M: object %horizontal-sub-vector-reps { } ;
408 M: object %abs-vector-reps { } ;
409 M: object %and-vector-reps { } ;
410 M: object %andn-vector-reps { } ;
411 M: object %or-vector-reps { } ;
412 M: object %xor-vector-reps { } ;
413 M: object %not-vector-reps { } ;
414 M: object %shl-vector-reps { } ;
415 M: object %shr-vector-reps { } ;
416 M: object %shl-vector-imm-reps { } ;
417 M: object %shr-vector-imm-reps { } ;
418 M: object %horizontal-shl-vector-imm-reps { } ;
419 M: object %horizontal-shr-vector-imm-reps { } ;
420
421 ALIAS: %merge-vector-head-reps %merge-vector-reps
422 ALIAS: %merge-vector-tail-reps %merge-vector-reps
423 ALIAS: %tail>head-vector-reps %unpack-vector-head-reps
424
425 HOOK: %unbox-alien cpu ( dst src -- )
426 HOOK: %unbox-any-c-ptr cpu ( dst src -- )
427 HOOK: %box-alien cpu ( dst src temp -- )
428 HOOK: %box-displaced-alien cpu ( dst displacement base temp base-class -- )
429
430 HOOK: %alien-unsigned-1 cpu ( dst src offset -- )
431 HOOK: %alien-unsigned-2 cpu ( dst src offset -- )
432 HOOK: %alien-unsigned-4 cpu ( dst src offset -- )
433 HOOK: %alien-signed-1   cpu ( dst src offset -- )
434 HOOK: %alien-signed-2   cpu ( dst src offset -- )
435 HOOK: %alien-signed-4   cpu ( dst src offset -- )
436 HOOK: %alien-cell       cpu ( dst src offset -- )
437 HOOK: %alien-float      cpu ( dst src offset -- )
438 HOOK: %alien-double     cpu ( dst src offset -- )
439 HOOK: %alien-vector     cpu ( dst src offset rep -- )
440
441 HOOK: %set-alien-integer-1 cpu ( ptr offset value -- )
442 HOOK: %set-alien-integer-2 cpu ( ptr offset value -- )
443 HOOK: %set-alien-integer-4 cpu ( ptr offset value -- )
444 HOOK: %set-alien-cell      cpu ( ptr offset value -- )
445 HOOK: %set-alien-float     cpu ( ptr offset value -- )
446 HOOK: %set-alien-double    cpu ( ptr offset value -- )
447 HOOK: %set-alien-vector    cpu ( ptr offset value rep -- )
448
449 HOOK: %alien-global cpu ( dst symbol library -- )
450 HOOK: %vm-field cpu ( dst offset -- )
451 HOOK: %set-vm-field cpu ( src offset -- )
452
453 : %context ( dst -- ) 0 %vm-field ;
454
455 HOOK: %allot cpu ( dst size class temp -- )
456 HOOK: %write-barrier cpu ( src slot temp1 temp2 -- )
457 HOOK: %write-barrier-imm cpu ( src slot temp1 temp2 -- )
458
459 ! GC checks
460 HOOK: %check-nursery cpu ( label size temp1 temp2 -- )
461 HOOK: %save-gc-root cpu ( gc-root register -- )
462 HOOK: %load-gc-root cpu ( gc-root register -- )
463 HOOK: %call-gc cpu ( gc-root-count temp1 -- )
464
465 HOOK: %prologue cpu ( n -- )
466 HOOK: %epilogue cpu ( n -- )
467
468 HOOK: %compare cpu ( dst temp cc src1 src2 -- )
469 HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- )
470 HOOK: %compare-float-ordered cpu ( dst temp cc src1 src2 -- )
471 HOOK: %compare-float-unordered cpu ( dst temp cc src1 src2 -- )
472
473 HOOK: %compare-branch cpu ( label cc src1 src2 -- )
474 HOOK: %compare-imm-branch cpu ( label cc src1 src2 -- )
475 HOOK: %compare-float-ordered-branch cpu ( label cc src1 src2 -- )
476 HOOK: %compare-float-unordered-branch cpu ( label cc src1 src2 -- )
477
478 HOOK: %spill cpu ( src rep dst -- )
479 HOOK: %reload cpu ( dst rep src -- )
480
481 HOOK: %loop-entry cpu ( -- )
482
483 ! FFI stuff
484
485 ! Return values of this class go here
486 GENERIC: return-reg ( reg-class -- reg )
487
488 ! Sequence of registers used for parameter passing in class
489 GENERIC# param-regs 1 ( reg-class abi -- regs )
490
491 M: stack-params param-regs 2drop f ;
492
493 GENERIC# param-reg 1 ( n reg-class abi -- reg )
494
495 M: reg-class param-reg param-regs nth ;
496
497 M: stack-params param-reg 2drop ;
498
499 ! Is this integer small enough to be an immediate operand for
500 ! %add-imm, %sub-imm, and %mul-imm?
501 HOOK: immediate-arithmetic? cpu ( n -- ? )
502
503 ! Is this integer small enough to be an immediate operand for
504 ! %and-imm, %or-imm, and %xor-imm?
505 HOOK: immediate-bitwise? cpu ( n -- ? )
506
507 ! What c-type describes the implicit struct return pointer for large structs?
508 HOOK: struct-return-pointer-type cpu ( -- c-type )
509
510 ! Is this structure small enough to be returned in registers?
511 HOOK: return-struct-in-registers? cpu ( c-type -- ? )
512
513 ! Do we pass this struct by value or hidden reference?
514 HOOK: value-struct? cpu ( c-type -- ? )
515
516 ! If t, all parameters are shadowed by dummy stack parameters
517 HOOK: dummy-stack-params? cpu ( -- ? )
518
519 ! If t, all FP parameters are shadowed by dummy int parameters
520 HOOK: dummy-int-params? cpu ( -- ? )
521
522 ! If t, all int parameters are shadowed by dummy FP parameters
523 HOOK: dummy-fp-params? cpu ( -- ? )
524
525 ! Load a value (from the data stack in the ds register).
526 ! The value is then passed as a parameter to a VM to_*() function
527 HOOK: %pop-stack cpu ( n -- )
528
529 ! Store a value (to the data stack in the VM's current context)
530 ! The value is passed to a VM to_*() function -- used for
531 ! callback returns
532 HOOK: %pop-context-stack cpu ( -- )
533
534 ! Store a value (to the data stack in the ds register).
535 ! The value was returned from a VM from_*() function
536 HOOK: %push-stack cpu ( -- )
537
538 ! Store a value (to the data stack in the VM's current context)
539 ! The value is returned from a VM from_*() function -- used for
540 ! callback parameters
541 HOOK: %push-context-stack cpu ( -- )
542
543 ! Call a function to convert a tagged pointer returned by
544 ! %pop-stack or %pop-context-stack into a value that can be
545 ! passed to a C function, or returned from a callback
546 HOOK: %unbox cpu ( n rep func -- )
547
548 HOOK: %unbox-long-long cpu ( n func -- )
549
550 HOOK: %unbox-small-struct cpu ( c-type -- )
551
552 HOOK: %unbox-large-struct cpu ( n c-type -- )
553
554 ! Call a function to convert a value into a tagged pointer,
555 ! possibly allocating a bignum, float, or alien instance,
556 ! which is then pushed on the data stack by %push-stack or
557 ! %push-context-stack
558 HOOK: %box cpu ( n rep func -- )
559
560 HOOK: %box-long-long cpu ( n func -- )
561
562 HOOK: %prepare-box-struct cpu ( -- )
563
564 HOOK: %box-small-struct cpu ( c-type -- )
565
566 HOOK: %box-large-struct cpu ( n c-type -- )
567
568 HOOK: %save-param-reg cpu ( stack reg rep -- )
569
570 HOOK: %load-param-reg cpu ( stack reg rep -- )
571
572 HOOK: %restore-context cpu ( temp1 temp2 -- )
573
574 HOOK: %save-context cpu ( temp1 temp2 -- )
575
576 HOOK: %prepare-var-args cpu ( -- )
577
578 M: object %prepare-var-args ;
579
580 HOOK: %alien-invoke cpu ( function library -- )
581
582 HOOK: %cleanup cpu ( params -- )
583
584 M: object %cleanup ( params -- ) drop ;
585
586 HOOK: %prepare-alien-indirect cpu ( -- )
587
588 HOOK: %alien-indirect cpu ( -- )
589
590 HOOK: %begin-callback cpu ( -- )
591
592 HOOK: %alien-callback cpu ( quot -- )
593
594 HOOK: %end-callback cpu ( -- )
595
596 HOOK: %end-callback-value cpu ( c-type -- )
597
598 HOOK: callback-return-rewind cpu ( params -- n )
599
600 M: object callback-return-rewind drop 0 ;