63af4f9dbb755bcf64001c19c5c98d9fe7679cdd
[sbcl/pkhuong.git] / src / compiler / x86-64 / vm.lisp
blob63af4f9dbb755bcf64001c19c5c98d9fe7679cdd
1 ;;;; miscellaneous VM definition noise for the x86-64
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
12 (in-package "SB!VM")
14 ;;; the size of an INTEGER representation of a SYSTEM-AREA-POINTER, i.e.
15 ;;; size of a native memory address
16 (deftype sap-int () '(unsigned-byte 64))
18 ;;;; register specs
20 (eval-when (:compile-toplevel :load-toplevel :execute)
21 (defvar *byte-register-names* (make-array 32 :initial-element nil))
22 (defvar *word-register-names* (make-array 32 :initial-element nil))
23 (defvar *dword-register-names* (make-array 32 :initial-element nil))
24 (defvar *qword-register-names* (make-array 32 :initial-element nil))
25 (defvar *float-register-names* (make-array 16 :initial-element nil)))
27 (macrolet ((defreg (name offset size)
28 (let ((offset-sym (symbolicate name "-OFFSET"))
29 (names-vector (symbolicate "*" size "-REGISTER-NAMES*")))
30 `(progn
31 (eval-when (:compile-toplevel :load-toplevel :execute)
32 ;; EVAL-WHEN is necessary because stuff like #.EAX-OFFSET
33 ;; (in the same file) depends on compile-time evaluation
34 ;; of the DEFCONSTANT. -- AL 20010224
35 (def!constant ,offset-sym ,offset))
36 (setf (svref ,names-vector ,offset-sym)
37 ,(symbol-name name)))))
38 ;; FIXME: It looks to me as though DEFREGSET should also
39 ;; define the related *FOO-REGISTER-NAMES* variable.
40 (defregset (name &rest regs)
41 `(eval-when (:compile-toplevel :load-toplevel :execute)
42 (defparameter ,name
43 (list ,@(mapcar (lambda (name)
44 (symbolicate name "-OFFSET"))
45 regs))))))
47 ;; byte registers
49 ;; Note: the encoding here is different than that used by the chip.
50 ;; We use this encoding so that the compiler thinks that AX (and
51 ;; EAX) overlap AL and AH instead of AL and CL.
53 ;; High-byte are registers disabled on AMD64, since they can't be
54 ;; encoded for an op that has a REX-prefix and we don't want to
55 ;; add special cases into the code generation. The overlap doesn't
56 ;; therefore exist anymore, but the numbering hasn't been changed
57 ;; to reflect this.
58 (defreg al 0 :byte)
59 (defreg cl 2 :byte)
60 (defreg dl 4 :byte)
61 (defreg bl 6 :byte)
62 (defreg sil 12 :byte)
63 (defreg dil 14 :byte)
64 (defreg r8b 16 :byte)
65 (defreg r9b 18 :byte)
66 (defreg r10b 20 :byte)
67 (defreg r11b 22 :byte)
68 (defreg r12b 24 :byte)
69 (defreg r13b 26 :byte)
70 (defreg r14b 28 :byte)
71 (defreg r15b 30 :byte)
72 (defregset *byte-regs*
73 al cl dl bl sil dil r8b r9b r10b
74 #+nil r11b #+nil r12b r13b r14b r15b)
76 ;; word registers
77 (defreg ax 0 :word)
78 (defreg cx 2 :word)
79 (defreg dx 4 :word)
80 (defreg bx 6 :word)
81 (defreg sp 8 :word)
82 (defreg bp 10 :word)
83 (defreg si 12 :word)
84 (defreg di 14 :word)
85 (defreg r8w 16 :word)
86 (defreg r9w 18 :word)
87 (defreg r10w 20 :word)
88 (defreg r11w 22 :word)
89 (defreg r12w 24 :word)
90 (defreg r13w 26 :word)
91 (defreg r14w 28 :word)
92 (defreg r15w 30 :word)
93 (defregset *word-regs* ax cx dx bx si di r8w r9w r10w
94 #+nil r11w #+nil r12w r13w r14w r15w)
96 ;; double word registers
97 (defreg eax 0 :dword)
98 (defreg ecx 2 :dword)
99 (defreg edx 4 :dword)
100 (defreg ebx 6 :dword)
101 (defreg esp 8 :dword)
102 (defreg ebp 10 :dword)
103 (defreg esi 12 :dword)
104 (defreg edi 14 :dword)
105 (defreg r8d 16 :dword)
106 (defreg r9d 18 :dword)
107 (defreg r10d 20 :dword)
108 (defreg r11d 22 :dword)
109 (defreg r12d 24 :dword)
110 (defreg r13d 26 :dword)
111 (defreg r14d 28 :dword)
112 (defreg r15d 30 :dword)
113 (defregset *dword-regs* eax ecx edx ebx esi edi r8d r9d r10d
114 #+nil r11d #+nil r12w r13d r14d r15d)
116 ;; quadword registers
117 (defreg rax 0 :qword)
118 (defreg rcx 2 :qword)
119 (defreg rdx 4 :qword)
120 (defreg rbx 6 :qword)
121 (defreg rsp 8 :qword)
122 (defreg rbp 10 :qword)
123 (defreg rsi 12 :qword)
124 (defreg rdi 14 :qword)
125 (defreg r8 16 :qword)
126 (defreg r9 18 :qword)
127 (defreg r10 20 :qword)
128 (defreg r11 22 :qword)
129 (defreg r12 24 :qword)
130 (defreg r13 26 :qword)
131 (defreg r14 28 :qword)
132 (defreg r15 30 :qword)
133 ;; for no good reason at the time, r12 and r13 were missed from the
134 ;; list of qword registers. However
135 ;; <jsnell> r13 is already used as temporary [#lisp irc 2005/01/30]
136 ;; and we're now going to use r12 for the struct thread*
138 ;; Except that now we use r11 instead of r13 as the temporary,
139 ;; since it's got a more compact encoding than r13, and experimentally
140 ;; the temporary gets used more than the other registers that are never
141 ;; wired. -- JES, 2005-11-02
142 (defregset *qword-regs* rax rcx rdx rbx rsi rdi
143 r8 r9 r10 #+nil r11 #+nil r12 r13 r14 r15)
145 ;; floating point registers
146 (defreg float0 0 :float)
147 (defreg float1 1 :float)
148 (defreg float2 2 :float)
149 (defreg float3 3 :float)
150 (defreg float4 4 :float)
151 (defreg float5 5 :float)
152 (defreg float6 6 :float)
153 (defreg float7 7 :float)
154 (defreg float8 8 :float)
155 (defreg float9 9 :float)
156 (defreg float10 10 :float)
157 (defreg float11 11 :float)
158 (defreg float12 12 :float)
159 (defreg float13 13 :float)
160 (defreg float14 14 :float)
161 (defreg float15 15 :float)
162 (defregset *float-regs* float0 float1 float2 float3 float4 float5 float6 float7
163 float8 float9 float10 float11 float12 float13 float14 float15)
165 ;; registers used to pass arguments
167 ;; the number of arguments/return values passed in registers
168 (def!constant register-arg-count 3)
169 ;; names and offsets for registers used to pass arguments
170 (eval-when (:compile-toplevel :load-toplevel :execute)
171 (defparameter *register-arg-names* '(rdx rdi rsi)))
172 (defregset *register-arg-offsets* rdx rdi rsi)
173 (defregset *c-call-register-arg-offsets* rdi rsi rdx rcx r8 r9))
175 ;;;; SB definitions
177 ;;; There are 16 registers really, but we consider them 32 in order to
178 ;;; describe the overlap of byte registers. The only thing we need to
179 ;;; represent is what registers overlap. Therefore, we consider bytes
180 ;;; to take one unit, and [dq]?words to take two. We don't need to
181 ;;; tell the difference between [dq]?words, because you can't put two
182 ;;; words in a dword register.
183 (define-storage-base registers :finite :size 32)
185 (define-storage-base float-registers :finite :size 16)
187 (define-storage-base stack :unbounded :size 8)
188 (define-storage-base constant :non-packed)
189 (define-storage-base immediate-constant :non-packed)
190 (define-storage-base noise :unbounded :size 2)
192 ;;;; SC definitions
194 ;;; a handy macro so we don't have to keep changing all the numbers whenever
195 ;;; we insert a new storage class
197 (defmacro !define-storage-classes (&rest classes)
198 (collect ((forms))
199 (let ((index 0))
200 (dolist (class classes)
201 (let* ((sc-name (car class))
202 (constant-name (symbolicate sc-name "-SC-NUMBER")))
203 (forms `(define-storage-class ,sc-name ,index
204 ,@(cdr class)))
205 (forms `(def!constant ,constant-name ,index))
206 (incf index))))
207 `(progn
208 ,@(forms))))
210 ;;; The DEFINE-STORAGE-CLASS call for CATCH-BLOCK refers to the size
211 ;;; of CATCH-BLOCK. The size of CATCH-BLOCK isn't calculated until
212 ;;; later in the build process, and the calculation is entangled with
213 ;;; code which has lots of predependencies, including dependencies on
214 ;;; the prior call of DEFINE-STORAGE-CLASS. The proper way to
215 ;;; unscramble this would be to untangle the code, so that the code
216 ;;; which calculates the size of CATCH-BLOCK can be separated from the
217 ;;; other lots-of-dependencies code, so that the code which calculates
218 ;;; the size of CATCH-BLOCK can be executed early, so that this value
219 ;;; is known properly at this point in compilation. However, that
220 ;;; would be a lot of editing of code that I (WHN 19990131) can't test
221 ;;; until the project is complete. So instead, I set the correct value
222 ;;; by hand here (a sort of nondeterministic guess of the right
223 ;;; answer:-) and add an assertion later, after the value is
224 ;;; calculated, that the original guess was correct.
226 ;;; (What a KLUDGE! Anyone who wants to come in and clean up this mess
227 ;;; has my gratitude.) (FIXME: Maybe this should be me..)
228 (eval-when (:compile-toplevel :load-toplevel :execute)
229 (def!constant kludge-nondeterministic-catch-block-size 5))
231 (!define-storage-classes
233 ;; non-immediate constants in the constant pool
234 (constant constant)
236 (fp-single-zero immediate-constant)
237 (fp-double-zero immediate-constant)
238 (fp-complex-single-zero immediate-constant)
239 (fp-complex-double-zero immediate-constant)
241 (fp-single-immediate immediate-constant)
242 (fp-double-immediate immediate-constant)
243 (fp-complex-single-immediate immediate-constant)
244 (fp-complex-double-immediate immediate-constant)
246 (immediate immediate-constant)
249 ;; the stacks
252 ;; the control stack
253 (control-stack stack) ; may be pointers, scanned by GC
255 ;; the non-descriptor stacks
256 ;; XXX alpha backend has :element-size 2 :alignment 2 in these entries
257 (signed-stack stack) ; (signed-byte 64)
258 (unsigned-stack stack) ; (unsigned-byte 64)
259 (character-stack stack) ; non-descriptor characters.
260 (sap-stack stack) ; System area pointers.
261 (single-stack stack) ; single-floats
262 (double-stack stack)
263 (complex-single-stack stack) ; complex-single-floats
264 (complex-double-stack stack :element-size 2) ; complex-double-floats
268 ;; magic SCs
271 (ignore-me noise)
274 ;; things that can go in the integer registers
277 ;; On the X86, we don't have to distinguish between descriptor and
278 ;; non-descriptor registers, because of the conservative GC.
279 ;; Therefore, we use different scs only to distinguish between
280 ;; descriptor and non-descriptor values and to specify size.
282 ;; immediate descriptor objects. Don't have to be seen by GC, but nothing
283 ;; bad will happen if they are. (fixnums, characters, header values, etc).
284 (any-reg registers
285 :locations #.*qword-regs*
286 :element-size 2 ; I think this is for the al/ah overlap thing
287 :constant-scs (immediate)
288 :save-p t
289 :alternate-scs (control-stack))
291 ;; pointer descriptor objects -- must be seen by GC
292 (descriptor-reg registers
293 :locations #.*qword-regs*
294 :element-size 2
295 ; :reserve-locations (#.eax-offset)
296 :constant-scs (constant immediate)
297 :save-p t
298 :alternate-scs (control-stack))
300 ;; non-descriptor characters
301 (character-reg registers
302 :locations #!-sb-unicode #.*byte-regs*
303 #!+sb-unicode #.*qword-regs*
304 #!+sb-unicode #!+sb-unicode
305 :element-size 2
306 #!-sb-unicode #!-sb-unicode
307 :reserve-locations (#.al-offset)
308 :constant-scs (immediate)
309 :save-p t
310 :alternate-scs (character-stack))
312 ;; non-descriptor SAPs (arbitrary pointers into address space)
313 (sap-reg registers
314 :locations #.*qword-regs*
315 :element-size 2
316 ; :reserve-locations (#.eax-offset)
317 :constant-scs (immediate)
318 :save-p t
319 :alternate-scs (sap-stack))
321 ;; non-descriptor (signed or unsigned) numbers
322 (signed-reg registers
323 :locations #.*qword-regs*
324 :element-size 2
325 :constant-scs (immediate)
326 :save-p t
327 :alternate-scs (signed-stack))
328 (unsigned-reg registers
329 :locations #.*qword-regs*
330 :element-size 2
331 :constant-scs (immediate)
332 :save-p t
333 :alternate-scs (unsigned-stack))
335 ;; miscellaneous objects that must not be seen by GC. Used only as
336 ;; temporaries.
337 (word-reg registers
338 :locations #.*word-regs*
339 :element-size 2
341 (dword-reg registers
342 :locations #.*dword-regs*
343 :element-size 2
345 (byte-reg registers
346 :locations #.*byte-regs*
349 ;; that can go in the floating point registers
351 ;; non-descriptor SINGLE-FLOATs
352 (single-reg float-registers
353 :locations #.*float-regs*
354 :constant-scs (fp-single-zero fp-single-immediate)
355 :save-p t
356 :alternate-scs (single-stack))
358 ;; non-descriptor DOUBLE-FLOATs
359 (double-reg float-registers
360 :locations #.*float-regs*
361 :constant-scs (fp-double-zero fp-double-immediate)
362 :save-p t
363 :alternate-scs (double-stack))
365 (complex-single-reg float-registers
366 :locations #.*float-regs*
367 :constant-scs (fp-complex-single-zero fp-complex-single-immediate)
368 :save-p t
369 :alternate-scs (complex-single-stack))
371 (complex-double-reg float-registers
372 :locations #.*float-regs*
373 :constant-scs (fp-complex-double-zero fp-complex-double-immediate)
374 :save-p t
375 :alternate-scs (complex-double-stack))
377 ;; a catch or unwind block
378 (catch-block stack :element-size kludge-nondeterministic-catch-block-size))
380 (eval-when (:compile-toplevel :load-toplevel :execute)
381 (defparameter *byte-sc-names*
382 '(#!-sb-unicode character-reg byte-reg #!-sb-unicode character-stack))
383 (defparameter *word-sc-names* '(word-reg))
384 (defparameter *dword-sc-names* '(dword-reg))
385 (defparameter *qword-sc-names*
386 '(any-reg descriptor-reg sap-reg signed-reg unsigned-reg control-stack
387 signed-stack unsigned-stack sap-stack single-stack
388 #!+sb-unicode character-reg #!+sb-unicode character-stack constant))
389 ;;; added by jrd. I guess the right thing to do is to treat floats
390 ;;; as a separate size...
392 ;;; These are used to (at least) determine operand size.
393 (defparameter *float-sc-names* '(single-reg))
394 (defparameter *double-sc-names* '(double-reg double-stack))
395 (defparameter *complex-sc-names* '(complex-single-reg complex-single-stack
396 complex-double-reg complex-double-stack))
397 ) ; EVAL-WHEN
399 ;;;; miscellaneous TNs for the various registers
401 (macrolet ((def-misc-reg-tns (sc-name &rest reg-names)
402 (collect ((forms))
403 (dolist (reg-name reg-names)
404 (let ((tn-name (symbolicate reg-name "-TN"))
405 (offset-name (symbolicate reg-name "-OFFSET")))
406 ;; FIXME: It'd be good to have the special
407 ;; variables here be named with the *FOO*
408 ;; convention.
409 (forms `(defparameter ,tn-name
410 (make-random-tn :kind :normal
411 :sc (sc-or-lose ',sc-name)
412 :offset
413 ,offset-name)))))
414 `(progn ,@(forms)))))
416 (def-misc-reg-tns unsigned-reg rax rbx rcx rdx rbp rsp rdi rsi
417 r8 r9 r10 r11 r12 r13 r14 r15)
418 (def-misc-reg-tns dword-reg eax ebx ecx edx ebp esp edi esi
419 r8d r9d r10d r11d r12d r13d r14d r15d)
420 (def-misc-reg-tns word-reg ax bx cx dx bp sp di si
421 r8w r9w r10w r11w r12w r13w r14w r15w)
422 (def-misc-reg-tns byte-reg al cl dl bl sil dil r8b r9b r10b
423 r11b r12b r13b r14b r15b)
424 (def-misc-reg-tns single-reg
425 float0 float1 float2 float3 float4 float5 float6 float7
426 float8 float9 float10 float11 float12 float13 float14 float15))
428 (defun reg-in-size (tn size)
429 (make-random-tn :kind :normal
430 :sc (sc-or-lose
431 (ecase size
432 (:byte 'byte-reg)
433 (:word 'word-reg)
434 (:dword 'dword-reg)
435 (:qword 'unsigned-reg)))
436 :offset (tn-offset tn)))
438 ;; A register that's never used by the code generator, and can therefore
439 ;; be used as an assembly temporary in cases where a VOP :TEMPORARY can't
440 ;; be used.
441 (defparameter temp-reg-tn r11-tn)
443 ;;; TNs for registers used to pass arguments
444 (defparameter *register-arg-tns*
445 (mapcar (lambda (register-arg-name)
446 (symbol-value (symbolicate register-arg-name "-TN")))
447 *register-arg-names*))
449 (defparameter thread-base-tn
450 (make-random-tn :kind :normal :sc (sc-or-lose 'unsigned-reg )
451 :offset r12-offset))
453 ;;; If value can be represented as an immediate constant, then return
454 ;;; the appropriate SC number, otherwise return NIL.
455 (!def-vm-support-routine immediate-constant-sc (value)
456 (typecase value
457 ((or (integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum)
458 character)
459 (sc-number-or-lose 'immediate))
460 (symbol
461 (when (static-symbol-p value)
462 (sc-number-or-lose 'immediate)))
463 (single-float
464 (sc-number-or-lose
465 (if (eql value 0f0) 'fp-single-zero 'fp-single-immediate)))
466 (double-float
467 (sc-number-or-lose
468 (if (eql value 0d0) 'fp-double-zero 'fp-double-immediate)))
469 ((complex single-float)
470 (sc-number-or-lose
471 (if (eql value #c(0f0 0f0))
472 'fp-complex-single-zero
473 'fp-complex-single-immediate)))
474 ((complex double-float)
475 (sc-number-or-lose
476 (if (eql value #c(0d0 0d0))
477 'fp-complex-double-zero
478 'fp-complex-double-immediate)))))
481 ;;;; miscellaneous function call parameters
483 ;;; Offsets of special stack frame locations relative to RBP.
485 ;;; Consider the standard prologue PUSH RBP; MOV RBP, RSP: the return
486 ;;; address is at RBP+8, the old control stack frame pointer is at
487 ;;; RBP, the magic 3rd slot is at RBP-8. Then come the locals from
488 ;;; RBP-16 on.
489 (def!constant return-pc-save-offset 0)
490 (def!constant ocfp-save-offset 1)
491 (def!constant code-save-offset 2)
492 ;;; Let SP be the stack pointer before CALLing, and FP is the frame
493 ;;; pointer after the standard prologue. SP +
494 ;;; FRAME-WORD-OFFSET(SP->FP-OFFSET + I) = FP + FRAME-WORD-OFFSET(I).
495 (def!constant sp->fp-offset 2)
497 (declaim (inline frame-word-offset))
498 (defun frame-word-offset (index)
499 (- (1- index)))
501 (declaim (inline frame-byte-offset))
502 (defun frame-byte-offset (index)
503 (* (frame-word-offset index) n-word-bytes))
505 (def!constant lra-save-offset return-pc-save-offset) ; ?
507 ;;; This is used by the debugger.
508 (def!constant single-value-return-byte-offset 3)
510 ;;; This function is called by debug output routines that want a pretty name
511 ;;; for a TN's location. It returns a thing that can be printed with PRINC.
512 (!def-vm-support-routine location-print-name (tn)
513 (declare (type tn tn))
514 (let* ((sc (tn-sc tn))
515 (sb (sb-name (sc-sb sc)))
516 (offset (tn-offset tn)))
517 (ecase sb
518 (registers
519 (let* ((sc-name (sc-name sc))
520 (name-vec (cond ((member sc-name *byte-sc-names*)
521 *byte-register-names*)
522 ((member sc-name *word-sc-names*)
523 *word-register-names*)
524 ((member sc-name *dword-sc-names*)
525 *dword-register-names*)
526 ((member sc-name *qword-sc-names*)
527 *qword-register-names*))))
528 (or (and name-vec
529 (< -1 offset (length name-vec))
530 (svref name-vec offset))
531 ;; FIXME: Shouldn't this be an ERROR?
532 (format nil "<unknown reg: off=~W, sc=~A>" offset sc-name))))
533 (float-registers (format nil "FLOAT~D" offset))
534 (stack (format nil "S~D" offset))
535 (constant (format nil "Const~D" offset))
536 (immediate-constant "Immed")
537 (noise (symbol-name (sc-name sc))))))
538 ;;; FIXME: Could this, and everything that uses it, be made #!+SB-SHOW?
540 (defun dwords-for-quad (value)
541 (let* ((lo (logand value (1- (ash 1 32))))
542 (hi (ash value -32)))
543 (values lo hi)))
545 (defun words-for-dword (value)
546 (let* ((lo (logand value (1- (ash 1 16))))
547 (hi (ash value -16)))
548 (values lo hi)))
550 (def!constant cfp-offset rbp-offset) ; pfw - needed by stuff in /code
552 (!def-vm-support-routine combination-implementation-style (node)
553 (declare (type sb!c::combination node) (ignore node))
554 (values :default nil))