1 ;;;; target-only stuff from CMU CL's src/compiler/x86/insts.lisp
3 ;;;; i.e. stuff which was in CMU CL's insts.lisp file, but which in
4 ;;;; the SBCL build process can't be compiled into code for the
5 ;;;; cross-compilation host
7 ;;;; This software is part of the SBCL system. See the README file for
10 ;;;; This software is derived from the CMU CL system, which was
11 ;;;; written at Carnegie Mellon University and released into the
12 ;;;; public domain. The software is in the public domain and is
13 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
14 ;;;; files for more information.
18 (defun print-mem-access (value stream print-size-p dstate)
19 (declare (type list value)
21 (type (member t nil) print-size-p)
22 (type sb!disassem:disassem-state dstate))
24 (princ (sb!disassem:dstate-get-prop dstate 'width) stream)
25 (princ '| PTR | stream))
26 (write-char #\[ stream)
27 (let ((firstp t) (rip-p nil))
28 (macrolet ((pel ((var val) &body body)
29 ;; Print an element of the address, maybe with
30 ;; a leading separator.
34 (write-char #\+ stream))
37 (pel (base-reg (first value))
38 (cond ((eql 'rip base-reg)
40 (princ base-reg stream))
42 (print-addr-reg base-reg stream dstate))))
43 (pel (index-reg (third value))
44 (print-addr-reg index-reg stream dstate)
45 (let ((index-scale (fourth value)))
46 (when (and index-scale (not (= index-scale 1)))
47 (write-char #\* stream)
48 (princ index-scale stream))))
49 (let ((offset (second value)))
50 (when (and offset (or firstp (not (zerop offset))))
51 (unless (or firstp (minusp offset))
52 (write-char #\+ stream))
56 (let ((addr (+ offset (sb!disassem:dstate-next-addr dstate))))
58 (sb!disassem::note-code-constant-absolute
60 (sb!disassem:maybe-note-assembler-routine addr
65 (sb!disassem:princ16 offset stream)
68 (sb!disassem::note-code-constant-absolute offset dstate))
69 (sb!disassem:maybe-note-assembler-routine offset
73 (princ offset stream)))))))
74 (write-char #\] stream))