1 ;;;; the instruction set definition for the PPC
3 ;;;; This software is part of the SBCL system. See the README file for
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.
14 ;;; needs a little more work in the assembler, to realise that the
15 ;;; delays requested here are not mandatory, so that the assembler
16 ;;; shouldn't fill gaps with NOPs but with real instructions. -- CSR,
19 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
20 (setf sb
!assem
:*assem-scheduler-p
* t
)
21 (setf sb
!assem
:*assem-max-locations
* 70))
23 ;;;; Constants, types, conversion functions, some disassembler stuff.
25 (defun reg-tn-encoding (tn)
26 (declare (type tn tn
))
31 (if (eq (sb-name (sc-sb (tn-sc tn
))) 'registers
)
33 (error "~S isn't a register." tn
)))))
35 (defun fp-reg-tn-encoding (tn)
36 (declare (type tn tn
))
37 (unless (eq (sb-name (sc-sb (tn-sc tn
))) 'float-registers
)
38 (error "~S isn't a floating-point register." tn
))
41 ;(sb!disassem:set-disassem-params :instruction-alignment 32)
43 (defvar *disassem-use-lisp-reg-names
* t
)
45 (!def-vm-support-routine location-number
(loc)
52 (ecase (sb-name (sc-sb (tn-sc loc
)))
54 ;; Can happen if $ZERO or $NULL are passed in.
57 (unless (zerop (tn-offset loc
))
60 (+ (tn-offset loc
) 32))))
70 (defparameter reg-symbols
73 (cond ((null name
) nil
)
74 (t (make-symbol (concatenate 'string
"$" name
)))))
77 (defun maybe-add-notes (regno dstate
)
78 (let* ((inst (sb!disassem
::sap-ref-int
79 (sb!disassem
::dstate-segment-sap dstate
)
80 (sb!disassem
::dstate-cur-offs dstate
)
82 (sb!disassem
::dstate-byte-order dstate
)))
83 (op (ldb (byte 6 26) inst
)))
87 (when (= regno
(ldb (byte 5 16) inst
)) ; only for the second
88 (case (ldb (byte 5 16) inst
)
91 (sb!disassem
:note-code-constant
(ldb (byte 16 0) inst
) dstate
)))))
94 (when (= regno null-offset
)
95 (sb!disassem
:maybe-note-nil-indexed-object
96 (ldb (byte 16 0) inst
) dstate
))))))
98 (sb!disassem
:define-arg-type reg
100 (lambda (value stream dstate
)
101 (declare (type stream stream
) (fixnum value
))
102 (let ((regname (aref reg-symbols value
)))
103 (princ regname stream
)
104 (sb!disassem
:maybe-note-associated-storage-ref
105 value
'registers regname dstate
)
106 (maybe-add-notes value dstate
))))
108 (defparameter float-reg-symbols
110 (loop for n from
0 to
31 collect
(make-symbol (format nil
"$F~d" n
)))
113 (sb!disassem
:define-arg-type fp-reg
114 :printer
#'(lambda (value stream dstate
)
115 (declare (type stream stream
) (fixnum value
))
116 (let ((regname (aref float-reg-symbols value
)))
117 (princ regname stream
)
118 (sb!disassem
:maybe-note-associated-storage-ref
124 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
125 (defparameter bo-kind-names
126 #(:bo-dnzf
:bo-dnzfp
:bo-dzf
:bo-dzfp
:bo-f
:bo-fp nil nil
127 :bo-dnzt
:bo-dnztp
:bo-dzt
:bo-dztp
:bo-t
:bo-tp nil nil
128 :bo-dnz
:bo-dnzp
:bo-dz
:bo-dzp
:bo-u nil nil nil
129 nil nil nil nil nil nil nil nil
)))
131 (sb!disassem
:define-arg-type bo-field
132 :printer
#'(lambda (value stream dstate
)
133 (declare (ignore dstate
)
136 (princ (svref bo-kind-names value
) stream
)))
138 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
139 (defun valid-bo-encoding (enc)
140 (or (if (integerp enc
)
141 (and (= enc
(logand #x1f enc
))
142 (not (null (svref bo-kind-names enc
)))
144 (and enc
(position enc bo-kind-names
)))
145 (error "Invalid BO field spec: ~s" enc
)))
149 (defparameter cr-bit-names
#(:lt
:gt
:eq
:so
))
150 (defparameter cr-bit-inverse-names
#(:ge
:le
:ne
:ns
))
152 (defparameter cr-field-names
#(:cr0
:cr1
:cr2
:cr3
:cr4
:cr5
:cr6
:cr7
))
154 (defun valid-cr-bit-encoding (enc &optional error-p
)
155 (or (if (integerp enc
)
156 (and (= enc
(logand 3 enc
))
158 (position enc cr-bit-names
)
159 (if error-p
(error "Invalid condition bit specifier : ~s" enc
))))
161 (defun valid-cr-field-encoding (enc)
162 (let* ((field (if (integerp enc
)
163 (and (= enc
(logand #x7 enc
)))
164 (position enc cr-field-names
))))
167 (error "Invalid condition register field specifier : ~s" enc
))))
169 (defun valid-bi-encoding (enc)
173 (and (= enc
(logand 31 enc
)) enc
)
174 (position enc cr-bit-names
))
175 (+ (valid-cr-field-encoding (car enc
))
176 (valid-cr-bit-encoding (cadr enc
))))
177 (error "Invalid BI field spec : ~s" enc
)))
179 (sb!disassem
:define-arg-type bi-field
180 :printer
#'(lambda (value stream dstate
)
181 (declare (ignore dstate
)
183 (type (unsigned-byte 5) value
))
184 (let* ((bitname (svref cr-bit-names
(logand 3 value
)))
185 (crfield (ash value -
2)))
186 (declare (type (unsigned-byte 3) crfield
))
188 (princ bitname stream
)
189 (princ (list (svref cr-field-names crfield
) bitname
) stream
)))))
191 (sb!disassem
:define-arg-type crf
192 :printer
#'(lambda (value stream dstate
)
193 (declare (ignore dstate
)
195 (type (unsigned-byte 3) value
))
196 (princ (svref cr-field-names value
) stream
)))
198 (sb!disassem
:define-arg-type relative-label
200 :use-label
#'(lambda (value dstate
)
201 (declare (type (signed-byte 14) value
)
202 (type sb
!disassem
:disassem-state dstate
))
203 (+ (ash value
2) (sb!disassem
:dstate-cur-addr dstate
))))
205 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
206 (defparameter trap-values-alist
'((:t .
31) (:lt .
16) (:le .
20) (:eq .
4) (:lng .
6)
207 (:ge
.12) (:ne .
24) (:ng .
20) (:llt .
2) (:f .
0)
208 (:lle .
6) (:lge .
5) (:lgt .
1) (:lnl .
5))))
211 (defun valid-tcond-encoding (enc)
212 (or (and (if (integerp enc
) (= (logand 31 enc
) enc
)) enc
)
213 (cdr (assoc enc trap-values-alist
))
214 (error "Unknown trap condition: ~s" enc
)))
216 (sb!disassem
:define-arg-type to-field
218 :printer
#'(lambda (value stream dstate
)
219 (declare (ignore dstate
)
222 (princ (or (car (rassoc value trap-values-alist
))
226 (defun snarf-error-junk (sap offset
&optional length-only
)
227 (let* ((length (sb!sys
:sap-ref-8 sap offset
))
228 (vector (make-array length
:element-type
'(unsigned-byte 8))))
229 (declare (type sb
!sys
:system-area-pointer sap
)
230 (type (unsigned-byte 8) length
)
231 (type (simple-array (unsigned-byte 8) (*)) vector
))
233 (values 0 (1+ length
) nil nil
))
235 (sb!kernel
:copy-ub8-from-system-area sap
(1+ offset
)
237 (collect ((sc-offsets)
239 (lengths 1) ; the length byte
241 (error-number (sb!c
:read-var-integer vector index
)))
244 (when (>= index length
)
246 (let ((old-index index
))
247 (sc-offsets (sb!c
:read-var-integer vector index
))
248 (lengths (- index old-index
))))
254 (defun emit-conditional-branch (segment bo bi target
&optional aa-p lk-p
)
255 (declare (type boolean aa-p lk-p
))
256 (let* ((bo (valid-bo-encoding bo
))
257 (bi (valid-bi-encoding bi
))
258 (aa-bit (if aa-p
1 0))
259 (lk-bit (if lk-p
1 0)))
260 (if aa-p
; Not bloody likely, bwth.
261 (emit-b-form-inst segment
16 bo bi target aa-bit lk-bit
)
262 ;; the target may be >32k away, in which case we have to invert the
263 ;; test and do an absolute branch
265 ;; We emit either 4 or 8 bytes, so I think we declare this as
266 ;; preserving 4 byte alignment. If this gives us no joy, we can
267 ;; stick a nop in the long branch and then we will be
268 ;; preserving 8 byte alignment
269 segment
8 2 ; 2^2 is 4 byte alignment. I think
270 #'(lambda (segment posn magic-value
)
271 (let ((delta (ash (- (label-position target posn magic-value
) posn
)
273 (when (typep delta
'(signed-byte 14))
274 (emit-back-patch segment
4
275 #'(lambda (segment posn
)
278 (ash (- (label-position target
) posn
) -
2)
281 #'(lambda (segment posn
)
282 (declare (ignore posn
))
283 (let ((bo (logxor 8 bo
))) ;; invert the test
284 (emit-b-form-inst segment
16 bo bi
285 2 ; skip over next instruction
287 (emit-back-patch segment
4
288 #'(lambda (segment posn
)
289 (declare (ignore posn
))
290 (emit-i-form-branch segment target lk-p
)))))
295 ; non-absolute I-form: B, BL.
296 (defun emit-i-form-branch (segment target
&optional lk-p
)
297 (let* ((lk-bit (if lk-p
1 0)))
300 (note-fixup segment
:b target
)
301 (emit-i-form-inst segment
18 0 0 lk-bit
))
303 (emit-back-patch segment
4
304 #'(lambda (segment posn
)
308 (ash (- (label-position target
) posn
) -
2)
312 (eval-when (:compile-toplevel
:execute
:load-toplevel
)
313 (defparameter *spr-numbers-alist
* '((:xer
1) (:lr
8) (:ctr
9))))
315 (sb!disassem
:define-arg-type spr
316 :printer
#'(lambda (value stream dstate
)
317 (declare (ignore dstate
)
318 (type (unsigned-byte 10) value
))
319 (let* ((name (car (rassoc value
*spr-numbers-alist
*))))
322 (princ value stream
)))))
324 (eval-when (:compile-toplevel
:load-toplevel
:execute
)
325 (defparameter jump-printer
326 #'(lambda (value stream dstate
)
327 (let ((addr (ash value
2)))
328 (sb!disassem
:maybe-note-assembler-routine addr t dstate
)
329 (write addr
:base
16 :radix t
:stream stream
)))))
333 ;;;; dissassem:define-instruction-formats
335 (eval-when (:compile-toplevel
:execute
)
336 (defmacro ppc-byte
(startbit &optional
(endbit startbit
))
337 (unless (and (typep startbit
'(unsigned-byte 32))
338 (typep endbit
'(unsigned-byte 32))
339 (>= endbit startbit
))
341 ``(byte ,(1+ ,(- endbit startbit
)) ,(- 31 ,endbit
)))
343 (defparameter *ppc-field-specs-alist
*
344 `((aa :field
,(ppc-byte 30))
345 (ba :field
,(ppc-byte 11 15) :type
'bi-field
)
346 (bb :field
,(ppc-byte 16 20) :type
'bi-field
)
347 (bd :field
,(ppc-byte 16 29) :type
'relative-label
)
348 (bf :field
,(ppc-byte 6 8) :type
'crf
)
349 (bfa :field
,(ppc-byte 11 13) :type
'crf
)
350 (bi :field
,(ppc-byte 11 15) :type
'bi-field
)
351 (bo :field
,(ppc-byte 6 10) :type
'bo-field
)
352 (bt :field
,(ppc-byte 6 10) :type
'bi-field
)
353 (d :field
,(ppc-byte 16 31) :sign-extend t
)
354 (flm :field
,(ppc-byte 7 14) :sign-extend nil
)
355 (fra :field
,(ppc-byte 11 15) :type
'fp-reg
)
356 (frb :field
,(ppc-byte 16 20) :type
'fp-reg
)
357 (frc :field
,(ppc-byte 21 25) :type
'fp-reg
)
358 (frs :field
,(ppc-byte 6 10) :type
'fp-reg
)
359 (frt :field
,(ppc-byte 6 10) :type
'fp-reg
)
360 (fxm :field
,(ppc-byte 12 19) :sign-extend nil
)
361 (l :field
,(ppc-byte 10) :sign-extend nil
)
362 (li :field
,(ppc-byte 6 29) :sign-extend t
:type
'relative-label
)
363 (li-abs :field
,(ppc-byte 6 29) :sign-extend t
:printer jump-printer
)
364 (lk :field
,(ppc-byte 31))
365 (mb :field
,(ppc-byte 21 25) :sign-extend nil
)
366 (me :field
,(ppc-byte 26 30) :sign-extend nil
)
367 (nb :field
,(ppc-byte 16 20) :sign-extend nil
)
368 (oe :field
,(ppc-byte 21))
369 (ra :field
,(ppc-byte 11 15) :type
'reg
)
370 (rb :field
,(ppc-byte 16 20) :type
'reg
)
371 (rc :field
,(ppc-byte 31))
372 (rs :field
,(ppc-byte 6 10) :type
'reg
)
373 (rt :field
,(ppc-byte 6 10) :type
'reg
)
374 (sh :field
,(ppc-byte 16 20) :sign-extend nil
)
375 (si :field
,(ppc-byte 16 31) :sign-extend t
)
376 (spr :field
,(ppc-byte 11 20) :type
'spr
)
377 (to :field
,(ppc-byte 6 10) :type
'to-field
)
378 (u :field
,(ppc-byte 16 19) :sign-extend nil
)
379 (ui :field
,(ppc-byte 16 31) :sign-extend nil
)
380 (xo21-30 :field
,(ppc-byte 21 30) :sign-extend nil
)
381 (xo22-30 :field
,(ppc-byte 22 30) :sign-extend nil
)
382 (xo26-30 :field
,(ppc-byte 26 30) :sign-extend nil
)))
386 (sb!disassem
:define-instruction-format
(instr 32)
387 (op :field
(byte 6 26))
388 (other :field
(byte 26 0)))
390 (sb!disassem
:define-instruction-format
(xinstr 32 :default-printer
'(:name
:tab data
))
391 (op-to-a :field
(byte 16 16))
392 (data :field
(byte 16 0)))
394 (sb!disassem
:define-instruction-format
(sc 32 :default-printer
'(:name
:tab rest
))
395 (op :field
(byte 6 26))
396 (rest :field
(byte 26 0) :value
2))
400 (macrolet ((def-ppc-iformat ((name &optional default-printer
) &rest specs
)
401 (flet ((specname-field (specname)
402 (or (assoc specname
*ppc-field-specs-alist
*)
403 (error "Unknown ppc instruction field spec ~s" specname
))))
404 (labels ((spec-field (spec)
406 (specname-field spec
)
408 (cdr (specname-field (cadr spec
)))))))
409 (collect ((field (list '(op :field
(byte 6 26)))))
411 (field (spec-field spec
)))
412 `(sb!disassem
:define-instruction-format
(,name
32 ,@(if default-printer
`(:default-printer
,default-printer
)))
415 (def-ppc-iformat (i '(:name
:tab li
))
418 (def-ppc-iformat (i-abs '(:name
:tab li-abs
))
421 (def-ppc-iformat (b '(:name
:tab bo
"," bi
"," bd
))
424 (def-ppc-iformat (d '(:name
:tab rt
"," d
"(" ra
")"))
427 (def-ppc-iformat (d-si '(:name
:tab rt
"," ra
"," si
))
430 (def-ppc-iformat (d-rs '(:name
:tab rs
"," d
"(" ra
")"))
433 (def-ppc-iformat (d-rs-ui '(:name
:tab ra
"," rs
"," ui
))
436 (def-ppc-iformat (d-crf-si)
439 (def-ppc-iformat (d-crf-ui)
442 (def-ppc-iformat (d-to '(:name
:tab to
"," ra
"," si
))
445 (def-ppc-iformat (d-frt '(:name
:tab frt
"," d
"(" ra
")"))
448 (def-ppc-iformat (d-frs '(:name
:tab frs
"," d
"(" ra
")"))
453 ;;; There are around ... oh, 28 or so ... variants on the "X" format.
454 ;;; Some of them are only used by one instruction; some are used by dozens.
455 ;;; Some aren't used by instructions that we generate ...
457 (def-ppc-iformat (x '(:name
:tab rt
"," ra
"," rb
))
458 rt ra rb
(xo xo21-30
))
460 (def-ppc-iformat (x-1 '(:name
:tab rt
"," ra
"," nb
))
461 rt ra nb
(xo xo21-30
))
463 (def-ppc-iformat (x-4 '(:name
:tab rt
))
466 (def-ppc-iformat (x-5 '(:name
:tab ra
"," rs
"," rb
))
467 rs ra rb
(xo xo21-30
) rc
)
469 (def-ppc-iformat (x-7 '(:name
:tab ra
"," rs
"," rb
))
470 rs ra rb
(xo xo21-30
))
472 (def-ppc-iformat (x-8 '(:name
:tab ra
"," rs
"," nb
))
473 rs ra nb
(xo xo21-30
))
475 (def-ppc-iformat (x-9 '(:name
:tab ra
"," rs
"," sh
))
476 rs ra sh
(xo xo21-30
) rc
)
478 (def-ppc-iformat (x-10 '(:name
:tab ra
"," rs
))
479 rs ra
(xo xo21-30
) rc
)
481 (def-ppc-iformat (x-14 '(:name
:tab bf
"," l
"," ra
"," rb
))
482 bf l ra rb
(xo xo21-30
))
484 (def-ppc-iformat (x-15 '(:name
:tab bf
"," l
"," fra
"," frb
))
485 bf l fra frb
(xo xo21-30
))
487 (def-ppc-iformat (x-18 '(:name
:tab bf
))
490 (def-ppc-iformat (x-19 '(:name
:tab to
"," ra
"," rb
))
491 to ra rb
(xo xo21-30
))
493 (def-ppc-iformat (x-20 '(:name
:tab frt
"," ra
"," rb
))
494 frt ra rb
(xo xo21-30
))
496 (def-ppc-iformat (x-21 '(:name
:tab frt
"," rb
))
497 frt rb
(xo xo21-30
) rc
)
499 (def-ppc-iformat (x-22 '(:name
:tab frt
))
502 (def-ppc-iformat (x-23 '(:name
:tab ra
"," frs
"," rb
))
503 frs ra rb
(xo xo21-30
))
505 (def-ppc-iformat (x-24 '(:name
:tab bt
))
508 (def-ppc-iformat (x-25 '(:name
:tab ra
"," rb
))
511 (def-ppc-iformat (x-26 '(:name
:tab rb
))
514 (def-ppc-iformat (x-27 '(:name
))
520 (def-ppc-iformat (xl '(:name
:tab bt
"," ba
"," bb
))
521 bt ba bb
(xo xo21-30
))
523 (def-ppc-iformat (xl-bo-bi '(:name
:tab bo
"," bi
))
524 bo bi
(xo xo21-30
) lk
)
526 (def-ppc-iformat (xl-cr '(:name
:tab bf
"," bfa
))
529 (def-ppc-iformat (xl-xo '(:name
))
535 (def-ppc-iformat (xfx)
538 (def-ppc-iformat (xfx-fxm '(:name
:tab fxm
"," rs
))
541 (def-ppc-iformat (xfl '(:name
:tab flm
"," frb
))
542 flm frb
(xo xo21-30
) rc
)
547 (def-ppc-iformat (xo '(:name
:tab rt
"," ra
"," rb
))
548 rt ra rb oe
(xo xo22-30
) rc
)
550 (def-ppc-iformat (xo-oe '(:name
:tab rt
"," ra
"," rb
))
551 rt ra rb
(xo xo22-30
) rc
)
553 (def-ppc-iformat (xo-a '(:name
:tab rt
"," ra
))
554 rt ra oe
(xo xo22-30
) rc
)
559 (def-ppc-iformat (a '(:name
:tab frt
"," fra
"," frb
"," frc
))
560 frt fra frb frc
(xo xo26-30
) rc
)
562 (def-ppc-iformat (a-tab '(:name
:tab frt
"," fra
"," frb
))
563 frt fra frb
(xo xo26-30
) rc
)
565 (def-ppc-iformat (a-tac '(:name
:tab frt
"," fra
"," frc
))
566 frt fra frc
(xo xo26-30
) rc
)
568 (def-ppc-iformat (a-tbc '(:name
:tab frt
"," frb
"," frc
))
569 frt frb frc
(xo xo26-30
) rc
)
572 (def-ppc-iformat (m '(:name
:tab ra
"," rs
"," rb
"," mb
"," me
))
575 (def-ppc-iformat (m-sh '(:name
:tab ra
"," rs
"," sh
"," mb
"," me
))
581 ;;;; Primitive emitters.
584 (define-bitfield-emitter emit-word
32
587 (define-bitfield-emitter emit-short
16
590 (define-bitfield-emitter emit-i-form-inst
32
591 (byte 6 26) (byte 24 2) (byte 1 1) (byte 1 0))
593 (define-bitfield-emitter emit-b-form-inst
32
594 (byte 6 26) (byte 5 21) (byte 5 16) (byte 14 2) (byte 1 1) (byte 1 0))
596 (define-bitfield-emitter emit-sc-form-inst
32
597 (byte 6 26) (byte 26 0))
599 (define-bitfield-emitter emit-d-form-inst
32
600 (byte 6 26) (byte 5 21) (byte 5 16) (byte 16 0))
602 ; Also used for XL-form. What's the difference ?
603 (define-bitfield-emitter emit-x-form-inst
32
604 (byte 6 26) (byte 5 21) (byte 5 16) (byte 5 11) (byte 10 1) (byte 1 0))
606 (define-bitfield-emitter emit-xfx-form-inst
32
607 (byte 6 26) (byte 5 21) (byte 10 11) (byte 10 1) (byte 1 0))
609 (define-bitfield-emitter emit-xfl-form-inst
32
610 (byte 6 26) (byte 10 16) (byte 5 11) (byte 10 1) (byte 1 0))
613 (define-bitfield-emitter emit-xo-form-inst
32
614 (byte 6 26) (byte 5 21) (byte 5 16) (byte 5 11) (byte 1 10) (byte 9 1) (byte 1 0))
616 (define-bitfield-emitter emit-a-form-inst
32
617 (byte 6 26) (byte 5 21) (byte 5 16) (byte 5 11) (byte 5 6) (byte 5 1) (byte 1 0))
622 (defun unimp-control (chunk inst stream dstate
)
623 (declare (ignore inst
))
624 (flet ((nt (x) (if stream
(sb!disassem
:note x dstate
))))
625 (case (xinstr-data chunk dstate
)
628 (sb!disassem
:handle-break-args
#'snarf-error-junk stream dstate
))
631 (sb!disassem
:handle-break-args
#'snarf-error-junk stream dstate
))
632 (#.object-not-list-trap
633 (nt "Object not list trap"))
635 (nt "Breakpoint trap"))
636 (#.pending-interrupt-trap
637 (nt "Pending interrupt trap"))
640 (#.fun-end-breakpoint-trap
641 (nt "Function end breakpoint trap"))
642 (#.object-not-instance-trap
643 (nt "Object not instance trap")))))
645 (eval-when (:compile-toplevel
:execute
)
647 (defun classify-dependencies (deplist)
648 (collect ((reads) (writes))
649 (dolist (dep deplist
)
652 (writes (writes dep
))))
653 (values (reads) (writes)))))
655 (macrolet ((define-xo-instruction
656 (name op xo oe-p rc-p always-reads-xer always-writes-xer cost
)
657 `(define-instruction ,name
(segment rt ra rb
)
658 (:printer xo
((op ,op
) (xo ,xo
) (oe ,(if oe-p
1 0)) (rc ,(if rc-p
1 0))))
659 (:dependencies
(reads ra
) (reads rb
) ,@(if always-reads-xer
'((reads :xer
)))
660 (writes rt
) ,@(if rc-p
'((writes :ccr
))) ,@(if (or oe-p always-writes-xer
) '((writes :xer
))) )
664 (emit-xo-form-inst segment
,op
671 (define-xo-oe-instruction
672 (name op xo rc-p always-reads-xer always-writes-xer cost
)
673 `(define-instruction ,name
(segment rt ra rb
)
674 (:printer xo-oe
((op ,op
) (xo ,xo
) (rc ,(if rc-p
1 0))))
675 (:dependencies
(reads ra
) (reads rb
) ,@(if always-reads-xer
'((reads :xer
)))
676 (writes rt
) ,@(if rc-p
'((writes :ccr
))) ,@(if always-writes-xer
'((writes :xer
))))
680 (emit-xo-form-inst segment
,op
687 (define-4-xo-instructions
688 (base op xo
&key always-reads-xer always-writes-xer
(cost 1))
690 (define-xo-instruction ,base
,op
,xo nil nil
,always-reads-xer
,always-writes-xer
,cost
)
691 (define-xo-instruction ,(symbolicate base
".") ,op
,xo nil t
,always-reads-xer
,always-writes-xer
,cost
)
692 (define-xo-instruction ,(symbolicate base
"O") ,op
,xo t nil
,always-reads-xer
,always-writes-xer
,cost
)
693 (define-xo-instruction ,(symbolicate base
"O.") ,op
,xo t t
,always-reads-xer
,always-writes-xer
,cost
)))
695 (define-2-xo-oe-instructions (base op xo
&key always-reads-xer always-writes-xer
(cost 1))
697 (define-xo-oe-instruction ,base
,op
,xo nil
,always-reads-xer
,always-writes-xer
,cost
)
698 (define-xo-oe-instruction ,(symbolicate base
".") ,op
,xo t
,always-reads-xer
,always-writes-xer
,cost
)))
700 (define-xo-a-instruction (name op xo oe-p rc-p always-reads-xer always-writes-xer cost
)
701 `(define-instruction ,name
(segment rt ra
)
702 (:printer xo-a
((op ,op
) (xo ,xo
) (rc ,(if rc-p
1 0)) (oe ,(if oe-p
1 0))))
703 (:dependencies
(reads ra
) ,@(if always-reads-xer
'((reads :xer
)))
704 (writes rt
) ,@(if rc-p
'((writes :ccr
))) ,@(if always-writes-xer
'((writes :xer
))) )
708 (emit-xo-form-inst segment
,op
716 (define-4-xo-a-instructions (base op xo
&key always-reads-xer always-writes-xer
(cost 1))
718 (define-xo-a-instruction ,base
,op
,xo nil nil
,always-reads-xer
,always-writes-xer
,cost
)
719 (define-xo-a-instruction ,(symbolicate base
".") ,op
,xo nil t
,always-reads-xer
,always-writes-xer
,cost
)
720 (define-xo-a-instruction ,(symbolicate base
"O") ,op
,xo t nil
,always-reads-xer
,always-writes-xer
,cost
)
721 (define-xo-a-instruction ,(symbolicate base
"O.") ,op
,xo t t
,always-reads-xer
,always-writes-xer
,cost
)))
723 (define-x-instruction (name op xo
&key
(cost 2) other-dependencies
)
724 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
725 `(define-instruction ,name
(segment rt ra rb
)
726 (:printer x
((op ,op
) (xo ,xo
)))
729 (:dependencies
(reads ra
) (reads rb
) (reads :memory
) ,@other-reads
730 (writes rt
) ,@other-writes
)
732 (emit-x-form-inst segment
,op
739 (define-x-20-instruction (name op xo
&key
(cost 2) other-dependencies
)
740 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
741 `(define-instruction ,name
(segment frt ra rb
)
742 (:printer x-20
((op ,op
) (xo ,xo
)))
745 (:dependencies
(reads ra
) (reads rb
) ,@other-reads
746 (writes frt
) ,@other-writes
)
748 (emit-x-form-inst segment
,op
749 (fp-reg-tn-encoding frt
)
755 (define-x-5-instruction (name op xo rc-p
&key
(cost 1) other-dependencies
)
756 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
757 `(define-instruction ,name
(segment ra rs rb
)
758 (:printer x-5
((op ,op
) (xo ,xo
) (rc ,(if rc-p
1 0))))
761 (:dependencies
(reads rb
) (reads rs
) ,@other-reads
762 (writes ra
) ,@other-writes
)
764 (emit-x-form-inst segment
,op
772 (define-x-5-st-instruction (name op xo rc-p
&key
(cost 1) other-dependencies
)
773 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
774 `(define-instruction ,name
(segment rs ra rb
)
775 (:printer x-5
((op ,op
) (xo ,xo
) (rc ,(if rc-p
1 0))))
778 (:dependencies
(reads ra
) (reads rb
) (reads rs
) ,@other-reads
779 (writes :memory
:partially t
) ,@other-writes
)
781 (emit-x-form-inst segment
,op
788 (define-x-23-st-instruction (name op xo
&key
(cost 1) other-dependencies
)
789 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
790 `(define-instruction ,name
(segment frs ra rb
)
791 (:printer x-23
((op ,op
) (xo ,xo
)))
794 (:dependencies
(reads ra
) (reads rb
) (reads frs
) ,@other-reads
795 (writes :memory
:partially t
) ,@other-writes
)
797 (emit-x-form-inst segment
,op
798 (fp-reg-tn-encoding frs
)
804 (define-x-10-instruction (name op xo rc-p
&key
(cost 1) other-dependencies
)
805 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
806 `(define-instruction ,name
(segment ra rs
)
807 (:printer x-10
((op ,op
) (xo ,xo
) (rc ,(if rc-p
1 0))))
810 (:dependencies
(reads rs
) ,@other-reads
811 (writes ra
) ,@other-writes
)
813 (emit-x-form-inst segment
,op
820 (define-2-x-5-instructions (name op xo
&key
(cost 1) other-dependencies
)
822 (define-x-5-instruction ,name
,op
,xo nil
:cost
,cost
:other-dependencies
,other-dependencies
)
823 (define-x-5-instruction ,(symbolicate name
".") ,op
,xo t
:cost
,cost
824 :other-dependencies
,other-dependencies
)))
826 (define-2-x-10-instructions (name op xo
&key
(cost 1) other-dependencies
)
828 (define-x-10-instruction ,name
,op
,xo nil
:cost
,cost
:other-dependencies
,other-dependencies
)
829 (define-x-10-instruction ,(symbolicate name
".") ,op
,xo t
:cost
,cost
830 :other-dependencies
,other-dependencies
)))
833 (define-x-21-instruction (name op xo rc-p
&key
(cost 4) other-dependencies
)
834 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
835 `(define-instruction ,name
(segment frt frb
)
836 (:printer x-21
((op ,op
) (xo ,xo
) (rc ,(if rc-p
1 0))))
839 (:dependencies
(reads frb
) ,@other-reads
840 (writes frt
) ,@other-writes
)
842 (emit-x-form-inst segment
,op
843 (fp-reg-tn-encoding frt
)
845 (fp-reg-tn-encoding frb
)
849 (define-2-x-21-instructions (name op xo
&key
(cost 4) other-dependencies
)
851 (define-x-21-instruction ,name
,op
,xo nil
:cost
,cost
:other-dependencies
,other-dependencies
)
852 (define-x-21-instruction ,(symbolicate name
".") ,op
,xo t
:cost
,cost
853 :other-dependencies
,other-dependencies
)))
856 (define-d-si-instruction (name op
&key
(fixup nil
) (cost 1) other-dependencies
)
857 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
858 `(define-instruction ,name
(segment rt ra si
)
859 (:declare
(type (or ,@(when fixup
'(fixup))
860 (unsigned-byte 16) (signed-byte 16))
862 (:printer d-si
((op ,op
)))
865 (:dependencies
(reads ra
) ,@other-reads
866 (writes rt
) ,@other-writes
)
868 (when (typep si
'fixup
)
870 ((:ha
:l
) (note-fixup segment
,fixup si
)))
871 (setq si
(or (fixup-offset si
) 0)))
872 (emit-d-form-inst segment
,op
(reg-tn-encoding rt
) (reg-tn-encoding ra
) si
)))))
874 (define-d-rs-ui-instruction (name op
&key
(cost 1) other-dependencies
)
875 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
876 `(define-instruction ,name
(segment ra rs ui
)
877 (:declare
(type (unsigned-byte 16) ui
))
878 (:printer d-rs-ui
((op ,op
)))
881 (:dependencies
(reads rs
) ,@other-reads
882 (writes ra
) ,@other-writes
)
884 (emit-d-form-inst segment
,op
(reg-tn-encoding rs
) (reg-tn-encoding ra
) ui
)))))
886 (define-d-instruction (name op
&key
(cost 2) other-dependencies pinned
)
887 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
888 `(define-instruction ,name
(segment rt ra si
)
889 (:declare
(type (signed-byte 16) si
))
890 (:printer d
((op ,op
)))
893 ,@(when pinned
'(:pinned
))
894 (:dependencies
(reads ra
) (reads :memory
) ,@other-reads
895 (writes rt
) ,@other-writes
)
897 (emit-d-form-inst segment
,op
(reg-tn-encoding rt
) (reg-tn-encoding ra
) si
)))))
899 (define-d-frt-instruction (name op
&key
(cost 3) other-dependencies
)
900 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
901 `(define-instruction ,name
(segment frt ra si
)
902 (:declare
(type (signed-byte 16) si
))
903 (:printer d-frt
((op ,op
)))
906 (:dependencies
(reads ra
) (reads :memory
) ,@other-reads
907 (writes frt
) ,@other-writes
)
909 (emit-d-form-inst segment
,op
(fp-reg-tn-encoding frt
) (reg-tn-encoding ra
) si
)))))
911 (define-d-rs-instruction (name op
&key
(cost 1) other-dependencies pinned
)
912 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
913 `(define-instruction ,name
(segment rs ra si
)
914 (:declare
(type (signed-byte 16) si
))
915 (:printer d-rs
((op ,op
)))
918 ,@(when pinned
'(:pinned
))
919 (:dependencies
(reads rs
) (reads ra
) ,@other-reads
920 (writes :memory
:partially t
) ,@other-writes
)
922 (emit-d-form-inst segment
,op
(reg-tn-encoding rs
) (reg-tn-encoding ra
) si
)))))
924 (define-d-frs-instruction (name op
&key
(cost 1) other-dependencies
)
925 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
926 `(define-instruction ,name
(segment frs ra si
)
927 (:declare
(type (signed-byte 16) si
))
928 (:printer d-frs
((op ,op
)))
931 (:dependencies
(reads frs
) (reads ra
) ,@other-reads
932 (writes :memory
:partially t
) ,@other-writes
)
934 (emit-d-form-inst segment
,op
(fp-reg-tn-encoding frs
) (reg-tn-encoding ra
) si
)))))
936 (define-a-instruction (name op xo rc
&key
(cost 1) other-dependencies
)
937 `(define-instruction ,name
(segment frt fra frb frc
)
938 (:printer a
((op ,op
) (xo ,xo
) (rc ,rc
)))
941 (:dependencies
(writes frt
) (reads fra
) (reads frb
) (reads frc
) ,@other-dependencies
)
943 (emit-a-form-inst segment
945 (fp-reg-tn-encoding frt
)
946 (fp-reg-tn-encoding fra
)
947 (fp-reg-tn-encoding frb
)
948 (fp-reg-tn-encoding frb
)
952 (define-2-a-instructions (name op xo
&key
(cost 1) other-dependencies
)
954 (define-a-instruction ,name
,op
,xo
0 :cost
,cost
:other-dependencies
,other-dependencies
)
955 (define-a-instruction ,(symbolicate name
".")
956 ,op
,xo
1 :cost
,cost
:other-dependencies
,other-dependencies
)))
958 (define-a-tab-instruction (name op xo rc
&key
(cost 1) other-dependencies
)
959 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
960 `(define-instruction ,name
(segment frt fra frb
)
961 (:printer a-tab
((op ,op
) (xo ,xo
) (rc ,rc
)))
964 (:dependencies
(reads fra
) (reads frb
) ,@other-reads
965 (writes frt
) ,@other-writes
)
967 (emit-a-form-inst segment
969 (fp-reg-tn-encoding frt
)
970 (fp-reg-tn-encoding fra
)
971 (fp-reg-tn-encoding frb
)
976 (define-2-a-tab-instructions (name op xo
&key
(cost 1) other-dependencies
)
978 (define-a-tab-instruction ,name
,op
,xo
0 :cost
,cost
:other-dependencies
,other-dependencies
)
979 (define-a-tab-instruction ,(symbolicate name
".")
980 ,op
,xo
1 :cost
,cost
:other-dependencies
,other-dependencies
)))
982 (define-a-tac-instruction (name op xo rc
&key
(cost 1) other-dependencies
)
983 (multiple-value-bind (other-reads other-writes
) (classify-dependencies other-dependencies
)
984 `(define-instruction ,name
(segment frt fra frb
)
985 (:printer a-tac
((op ,op
) (xo ,xo
) (rc ,rc
)))
988 (:dependencies
(reads fra
) (reads frb
) ,@other-reads
989 (writes frt
) ,@other-writes
)
991 (emit-a-form-inst segment
993 (fp-reg-tn-encoding frt
)
994 (fp-reg-tn-encoding fra
)
996 (fp-reg-tn-encoding frb
)
1000 (define-2-a-tac-instructions (name op xo
&key
(cost 1) other-dependencies
)
1002 (define-a-tac-instruction ,name
,op
,xo
0 :cost
,cost
:other-dependencies
,other-dependencies
)
1003 (define-a-tac-instruction ,(symbolicate name
".")
1004 ,op
,xo
1 :cost
,cost
:other-dependencies
,other-dependencies
)))
1006 (define-crbit-instruction (name op xo
)
1007 `(define-instruction ,name
(segment dbit abit bbit
)
1008 (:printer xl
((op ,op
) (xo ,xo
)))
1011 (:dependencies
(reads :ccr
) (writes :ccr
))
1012 (:emitter
(emit-x-form-inst segment
19
1013 (valid-bi-encoding dbit
)
1014 (valid-bi-encoding abit
)
1015 (valid-bi-encoding bbit
)
1019 ;;; The instructions, in numerical order
1021 (define-instruction unimp
(segment data
)
1022 (:declare
(type (signed-byte 16) data
))
1023 (:printer xinstr
((op-to-a #.
(logior (ash 3 10) (ash 6 5) 0)))
1024 :default
:control
#'unimp-control
)
1027 (:emitter
(emit-d-form-inst segment
3 6 0 data
)))
1029 (define-instruction twi
(segment tcond ra si
)
1030 (:printer d-to
((op 3)))
1033 (:emitter
(emit-d-form-inst segment
3 (valid-tcond-encoding tcond
) (reg-tn-encoding ra
) si
)))
1035 (define-d-si-instruction mulli
7 :cost
5)
1036 (define-d-si-instruction subfic
8)
1038 (define-instruction cmplwi
(segment crf ra
&optional
(ui nil ui-p
))
1039 (:printer d-crf-ui
((op 10) (l 0)) '(:name
:tab bf
"," ra
"," ui
))
1040 (:dependencies
(if ui-p
(reads ra
) (reads crf
)) (writes :ccr
))
1044 (setq ui ra ra crf crf
:cr0
))
1045 (emit-d-form-inst segment
1047 (valid-cr-field-encoding crf
)
1048 (reg-tn-encoding ra
)
1051 (define-instruction cmpwi
(segment crf ra
&optional
(si nil si-p
))
1052 (:printer d-crf-si
((op 11) (l 0)) '(:name
:tab bf
"," ra
"," si
))
1053 (:dependencies
(if si-p
(reads ra
) (reads crf
)) (writes :ccr
))
1057 (setq si ra ra crf crf
:cr0
))
1058 (emit-d-form-inst segment
1060 (valid-cr-field-encoding crf
)
1061 (reg-tn-encoding ra
)
1064 (define-d-si-instruction addic
12 :other-dependencies
((writes :xer
)))
1065 (define-d-si-instruction addic.
13 :other-dependencies
((writes :xer
) (writes :ccr
)))
1067 (define-d-si-instruction addi
14 :fixup
:l
)
1068 (define-d-si-instruction addis
15 :fixup
:ha
)
1070 ;; There's no real support here for branch options that decrement
1071 ;; and test the CTR :
1072 ;; (a) the instruction scheduler doesn't know that anything's happening
1074 ;; (b) Lisp may have to assume that the CTR always has a lisp
1075 ;; object/locative in it.
1077 (define-instruction bc
(segment bo bi target
)
1078 (:declare
(type label target
))
1079 (:printer b
((op 16) (aa 0) (lk 0)))
1080 (:attributes branch
)
1082 (:dependencies
(reads :ccr
))
1084 (emit-conditional-branch segment bo bi target
)))
1086 (define-instruction bcl
(segment bo bi target
)
1087 (:declare
(type label target
))
1088 (:printer b
((op 16) (aa 0) (lk 1)))
1089 (:attributes branch
)
1091 (:dependencies
(reads :ccr
))
1093 (emit-conditional-branch segment bo bi target nil t
)))
1095 (define-instruction bca
(segment bo bi target
)
1096 (:declare
(type label target
))
1097 (:printer b
((op 16) (aa 1) (lk 0)))
1098 (:attributes branch
)
1100 (:dependencies
(reads :ccr
))
1102 (emit-conditional-branch segment bo bi target t
)))
1104 (define-instruction bcla
(segment bo bi target
)
1105 (:declare
(type label target
))
1106 (:printer b
((op 16) (aa 1) (lk 1)))
1107 (:attributes branch
)
1109 (:dependencies
(reads :ccr
))
1111 (emit-conditional-branch segment bo bi target t t
)))
1113 ;;; There may (or may not) be a good reason to use this in preference
1114 ;;; to "b[la] target". I can't think of a -bad- reason ...
1116 (define-instruction bu
(segment target
)
1117 (:declare
(type label target
))
1118 (:printer b
((op 16) (bo #.
(valid-bo-encoding :bo-u
)) (bi 0) (aa 0) (lk 0))
1120 (:attributes branch
)
1123 (emit-conditional-branch segment
#.
(valid-bo-encoding :bo-u
) 0 target nil nil
)))
1126 (define-instruction bt
(segment bi target
)
1127 (:printer b
((op 16) (bo #.
(valid-bo-encoding :bo-t
)) (aa 0) (lk 0))
1128 '(:name
:tab bi
"," bd
))
1129 (:attributes branch
)
1132 (emit-conditional-branch segment
#.
(valid-bo-encoding :bo-t
) bi target nil nil
)))
1134 (define-instruction bf
(segment bi target
)
1135 (:printer b
((op 16) (bo #.
(valid-bo-encoding :bo-f
)) (aa 0) (lk 0))
1136 '(:name
:tab bi
"," bd
))
1137 (:attributes branch
)
1140 (emit-conditional-branch segment
#.
(valid-bo-encoding :bo-f
) bi target nil nil
)))
1142 (define-instruction b?
(segment cr-field-name cr-name
&optional
(target nil target-p
))
1143 (:attributes branch
)
1147 (setq target cr-name cr-name cr-field-name cr-field-name
:cr0
))
1148 (let* ((+cond
(position cr-name cr-bit-names
))
1149 (-cond (position cr-name cr-bit-inverse-names
))
1153 (error "Unknown branch condition ~s" cr-name
))))
1154 (cr-form (list cr-field-name
(if +cond cr-name
(svref cr-bit-names -cond
)))))
1155 (emit-conditional-branch segment b0 cr-form target
))))
1157 (define-instruction sc
(segment)
1158 (:printer sc
((op 17)))
1159 (:attributes branch
)
1162 (:emitter
(emit-sc-form-inst segment
17 2)))
1164 (define-instruction b
(segment target
)
1165 (:printer i
((op 18) (aa 0) (lk 0)))
1166 (:attributes branch
)
1169 (emit-i-form-branch segment target nil
)))
1171 (define-instruction ba
(segment target
)
1172 (:printer i-abs
((op 18) (aa 1) (lk 0)))
1173 (:attributes branch
)
1176 (when (typep target
'fixup
)
1177 (note-fixup segment
:ba target
)
1179 (emit-i-form-inst segment
18 (ash target -
2) 1 0)))
1182 (define-instruction bl
(segment target
)
1183 (:printer i
((op 18) (aa 0) (lk 1)))
1184 (:attributes branch
)
1187 (emit-i-form-branch segment target t
)))
1189 (define-instruction bla
(segment target
)
1190 (:printer i-abs
((op 18) (aa 1) (lk 1)))
1191 (:attributes branch
)
1194 (when (typep target
'fixup
)
1195 (note-fixup segment
:ba target
)
1197 (emit-i-form-inst segment
18 (ash target -
2) 1 1)))
1199 (define-instruction blr
(segment)
1200 (:printer xl-bo-bi
((op 19) (xo 16) (bo #.
(valid-bo-encoding :bo-u
))(bi 0) (lk 0)) '(:name
))
1201 (:attributes branch
)
1203 (:dependencies
(reads :ccr
) (reads :ctr
))
1205 (emit-x-form-inst segment
19 (valid-bo-encoding :bo-u
) 0 0 16 0)))
1207 (define-instruction bclr
(segment bo bi
)
1208 (:printer xl-bo-bi
((op 19) (xo 16)))
1209 (:attributes branch
)
1211 (:dependencies
(reads :ccr
) (reads :lr
))
1213 (emit-x-form-inst segment
19 (valid-bo-encoding bo
) (valid-bi-encoding bi
) 0 16 0)))
1215 (define-instruction bclrl
(segment bo bi
)
1216 (:printer xl-bo-bi
((op 19) (xo 16) (lk 1)))
1217 (:attributes branch
)
1219 (:dependencies
(reads :ccr
) (reads :lr
))
1221 (emit-x-form-inst segment
19 (valid-bo-encoding bo
)
1222 (valid-bi-encoding bi
) 0 16 1)))
1224 (define-crbit-instruction crnor
19 33)
1225 (define-crbit-instruction crandc
19 129)
1226 (define-instruction isync
(segment)
1227 (:printer xl-xo
((op 19) (xo 150)))
1230 (:emitter
(emit-x-form-inst segment
19 0 0 0 150 0)))
1232 (define-crbit-instruction crxor
19 193)
1233 (define-crbit-instruction crnand
19 225)
1234 (define-crbit-instruction crand
19 257)
1235 (define-crbit-instruction creqv
19 289)
1236 (define-crbit-instruction crorc
19 417)
1237 (define-crbit-instruction cror
19 449)
1239 (define-instruction bcctr
(segment bo bi
)
1240 (:printer xl-bo-bi
((op 19) (xo 528)))
1241 (:attributes branch
)
1243 (:dependencies
(reads :ccr
) (reads :ctr
))
1245 (emit-x-form-inst segment
19 (valid-bo-encoding bo
) (valid-bi-encoding bi
) 0 528 0)))
1247 (define-instruction bcctrl
(segment bo bi
)
1248 (:printer xl-bo-bi
((op 19) (xo 528) (lk 1)))
1249 (:attributes branch
)
1251 (:dependencies
(reads :ccr
) (reads :ctr
) (writes :lr
))
1253 (emit-x-form-inst segment
19 (valid-bo-encoding bo
) (valid-bi-encoding bi
) 0 528 1)))
1255 (define-instruction bctr
(segment)
1256 (:printer xl-bo-bi
((op 19) (xo 528) (bo #.
(valid-bo-encoding :bo-u
)) (bi 0) (lk 0)) '(:name
))
1257 (:attributes branch
)
1259 (:dependencies
(reads :ccr
) (reads :ctr
))
1261 (emit-x-form-inst segment
19 #.
(valid-bo-encoding :bo-u
) 0 0 528 0)))
1263 (define-instruction bctrl
(segment)
1264 (:printer xl-bo-bi
((op 19) (xo 528) (bo #.
(valid-bo-encoding :bo-u
)) (bi 0) (lk 1)) '(:name
))
1265 (:attributes branch
)
1267 (:dependencies
(reads :ccr
) (reads :ctr
))
1269 (emit-x-form-inst segment
19 #.
(valid-bo-encoding :bo-u
) 0 0 528 1)))
1271 (define-instruction rlwimi
(segment ra rs sh mb me
)
1272 (:printer m-sh
((op 20) (rc 0)))
1273 (:dependencies
(reads rs
) (writes ra
))
1276 (emit-a-form-inst segment
20 (reg-tn-encoding rs
) (reg-tn-encoding ra
) sh mb me
0)))
1278 (define-instruction rlwimi.
(segment ra rs sh mb me
)
1279 (:printer m-sh
((op 20) (rc 1)))
1280 (:dependencies
(reads rs
) (writes ra
) (writes :ccr
))
1283 (emit-a-form-inst segment
20 (reg-tn-encoding rs
) (reg-tn-encoding ra
) sh mb me
1)))
1285 (define-instruction rlwinm
(segment ra rs sh mb me
)
1286 (:printer m-sh
((op 21) (rc 0)))
1288 (:dependencies
(reads rs
) (writes ra
))
1290 (emit-a-form-inst segment
21 (reg-tn-encoding rs
) (reg-tn-encoding ra
) sh mb me
0)))
1292 (define-instruction rlwinm.
(segment ra rs sh mb me
)
1293 (:printer m-sh
((op 21) (rc 1)))
1295 (:dependencies
(reads rs
) (writes ra
) (writes :ccr
))
1297 (emit-a-form-inst segment
21 (reg-tn-encoding rs
) (reg-tn-encoding ra
) sh mb me
1)))
1299 (define-instruction rlwnm
(segment ra rs rb mb me
)
1300 (:printer m
((op 23) (rc 0) (rb nil
:type
'reg
)))
1302 (:dependencies
(reads rs
) (writes ra
) (reads rb
))
1304 (emit-a-form-inst segment
23 (reg-tn-encoding rs
) (reg-tn-encoding ra
) (reg-tn-encoding rb
) mb me
0)))
1306 (define-instruction rlwnm.
(segment ra rs rb mb me
)
1307 (:printer m
((op 23) (rc 1) (rb nil
:type
'reg
)))
1309 (:dependencies
(reads rs
) (reads rb
) (writes ra
) (writes :ccr
))
1311 (emit-a-form-inst segment
23 (reg-tn-encoding rs
) (reg-tn-encoding ra
) (reg-tn-encoding rb
) mb me
1)))
1314 (define-d-rs-ui-instruction ori
24)
1316 (define-instruction nop
(segment)
1317 (:printer d-rs-ui
((op 24) (rs 0) (ra 0) (ui 0)) '(:name
))
1321 (emit-d-form-inst segment
24 0 0 0)))
1323 (define-d-rs-ui-instruction oris
25)
1324 (define-d-rs-ui-instruction xori
26)
1325 (define-d-rs-ui-instruction xoris
27)
1326 (define-d-rs-ui-instruction andi.
28 :other-dependencies
((writes :ccr
)))
1327 (define-d-rs-ui-instruction andis.
29 :other-dependencies
((writes :ccr
)))
1329 (define-instruction cmpw
(segment crf ra
&optional
(rb nil rb-p
))
1330 (:printer x-14
((op 31) (xo 0) (l 0)) '(:name
:tab bf
"," ra
"," rb
))
1332 (:dependencies
(reads ra
) (if rb-p
(reads rb
) (reads crf
)) (reads :xer
) (writes :ccr
))
1335 (setq rb ra ra crf crf
:cr0
))
1336 (emit-x-form-inst segment
1338 (valid-cr-field-encoding crf
)
1339 (reg-tn-encoding ra
)
1340 (reg-tn-encoding rb
)
1344 (define-instruction tw
(segment tcond ra rb
)
1345 (:printer x-19
((op 31) (xo 4)))
1346 (:attributes branch
)
1349 (:emitter
(emit-x-form-inst segment
31 (valid-tcond-encoding tcond
) (reg-tn-encoding ra
) (reg-tn-encoding rb
) 4 0)))
1351 (define-4-xo-instructions subfc
31 8 :always-writes-xer t
)
1352 (define-4-xo-instructions addc
31 10 :always-writes-xer t
)
1353 (define-2-xo-oe-instructions mulhwu
31 11 :cost
5)
1355 (define-instruction mfcr
(segment rd
)
1356 (:printer x-4
((op 31) (xo 19)))
1358 (:dependencies
(reads :ccr
) (writes rd
))
1359 (:emitter
(emit-x-form-inst segment
31 (reg-tn-encoding rd
) 0 0 19 0)))
1361 (define-x-instruction lwarx
31 20)
1362 (define-x-instruction lwzx
31 23)
1363 (define-2-x-5-instructions slw
31 24)
1364 (define-2-x-10-instructions cntlzw
31 26)
1365 (define-2-x-5-instructions and
31 28)
1367 (define-instruction cmplw
(segment crf ra
&optional
(rb nil rb-p
))
1368 (:printer x-14
((op 31) (xo 32) (l 0)) '(:name
:tab bf
"," ra
"," rb
))
1370 (:dependencies
(reads ra
) (if rb-p
(reads rb
) (reads crf
)) (reads :xer
) (writes :ccr
))
1373 (setq rb ra ra crf crf
:cr0
))
1374 (emit-x-form-inst segment
1376 (valid-cr-field-encoding crf
)
1377 (reg-tn-encoding ra
)
1378 (reg-tn-encoding rb
)
1383 (define-4-xo-instructions subf
31 40)
1385 (define-x-instruction lwzux
31 55 :other-dependencies
((writes rt
)))
1386 (define-2-x-5-instructions andc
31 60)
1387 (define-2-xo-oe-instructions mulhw
31 75 :cost
5)
1389 (define-x-instruction lbzx
31 87)
1390 (define-4-xo-a-instructions neg
31 104)
1391 (define-x-instruction lbzux
31 119 :other-dependencies
((writes rt
)))
1392 (define-2-x-5-instructions nor
31 124)
1393 (define-4-xo-instructions subfe
31 136 :always-reads-xer t
:always-writes-xer t
)
1395 (define-instruction-macro sube
(rt ra rb
)
1396 `(inst subfe
,rt
,rb
,ra
))
1398 (define-instruction-macro sube.
(rt ra rb
)
1399 `(inst subfe.
,rt
,rb
,ra
))
1401 (define-instruction-macro subeo
(rt ra rb
)
1402 `(inst subfeo
,rt
,rb
,ra
))
1404 (define-instruction-macro subeo.
(rt ra rb
)
1405 `(inst subfeo
,rt
,rb
,ra
))
1407 (define-4-xo-instructions adde
31 138 :always-reads-xer t
:always-writes-xer t
)
1409 (define-instruction mtcrf
(segment mask rt
)
1410 (:printer xfx-fxm
((op 31) (xo 144)))
1412 (:dependencies
(reads rt
) (writes :ccr
))
1413 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash mask
1) 144 0)))
1415 (define-x-5-st-instruction stwcx.
31 150 t
:other-dependencies
((writes :ccr
)))
1416 (define-x-5-st-instruction stwx
31 151 nil
)
1417 (define-x-5-st-instruction stwux
31 183 nil
:other-dependencies
((writes ra
)))
1418 (define-4-xo-a-instructions subfze
31 200 :always-reads-xer t
:always-writes-xer t
)
1419 (define-4-xo-a-instructions addze
31 202 :always-reads-xer t
:always-writes-xer t
)
1420 (define-x-5-st-instruction stbx
31 215 nil
)
1421 (define-4-xo-a-instructions subfme
31 232 :always-reads-xer t
:always-writes-xer t
)
1422 (define-4-xo-a-instructions addme
31 234 :always-reads-xer t
:always-writes-xer t
)
1423 (define-4-xo-instructions mullw
31 235 :cost
5)
1424 (define-x-5-st-instruction stbux
31 247 nil
:other-dependencies
((writes ra
)))
1425 (define-4-xo-instructions add
31 266)
1426 (define-x-instruction lhzx
31 279)
1427 (define-2-x-5-instructions eqv
31 284)
1428 (define-x-instruction lhzux
31 311 :other-dependencies
((writes ra
)))
1429 (define-2-x-5-instructions xor
31 316)
1431 (define-instruction mfmq
(segment rt
)
1432 (:printer xfx
((op 31) (xo 339) (spr 0)) '(:name
:tab rt
))
1434 (:dependencies
(reads :xer
) (writes rt
))
1435 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 0 5) 339 0)))
1437 (define-instruction mfxer
(segment rt
)
1438 (:printer xfx
((op 31) (xo 339) (spr 1)) '(:name
:tab rt
))
1440 (:dependencies
(reads :xer
) (writes rt
))
1441 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 1 5) 339 0)))
1443 (define-instruction mflr
(segment rt
)
1444 (:printer xfx
((op 31) (xo 339) (spr 8)) '(:name
:tab rt
))
1446 (:dependencies
(reads :lr
) (writes rt
))
1447 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 8 5) 339 0)))
1449 (define-instruction mfctr
(segment rt
)
1450 (:printer xfx
((op 31) (xo 339) (spr 9)) '(:name
:tab rt
))
1452 (:dependencies
(reads rt
) (reads :ctr
))
1453 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 9 5) 339 0)))
1456 (define-x-instruction lhax
31 343)
1457 (define-x-instruction lhaux
31 375 :other-dependencies
((writes ra
)))
1458 (define-x-5-st-instruction sthx
31 407 nil
)
1459 (define-2-x-5-instructions orc
31 412)
1460 (define-x-5-st-instruction sthux
31 439 nil
:other-dependencies
((writes ra
)))
1462 (define-instruction or
(segment ra rs rb
)
1463 (:printer x-5
((op 31) (xo 444) (rc 0)) '((:cond
1464 ((rs :same-as rb
) 'mr
)
1468 (:unless
(:same-as rs
) "," rb
)))
1471 (:dependencies
(reads rb
) (reads rs
) (writes ra
))
1473 (emit-x-form-inst segment
1475 (reg-tn-encoding rs
)
1476 (reg-tn-encoding ra
)
1477 (reg-tn-encoding rb
)
1481 (define-instruction or.
(segment ra rs rb
)
1482 (:printer x-5
((op 31) (xo 444) (rc 1)) '((:cond
1483 ((rs :same-as rb
) 'mr.
)
1487 (:unless
(:same-as rs
) "," rb
)))
1490 (:dependencies
(reads rb
) (reads rs
) (writes ra
) (writes :ccr
))
1492 (emit-x-form-inst segment
1494 (reg-tn-encoding rs
)
1495 (reg-tn-encoding ra
)
1496 (reg-tn-encoding rb
)
1500 (define-instruction-macro mr
(ra rs
)
1501 `(inst or
,ra
,rs
,rs
))
1503 (define-instruction-macro mr.
(ra rs
)
1504 `(inst or.
,ra
,rs
,rs
))
1506 (define-4-xo-instructions divwu
31 459 :cost
36)
1508 ; This is a 601-specific instruction class.
1509 (define-4-xo-instructions div
31 331 :cost
36)
1511 ; This is a 601-specific instruction.
1512 (define-instruction mtmq
(segment rt
)
1513 (:printer xfx
((op 31) (xo 467) (spr (ash 0 5))) '(:name
:tab rt
))
1515 (:dependencies
(reads rt
) (writes :xer
))
1516 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 0 5) 467 0)))
1518 (define-instruction mtxer
(segment rt
)
1519 (:printer xfx
((op 31) (xo 467) (spr (ash 1 5))) '(:name
:tab rt
))
1521 (:dependencies
(reads rt
) (writes :xer
))
1522 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 1 5) 467 0)))
1524 (define-instruction mtlr
(segment rt
)
1525 (:printer xfx
((op 31) (xo 467) (spr (ash 8 5))) '(:name
:tab rt
))
1527 (:dependencies
(reads rt
) (writes :lr
))
1528 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 8 5) 467 0)))
1530 (define-instruction mtctr
(segment rt
)
1531 (:printer xfx
((op 31) (xo 467) (spr (ash 9 5))) '(:name
:tab rt
))
1533 (:dependencies
(reads rt
) (writes :ctr
))
1534 (:emitter
(emit-xfx-form-inst segment
31 (reg-tn-encoding rt
) (ash 9 5) 467 0)))
1537 (define-2-x-5-instructions nand
31 476)
1538 (define-4-xo-instructions divw
31 491 :cost
36)
1539 (define-instruction mcrxr
(segment crf
)
1540 (:printer x-18
((op 31) (xo 512)))
1542 (:dependencies
(reads :xer
) (writes :ccr
) (writes :xer
))
1543 (:emitter
(emit-x-form-inst segment
31 (valid-cr-field-encoding crf
) 0 0 512 0)))
1545 (define-instruction lswx
(segment rs ra rb
)
1546 (:printer x
((op 31) (xo 533) (rc 0)))
1550 (:emitter
(emit-x-form-inst sb
!assem
:segment
31 (reg-tn-encoding rs
) (reg-tn-encoding ra
) (reg-tn-encoding rb
) 533 0)))
1551 (define-x-instruction lwbrx
31 534)
1552 (define-x-20-instruction lfsx
31 535)
1553 (define-2-x-5-instructions srw
31 536)
1554 (define-x-20-instruction lfsux
31 567 :other-dependencies
((writes ra
)))
1556 (define-instruction lswi
(segment rt ra rb
)
1557 (:printer x-1
((op 31) (xo 597) (rc 0)))
1561 (:emitter
(emit-x-form-inst sb
!assem
:segment
31 (reg-tn-encoding rt
) (reg-tn-encoding ra
) rb
597 0)))
1563 (define-instruction sync
(segment)
1564 (:printer x-27
((op 31) (xo 598)))
1567 (:emitter
(emit-x-form-inst segment
31 0 0 0 598 0)))
1568 (define-x-20-instruction lfdx
31 599)
1569 (define-x-20-instruction lfdux
31 631 :other-dependencies
((writes ra
)))
1570 (define-instruction stswx
(segment rs ra rb
)
1571 (:printer x-5
((op 31) (xo 661)))
1575 (:emitter
(emit-x-form-inst sb
!assem
:segment
31
1576 (reg-tn-encoding rs
)
1577 (reg-tn-encoding ra
)
1578 (reg-tn-encoding rb
)
1581 (define-x-5-st-instruction stwbrx
31 662 nil
)
1582 (define-x-23-st-instruction stfsx
31 663)
1583 (define-x-23-st-instruction stfsux
31 695 :other-dependencies
((writes ra
)))
1584 (define-instruction stswi
(segment rs ra nb
)
1585 (:printer x-8
((op 31) (xo 725)))
1589 (emit-x-form-inst segment
31
1590 (reg-tn-encoding rs
)
1591 (reg-tn-encoding ra
)
1596 (define-x-23-st-instruction stfdx
31 727)
1597 (define-x-23-st-instruction stfdux
31 759 :other-dependencies
((writes ra
)))
1598 (define-x-instruction lhbrx
31 790)
1599 (define-2-x-5-instructions sraw
31 792)
1601 (define-instruction srawi
(segment ra rs rb
)
1602 (:printer x-9
((op 31) (xo 824) (rc 0)))
1605 (:dependencies
(reads rs
) (writes ra
))
1607 (emit-x-form-inst segment
31
1608 (reg-tn-encoding rs
)
1609 (reg-tn-encoding ra
)
1614 (define-instruction srawi.
(segment ra rs rb
)
1615 (:printer x-9
((op 31) (xo 824) (rc 1)))
1618 (:dependencies
(reads rs
) (writes ra
) (writes :ccr
))
1620 (emit-x-form-inst segment
31
1621 (reg-tn-encoding rs
)
1622 (reg-tn-encoding ra
)
1627 (define-instruction eieio
(segment)
1628 (:printer x-27
((op 31) (xo 854)))
1631 (:emitter
(emit-x-form-inst segment
31 0 0 0 854 0)))
1633 (define-x-5-st-instruction sthbrx
31 918 nil
)
1635 (define-2-x-10-instructions extsb
31 954)
1636 (define-2-x-10-instructions extsh
31 922)
1639 (define-instruction lwz
(segment rt ra si
)
1640 (:declare
(type (or fixup
(signed-byte 16)) si
))
1641 (:printer d
((op 32)))
1644 (:dependencies
(reads ra
) (writes rt
) (reads :memory
))
1646 (when (typep si
'fixup
)
1647 (note-fixup segment
:l si
)
1649 (emit-d-form-inst segment
32 (reg-tn-encoding rt
) (reg-tn-encoding ra
) si
)))
1651 (define-d-instruction lwzu
33 :other-dependencies
((writes ra
)))
1652 (define-d-instruction lbz
34)
1653 (define-d-instruction lbzu
35 :other-dependencies
((writes ra
)))
1654 (define-d-rs-instruction stw
36)
1655 (define-d-rs-instruction stwu
37 :other-dependencies
((writes ra
)))
1656 (define-d-rs-instruction stb
38)
1657 (define-d-rs-instruction stbu
39 :other-dependencies
((writes ra
)))
1658 (define-d-instruction lhz
40)
1659 (define-d-instruction lhzu
41 :other-dependencies
((writes ra
)))
1660 (define-d-instruction lha
42)
1661 (define-d-instruction lhau
43 :other-dependencies
((writes ra
)))
1662 (define-d-rs-instruction sth
44)
1663 (define-d-rs-instruction sthu
45 :other-dependencies
((writes ra
)))
1664 (define-d-instruction lmw
46 :pinned t
)
1665 (define-d-rs-instruction stmw
47 :pinned t
)
1666 (define-d-frt-instruction lfs
48)
1667 (define-d-frt-instruction lfsu
49 :other-dependencies
((writes ra
)))
1668 (define-d-frt-instruction lfd
50)
1669 (define-d-frt-instruction lfdu
51 :other-dependencies
((writes ra
)))
1670 (define-d-frs-instruction stfs
52)
1671 (define-d-frs-instruction stfsu
53 :other-dependencies
((writes ra
)))
1672 (define-d-frs-instruction stfd
54)
1673 (define-d-frs-instruction stfdu
55 :other-dependencies
((writes ra
)))
1675 (define-2-a-tab-instructions fdivs
59 18 :cost
17)
1676 (define-2-a-tab-instructions fsubs
59 20)
1677 (define-2-a-tab-instructions fadds
59 21)
1678 (define-2-a-tac-instructions fmuls
59 25)
1679 (define-2-a-instructions fmsubs
59 28 :cost
4)
1680 (define-2-a-instructions fmadds
59 29 :cost
4)
1681 (define-2-a-instructions fnmsubs
59 30 :cost
4)
1682 (define-2-a-instructions fnmadds
59 31 :cost
4)
1684 (define-instruction fcmpu
(segment crfd fra frb
)
1685 (:printer x-15
((op 63) (xo 0)))
1686 (:dependencies
(reads fra
) (reads frb
) (reads :fpscr
)
1687 (writes :fpscr
) (writes :ccr
))
1690 (:emitter
(emit-x-form-inst segment
1692 (valid-cr-field-encoding crfd
)
1693 (fp-reg-tn-encoding fra
)
1694 (fp-reg-tn-encoding frb
)
1699 (define-2-x-21-instructions frsp
63 12)
1700 (define-2-x-21-instructions fctiw
63 14)
1701 (define-2-x-21-instructions fctiwz
63 15)
1703 (define-2-a-tab-instructions fdiv
63 18 :cost
31)
1704 (define-2-a-tab-instructions fsub
63 20)
1705 (define-2-a-tab-instructions fadd
63 21)
1706 (define-2-a-tac-instructions fmul
63 25 :cost
5)
1707 (define-2-a-instructions fmsub
63 28 :cost
5)
1708 (define-2-a-instructions fmadd
63 29 :cost
5)
1709 (define-2-a-instructions fnmsub
63 30 :cost
5)
1710 (define-2-a-instructions fnmadd
63 31 :cost
5)
1712 (define-instruction fcmpo
(segment crfd fra frb
)
1713 (:printer x-15
((op 63) (xo 32)))
1714 (:dependencies
(reads fra
) (reads frb
) (reads :fpscr
)
1715 (writes :fpscr
) (writes :ccr
))
1718 (:emitter
(emit-x-form-inst segment
1720 (valid-cr-field-encoding crfd
)
1721 (fp-reg-tn-encoding fra
)
1722 (fp-reg-tn-encoding frb
)
1726 (define-2-x-21-instructions fneg
63 40)
1728 (define-2-x-21-instructions fmr
63 72)
1729 (define-2-x-21-instructions fnabs
63 136)
1730 (define-2-x-21-instructions fabs
63 264)
1732 (define-instruction mffs
(segment frd
)
1733 (:printer x-22
((op 63) (xo 583) (rc 0)))
1735 (:dependencies
(reads :fpscr
) (writes frd
))
1736 (:emitter
(emit-x-form-inst segment
1738 (fp-reg-tn-encoding frd
)
1744 (define-instruction mffs.
(segment frd
)
1745 (:printer x-22
((op 63) (xo 583) (rc 1)))
1747 (:dependencies
(reads :fpscr
) (writes frd
) (writes :ccr
))
1748 (:emitter
(emit-x-form-inst segment
1750 (fp-reg-tn-encoding frd
)
1756 (define-instruction mtfsf
(segment mask rb
)
1757 (:printer xfl
((op 63) (xo 711) (rc 0)))
1758 (:dependencies
(reads rb
) (writes :fpscr
))
1760 (:emitter
(emit-xfl-form-inst segment
63 (ash mask
1) (fp-reg-tn-encoding rb
) 711 0)))
1762 (define-instruction mtfsf.
(segment mask rb
)
1763 (:printer xfl
((op 63) (xo 711) (rc 1)))
1765 (:dependencies
(reads rb
) (writes :ccr
) (writes :fpscr
))
1766 (:emitter
(emit-xfl-form-inst segment
63 (ash mask
1) (fp-reg-tn-encoding rb
) 711 1)))
1771 ;;; Here in the future, macros are our friends.
1773 (define-instruction-macro subis
(rt ra simm
)
1774 `(inst addis
,rt
,ra
(- ,simm
)))
1776 (define-instruction-macro sub
(rt rb ra
)
1777 `(inst subf
,rt
,ra
,rb
))
1778 (define-instruction-macro sub.
(rt rb ra
)
1779 `(inst subf.
,rt
,ra
,rb
))
1780 (define-instruction-macro subo
(rt rb ra
)
1781 `(inst subfo
,rt
,ra
,rb
))
1782 (define-instruction-macro subo.
(rt rb ra
)
1783 `(inst subfo.
,rt
,ra
,rb
))
1786 (define-instruction-macro subic
(rt ra simm
)
1787 `(inst addic
,rt
,ra
(- ,simm
)))
1790 (define-instruction-macro subic.
(rt ra simm
)
1791 `(inst addic.
,rt
,ra
(- ,simm
)))
1795 (define-instruction-macro subc
(rt rb ra
)
1796 `(inst subfc
,rt
,ra
,rb
))
1797 (define-instruction-macro subc.
(rt rb ra
)
1798 `(inst subfc.
,rt
,ra
,rb
))
1799 (define-instruction-macro subco
(rt rb ra
)
1800 `(inst subfco
,rt
,ra
,rb
))
1801 (define-instruction-macro subco.
(rt rb ra
)
1802 `(inst subfco.
,rt
,ra
,rb
))
1804 (define-instruction-macro subi
(rt ra simm
)
1805 `(inst addi
,rt
,ra
(- ,simm
)))
1807 (define-instruction-macro li
(rt val
)
1808 `(inst addi
,rt zero-tn
,val
))
1810 (define-instruction-macro lis
(rt val
)
1811 `(inst addis
,rt zero-tn
,val
))
1814 (define-instruction-macro not
(ra rs
)
1815 `(inst nor
,ra
,rs
,rs
))
1817 (define-instruction-macro not.
(ra rs
)
1818 `(inst nor.
,ra
,rs
,rs
))
1821 (!def-vm-support-routine emit-nop
(segment)
1822 (emit-word segment
#x60000000
))
1824 (define-instruction-macro extlwi
(ra rs n b
)
1825 `(inst rlwinm
,ra
,rs
,b
0 (1- ,n
)))
1827 (define-instruction-macro extlwi.
(ra rs n b
)
1828 `(inst rlwinm.
,ra
,rs
,b
0 (1- ,n
)))
1830 (define-instruction-macro extrwi
(ra rs n b
)
1831 `(inst rlwinm
,ra
,rs
(mod (+ ,b
,n
) 32) (- 32 ,n
) 31))
1833 (define-instruction-macro extrwi.
(ra rs n b
)
1834 `(inst rlwinm.
,ra
,rs
(mod (+ ,b
,n
) 32) (- 32 ,n
) 31))
1836 (define-instruction-macro srwi
(ra rs n
)
1837 `(inst rlwinm
,ra
,rs
(- 32 ,n
) ,n
31))
1839 (define-instruction-macro srwi.
(ra rs n
)
1840 `(inst rlwinm.
,ra
,rs
(- 32 ,n
) ,n
31))
1842 (define-instruction-macro clrlwi
(ra rs n
)
1843 `(inst rlwinm
,ra
,rs
0 ,n
31))
1845 (define-instruction-macro clrlwi.
(ra rs n
)
1846 `(inst rlwinm.
,ra
,rs
0 ,n
31))
1848 (define-instruction-macro clrrwi
(ra rs n
)
1849 `(inst rlwinm
,ra
,rs
0 0 (- 31 ,n
)))
1851 (define-instruction-macro clrrwi.
(ra rs n
)
1852 `(inst rlwinm.
,ra
,rs
0 0 (- 31 ,n
)))
1854 (define-instruction-macro inslw
(ra rs n b
)
1855 `(inst rlwimi
,ra
,rs
(- 32 ,b
) ,b
(+ ,b
(1- ,n
))))
1857 (define-instruction-macro inslw.
(ra rs n b
)
1858 `(inst rlwimi.
,ra
,rs
(- 32 ,b
) ,b
(+ ,b
(1- ,n
))))
1860 (define-instruction-macro rotlw
(ra rs rb
)
1861 `(inst rlwnm
,ra
,rs
,rb
0 31))
1863 (define-instruction-macro rotlw.
(ra rs rb
)
1864 `(inst rlwnm.
,ra
,rs
,rb
0 31))
1866 (define-instruction-macro rotlwi
(ra rs n
)
1867 `(inst rlwinm
,ra
,rs
,n
0 31))
1869 (define-instruction-macro rotrwi
(ra rs n
)
1870 `(inst rlwinm
,ra
,rs
(- 32 ,n
) 0 31))
1872 (define-instruction-macro slwi
(ra rs n
)
1873 `(inst rlwinm
,ra
,rs
,n
0 (- 31 ,n
)))
1875 (define-instruction-macro slwi.
(ra rs n
)
1876 `(inst rlwinm.
,ra
,rs
,n
0 (- 31 ,n
))))
1883 ((define-conditional-branches (name bo-name
)
1884 (let* ((bo-enc (valid-bo-encoding bo-name
)))
1886 (define-instruction-macro ,(symbolicate name
"A") (bi target
)
1887 ``(inst bca
,,,bo-enc
,,bi
,,target
))
1888 (define-instruction-macro ,(symbolicate name
"L") (bi target
)
1889 ``(inst bcl
,,,bo-enc
,,bi
,,target
))
1890 (define-instruction-macro ,(symbolicate name
"LA") (bi target
)
1891 ``(inst bcla
,,,bo-enc
,,bi
,,target
))
1892 (define-instruction-macro ,(symbolicate name
"CTR") (bi target
)
1893 ``(inst bcctr
,,,bo-enc
,,bi
,,target
))
1894 (define-instruction-macro ,(symbolicate name
"CTRL") (bi target
)
1895 ``(inst bcctrl
,,,bo-enc
,,bi
,,target
))
1896 (define-instruction-macro ,(symbolicate name
"LR") (bi target
)
1897 ``(inst bclr
,,,bo-enc
,,bi
,,target
))
1898 (define-instruction-macro ,(symbolicate name
"LRL") (bi target
)
1899 ``(inst bclrl
,,,bo-enc
,,bi
,,target
))))))
1900 (define-conditional-branches bt
:bo-t
)
1901 (define-conditional-branches bf
:bo-f
))
1905 ((define-positive-conditional-branches (name cr-bit-name
)
1907 (define-instruction-macro ,name
(crf &optional
(target nil target-p
))
1909 (setq target crf crf
:cr0
))
1910 `(inst bt
`(,,crf
,,,cr-bit-name
) ,target
))
1912 (define-instruction-macro ,(symbolicate name
"A") (target &optional
(cr-field :cr0
))
1913 ``(inst bta
(,,cr-field
,,,cr-bit-name
) ,,target
))
1914 (define-instruction-macro ,(symbolicate name
"L") (target &optional
(cr-field :cr0
))
1915 ``(inst btl
(,,cr-field
,,,cr-bit-name
) ,,target
))
1916 (define-instruction-macro ,(symbolicate name
"LA") (target &optional
(cr-field :cr0
))
1917 ``(inst btla
(,,cr-field
,,,cr-bit-name
) ,,target
))
1918 (define-instruction-macro ,(symbolicate name
"CTR") (target &optional
(cr-field :cr0
))
1919 ``(inst btctr
(,,cr-field
,,,cr-bit-name
) ,,target
))
1920 (define-instruction-macro ,(symbolicate name
"CTRL") (target &optional
(cr-field :cr0
))
1921 ``(inst btctrl
(,,cr-field
,,,cr-bit-name
) ,,target
))
1922 (define-instruction-macro ,(symbolicate name
"LR") (target &optional
(cr-field :cr0
))
1923 ``(inst btlr
(,,cr-field
,,,cr-bit-name
) ,,target
))
1924 (define-instruction-macro ,(symbolicate name
"LRL") (target &optional
(cr-field :cr0
))
1925 ``(inst btlrl
(,,cr-field
,,,cr-bit-name
) ,,target
))
1928 (define-positive-conditional-branches beq
:eq
)
1929 (define-positive-conditional-branches blt
:lt
)
1930 (define-positive-conditional-branches bgt
:gt
)
1931 (define-positive-conditional-branches bso
:so
)
1932 (define-positive-conditional-branches bun
:so
))
1936 ((define-negative-conditional-branches (name cr-bit-name
)
1938 (define-instruction-macro ,name
(crf &optional
(target nil target-p
))
1940 (setq target crf crf
:cr0
))
1941 `(inst bf
`(,,crf
,,,cr-bit-name
) ,target
))
1943 (define-instruction-macro ,(symbolicate name
"A") (target &optional
(cr-field :cr0
))
1944 ``(inst bfa
(,,cr-field
,,,cr-bit-name
) ,,target
))
1945 (define-instruction-macro ,(symbolicate name
"L") (target &optional
(cr-field :cr0
))
1946 ``(inst bfl
(,,cr-field
,,,cr-bit-name
) ,,target
))
1947 (define-instruction-macro ,(symbolicate name
"LA") (target &optional
(cr-field :cr0
))
1948 ``(inst bfla
(,,cr-field
,,,cr-bit-name
) ,,target
))
1949 (define-instruction-macro ,(symbolicate name
"CTR") (target &optional
(cr-field :cr0
))
1950 ``(inst bfctr
(,,cr-field
,,,cr-bit-name
) ,,target
))
1951 (define-instruction-macro ,(symbolicate name
"CTRL") (target &optional
(cr-field :cr0
))
1952 ``(inst bfctrl
(,,cr-field
,,,cr-bit-name
) ,,target
))
1953 (define-instruction-macro ,(symbolicate name
"LR") (target &optional
(cr-field :cr0
))
1954 ``(inst bflr
(,,cr-field
,,,cr-bit-name
) ,,target
))
1955 (define-instruction-macro ,(symbolicate name
"LRL") (target &optional
(cr-field :cr0
))
1956 ``(inst bflrl
(,,cr-field
,,,cr-bit-name
) ,,target
))
1959 (define-negative-conditional-branches bne
:eq
)
1960 (define-negative-conditional-branches bnl
:lt
)
1961 (define-negative-conditional-branches bge
:lt
)
1962 (define-negative-conditional-branches bng
:gt
)
1963 (define-negative-conditional-branches ble
:gt
)
1964 (define-negative-conditional-branches bns
:so
)
1965 (define-negative-conditional-branches bnu
:so
))
1969 (define-instruction-macro j
(func-tn offset
)
1971 (inst addi lip-tn
,func-tn
,offset
)
1977 (define-instruction-macro bua
(target)
1978 `(inst bca
:bo-u
0 ,target
))
1980 (define-instruction-macro bul
(target)
1981 `(inst bcl
:bo-u
0 ,target
))
1983 (define-instruction-macro bula
(target)
1984 `(inst bcla
:bo-u
0 ,target
))
1987 (define-instruction-macro blrl
()
1988 `(inst bclrl
:bo-u
0))
1991 ;;; Some more macros
1993 (defun %lr
(reg value
)
1996 (inst li reg value
))
1998 (inst ori reg zero-tn value
))
1999 ((or (signed-byte 32) (unsigned-byte 32))
2000 (let* ((high-half (ldb (byte 16 16) value
))
2001 (low-half (ldb (byte 16 0) value
)))
2002 (declare (type (unsigned-byte 16) high-half low-half
))
2003 (cond ((and (logbitp 15 low-half
) (= high-half
#xffff
))
2004 (inst li reg
(dpb low-half
(byte 16 0) -
1)))
2005 ((and (not (logbitp 15 low-half
)) (zerop high-half
))
2006 (inst li reg low-half
))
2008 (inst lis reg
(if (logbitp 15 high-half
)
2009 (dpb high-half
(byte 16 0) -
1)
2011 (unless (zerop low-half
)
2012 (inst ori reg reg low-half
))))))
2014 (inst lis reg value
)
2015 (inst addi reg reg value
))))
2017 (define-instruction-macro lr
(reg value
)
2022 ;;;; Instructions for dumping data and header objects.
2024 (define-instruction word
(segment word
)
2025 (:declare
(type (or (unsigned-byte 32) (signed-byte 32)) word
))
2029 (emit-word segment word
)))
2031 (define-instruction short
(segment short
)
2032 (:declare
(type (or (unsigned-byte 16) (signed-byte 16)) short
))
2036 (emit-short segment short
)))
2038 (define-instruction byte
(segment byte
)
2039 (:declare
(type (or (unsigned-byte 8) (signed-byte 8)) byte
))
2043 (emit-byte segment byte
)))
2045 (define-bitfield-emitter emit-header-object
32
2046 (byte 24 8) (byte 8 0))
2048 (defun emit-header-data (segment type
)
2051 #'(lambda (segment posn
)
2054 (ash (+ posn
(component-header-length))
2055 (- n-widetag-bits word-shift
)))))))
2057 (define-instruction simple-fun-header-word
(segment)
2061 (emit-header-data segment simple-fun-header-widetag
)))
2063 (define-instruction lra-header-word
(segment)
2067 (emit-header-data segment return-pc-header-widetag
)))
2070 ;;;; Instructions for converting between code objects, functions, and lras.
2071 (defun emit-compute-inst (segment vop dst src label temp calc
)
2073 ;; We emit either 12 or 4 bytes, so we maintain 8 byte alignments.
2075 #'(lambda (segment posn delta-if-after
)
2076 (let ((delta (funcall calc label posn delta-if-after
)))
2077 (when (<= (- (ash 1 15)) delta
(1- (ash 1 15)))
2078 (emit-back-patch segment
4
2079 #'(lambda (segment posn
)
2080 (assemble (segment vop
)
2082 (funcall calc label posn
0)))))
2084 #'(lambda (segment posn
)
2085 (let ((delta (funcall calc label posn
0)))
2086 (assemble (segment vop
)
2087 (inst lis temp
(ldb (byte 16 16) delta
))
2088 (inst ori temp temp
(ldb (byte 16 0) delta
))
2089 (inst add dst src temp
))))))
2091 ;; code = lip - header - label-offset + other-pointer-tag
2092 (define-instruction compute-code-from-lip
(segment dst src label temp
)
2093 (:declare
(type tn dst src temp
) (type label label
))
2094 (:attributes variable-length
)
2095 (:dependencies
(reads src
) (writes dst
) (writes temp
))
2099 (emit-compute-inst segment vop dst src label temp
2100 #'(lambda (label posn delta-if-after
)
2101 (- other-pointer-lowtag
2102 ;;function-pointer-type
2103 (label-position label posn delta-if-after
)
2104 (component-header-length))))))
2106 ;; code = lra - other-pointer-tag - header - label-offset + other-pointer-tag
2107 ;; = lra - (header + label-offset)
2108 (define-instruction compute-code-from-lra
(segment dst src label temp
)
2109 (:declare
(type tn dst src temp
) (type label label
))
2110 (:attributes variable-length
)
2111 (:dependencies
(reads src
) (writes dst
) (writes temp
))
2115 (emit-compute-inst segment vop dst src label temp
2116 #'(lambda (label posn delta-if-after
)
2117 (- (+ (label-position label posn delta-if-after
)
2118 (component-header-length)))))))
2120 ;; lra = code + other-pointer-tag + header + label-offset - other-pointer-tag
2121 ;; = code + header + label-offset
2122 (define-instruction compute-lra-from-code
(segment dst src label temp
)
2123 (:declare
(type tn dst src temp
) (type label label
))
2124 (:attributes variable-length
)
2125 (:dependencies
(reads src
) (writes dst
) (writes temp
))
2129 (emit-compute-inst segment vop dst src label temp
2130 #'(lambda (label posn delta-if-after
)
2131 (+ (label-position label posn delta-if-after
)
2132 (component-header-length))))))