⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 insts.lisp

📁 开源跨平台Lisp编译器
💻 LISP
📖 第 1 页 / 共 4 页
字号:
;;;; the instruction set definition for HPPA;;;; This software is part of the SBCL system. See the README file for;;;; more information.;;;;;;;; This software is derived from the CMU CL system, which was;;;; written at Carnegie Mellon University and released into the;;;; public domain. The software is in the public domain and is;;;; provided with absolutely no warranty. See the COPYING and CREDITS;;;; files for more information.(in-package "SB!VM")(eval-when (:compile-toplevel :load-toplevel :execute)  (setf sb!assem:*assem-scheduler-p* nil));;;; Utility functions.(defun reg-tn-encoding (tn)  (declare (type tn tn))  (sc-case tn    (null null-offset)    (zero zero-offset)    (t     (aver (eq (sb-name (sc-sb (tn-sc tn))) 'registers))     (tn-offset tn))))(defun fp-reg-tn-encoding (tn)  (declare (type tn tn))  (sc-case tn    (fp-single-zero (values 0 nil))    (single-reg (values (tn-offset tn) nil))    (fp-double-zero (values 0 t))    (double-reg (values (tn-offset tn) t))))(defconstant-eqx compare-conditions  '(:never := :< :<= :<< :<<= :sv :od :tr :<> :>= :> :>>= :>> :nsv :ev)  #'equalp)(deftype compare-condition ()  `(member nil ,@compare-conditions))(defun compare-condition (cond)  (declare (type compare-condition cond))  (if cond      (let ((result (or (position cond compare-conditions :test #'eq)                        (error "Bogus Compare/Subtract condition: ~S" cond))))        (values (ldb (byte 3 0) result)                (logbitp 3 result)))      (values 0 nil)))(defconstant-eqx add-conditions  '(:never := :< :<= :nuv :znv :sv :od :tr :<> :>= :> :uv :vnz :nsv :ev)  #'equalp)(deftype add-condition ()  `(member nil ,@add-conditions))(defun add-condition (cond)    (declare (type add-condition cond))  (if cond      (let ((result (or (position cond add-conditions :test #'eq)                        (error "Bogus Add condition: ~S" cond))))        (values (ldb (byte 3 0) result)                (logbitp 3 result)))      (values 0 nil)))(defconstant-eqx logical-conditions  '(:never := :< :<= nil nil nil :od :tr :<> :>= :> nil nil nil :ev)  #'equalp)(deftype logical-condition ()  `(member nil ,@(remove nil logical-conditions)))(defun logical-condition (cond)    (declare (type logical-condition cond))  (if cond      (let ((result (or (position cond logical-conditions :test #'eq)                        (error "Bogus Logical condition: ~S" cond))))        (values (ldb (byte 3 0) result)                (logbitp 3 result)))      (values 0 nil)))(defconstant-eqx unit-conditions  '(:never nil :sbz :shz :sdc :sbc :shc :tr nil :nbz :nhz :ndc :nbc :nhc)  #'equalp)(deftype unit-condition ()  `(member nil ,@(remove nil unit-conditions)))(defun unit-condition (cond)  (declare (type unit-condition cond))  (if cond      (let ((result (or (position cond unit-conditions :test #'eq)                        (error "Bogus Unit condition: ~S" cond))))        (values (ldb (byte 3 0) result)                (logbitp 3 result)))      (values 0 nil)))(defconstant-eqx extract/deposit-conditions  '(:never := :< :od :tr :<> :>= :ev)  #'equalp)(deftype extract/deposit-condition ()  `(member nil ,@extract/deposit-conditions))(defun extract/deposit-condition (cond)  (declare (type extract/deposit-condition cond))  (if cond      (or (position cond extract/deposit-conditions :test #'eq)          (error "Bogus Extract/Deposit condition: ~S" cond))      0))(defun space-encoding (space)  (declare (type (unsigned-byte 3) space))  (dpb (ldb (byte 2 0) space)       (byte 2 1)       (ldb (byte 1 2) space)));;;; Initial disassembler setup.(setf sb!disassem:*disassem-inst-alignment-bytes* 4)(defvar *disassem-use-lisp-reg-names* t)(defparameter reg-symbols  (map 'vector       #'(lambda (name)           (cond ((null name) nil)                 (t (make-symbol (concatenate 'string "$" name)))))       *register-names*))(sb!disassem:define-arg-type reg  :printer #'(lambda (value stream dstate)               (declare (stream stream) (fixnum value))               (let ((regname (aref reg-symbols value)))                 (princ regname stream)                 (sb!disassem:maybe-note-associated-storage-ref                  value                  'registers                  regname                  dstate))))(defparameter float-reg-symbols  #.(coerce     (loop for n from 0 to 31 collect (make-symbol (format nil "$F~d" n)))     'vector))(sb!disassem:define-arg-type fp-reg  :printer #'(lambda (value stream dstate)               (declare (stream stream) (fixnum value))               (let ((regname (aref float-reg-symbols value)))                 (princ regname stream)                 (sb!disassem:maybe-note-associated-storage-ref                  value                  'float-registers                  regname                  dstate))))(sb!disassem:define-arg-type fp-fmt-0c  :printer #'(lambda (value stream dstate)               (declare (ignore dstate) (stream stream) (fixnum value))               (ecase value                 (0 (format stream "~A" '\,SGL))                 (1 (format stream "~A" '\,DBL))                 (3 (format stream "~A" '\,QUAD)))))(defun low-sign-extend (x n)  (let ((normal (dpb x (byte 1 (1- n)) (ldb (byte (1- n) 1) x))))    (if (logbitp 0 x)        (logior (ash -1 (1- n)) normal)        normal)))(defun sign-extend (x n)  (if (logbitp (1- n) x)      (logior (ash -1 (1- n)) x)      x))(defun assemble-bits (x list)  (let ((result 0)        (offset 0))    (dolist (e (reverse list))      (setf result (logior result (ash (ldb e x) offset)))      (incf offset (byte-size e)))    result))(defmacro define-imx-decode (name bits)  `(sb!disassem:define-arg-type ,name     :printer #'(lambda (value stream dstate)                  (declare (ignore dstate) (stream stream) (fixnum value))                  (format stream "~S" (low-sign-extend value ,bits)))))(define-imx-decode im5 5)(define-imx-decode im11 11)(define-imx-decode im14 14)(sb!disassem:define-arg-type im3  :printer #'(lambda (value stream dstate)               (declare (ignore dstate) (stream stream) (fixnum value))               (format stream "~S" (assemble-bits value `(,(byte 1 0)                                                          ,(byte 2 1))))))(sb!disassem:define-arg-type im21  :printer #'(lambda (value stream dstate)               (declare (ignore dstate) (stream stream) (fixnum value))               (format stream "~S"                       (assemble-bits value `(,(byte 1 0) ,(byte 11 1)                                              ,(byte 2 14) ,(byte 5 16)                                              ,(byte 2 12))))))(sb!disassem:define-arg-type cp  :printer #'(lambda (value stream dstate)               (declare (ignore dstate) (stream stream) (fixnum value))               (format stream "~S" (- 31 value))))(sb!disassem:define-arg-type clen  :printer #'(lambda (value stream dstate)               (declare (ignore dstate) (stream stream) (fixnum value))               (format stream "~S" (- 32 value))))(sb!disassem:define-arg-type compare-condition  :printer #("" \,= \,< \,<= \,<< \,<<= \,SV \,OD \,TR \,<> \,>=             \,> \,>>= \,>> \,NSV \,EV))(sb!disassem:define-arg-type compare-condition-false  :printer #(\,TR \,<> \,>= \,> \,>>= \,>> \,NSV \,EV             "" \,= \,< \,<= \,<< \,<<= \,SV \,OD))(sb!disassem:define-arg-type add-condition  :printer #("" \,= \,< \,<= \,NUV \,ZNV \,SV \,OD \,TR \,<> \,>= \,> \,UV             \,VNZ \,NSV \,EV))(sb!disassem:define-arg-type add-condition-false  :printer #(\,TR \,<> \,>= \,> \,UV \,VNZ \,NSV \,EV             "" \,= \,< \,<= \,NUV \,ZNV \,SV \,OD))(sb!disassem:define-arg-type logical-condition  :printer #("" \,= \,< \,<= "" "" "" \,OD \,TR \,<> \,>= \,> "" "" "" \,EV))(sb!disassem:define-arg-type unit-condition  :printer #("" "" \,SBZ \,SHZ \,SDC \,SBC \,SHC \,TR "" \,NBZ \,NHZ \,NDC             \,NBC \,NHC))(sb!disassem:define-arg-type extract/deposit-condition  :printer #("" \,= \,< \,OD \,TR \,<> \,>= \,EV))(sb!disassem:define-arg-type extract/deposit-condition-false  :printer #(\,TR \,<> \,>= \,EV "" \,= \,< \,OD))(sb!disassem:define-arg-type nullify  :printer #("" \,N))(sb!disassem:define-arg-type fcmp-cond  :printer #(\FALSE? \FALSE \? \!<=> \= \=T \?= \!<> \!?>= \< \?<                     \!>= \!?> \<= \?<= \!> \!?<= \> \?>\ \!<= \!?< \>=                     \?>= \!< \!?= \<> \!= \!=T \!? \<=> \TRUE? \TRUE))(sb!disassem:define-arg-type integer  :printer #'(lambda (value stream dstate)               (declare (ignore dstate) (stream stream) (fixnum value))               (format stream "~S" value)))(sb!disassem:define-arg-type space  :printer #("" |1,| |2,| |3,|));;;; Define-instruction-formats for disassembler.(sb!disassem:define-instruction-format    (load/store 32)  (op   :field (byte 6 26))  (b    :field (byte 5 21) :type 'reg)  (t/r  :field (byte 5 16) :type 'reg)  (s    :field (byte 2 14) :type 'space)  (im14 :field (byte 14 0) :type 'im14))(defconstant-eqx cmplt-index-print '((:cond ((u :constant 1) '\,S))                                 (:cond ((m :constant 1) '\,M)))  #'equalp)(defconstant-eqx cmplt-disp-print '((:cond ((m :constant 1)                                  (:cond ((s :constant 0) '\,MA)                                         (t '\,MB)))))  #'equalp)(defconstant-eqx cmplt-store-print '((:cond ((s :constant 0) '\,B)                                         (t '\,E))                                  (:cond ((m :constant 1) '\,M)))  #'equalp)(sb!disassem:define-instruction-format    (extended-load/store 32)  (op1     :field (byte 6 26) :value 3)  (b       :field (byte 5 21) :type 'reg)  (x/im5/r :field (byte 5 16) :type 'reg)  (s       :field (byte 2 14) :type 'space)  (u       :field (byte 1 13))  (op2     :field (byte 3 10))  (ext4/c  :field (byte 4 6))  (m       :field (byte 1 5))  (t/im5   :field (byte 5 0) :type 'reg))(sb!disassem:define-instruction-format    (ldil 32 :default-printer '(:name :tab im21 "," t))  (op    :field (byte 6 26))  (t   :field (byte 5 21) :type 'reg)  (im21 :field (byte 21 0) :type 'im21))(sb!disassem:define-instruction-format    (branch17 32)  (op1 :field (byte 6 26))  (t   :field (byte 5 21) :type 'reg)  (w   :fields `(,(byte 5 16) ,(byte 11 2) ,(byte 1 0))       :use-label       #'(lambda (value dstate)           (declare (type sb!disassem:disassem-state dstate) (list value))           (let ((x (logior (ash (first value) 12) (ash (second value) 1)                            (third value))))             (+ (ash (sign-extend                      (assemble-bits x `(,(byte 1 0) ,(byte 5 12) ,(byte 1 1)                                         ,(byte 10 2))) 17) 2)                (sb!disassem:dstate-cur-addr dstate) 8))))  (op2 :field (byte 3 13))  (n   :field (byte 1 1) :type 'nullify))(sb!disassem:define-instruction-format    (branch12 32)  (op1 :field (byte 6 26))  (r2  :field (byte 5 21) :type 'reg)  (r1  :field (byte 5 16) :type 'reg)  (w   :fields `(,(byte 11 2) ,(byte 1 0))       :use-label       #'(lambda (value dstate)           (declare (type sb!disassem:disassem-state dstate) (list value))           (let ((x (logior (ash (first value) 1) (second value))))             (+ (ash (sign-extend                      (assemble-bits x `(,(byte 1 0) ,(byte 1 1) ,(byte 10 2)))                      12) 2)                (sb!disassem:dstate-cur-addr dstate) 8))))  (c   :field (byte 3 13))  (n   :field (byte 1 1) :type 'nullify))(sb!disassem:define-instruction-format    (branch 32)  (op1 :field (byte 6 26))  (t   :field (byte 5 21) :type 'reg)  (x   :field (byte 5 16) :type 'reg)  (op2 :field (byte 3 13))  (x1  :field (byte 11 2))  (n   :field (byte 1 1) :type 'nullify)  (x2  :field (byte 1 0)))(sb!disassem:define-instruction-format     (r3-inst 32 :default-printer '(:name c :tab r1 "," r2 "," t))  (r3 :field (byte 6 26) :value 2)  (r2 :field (byte 5 21) :type 'reg)  (r1 :field (byte 5 16) :type 'reg)  (c  :field (byte 3 13))  (f  :field (byte 1 12))  (op :field (byte 7 5))  (t  :field (byte 5 0) :type 'reg))(sb!disassem:define-instruction-format    (imm-inst 32 :default-printer '(:name c :tab im11 "," r "," t))  (op   :field (byte 6 26))  (r    :field (byte 5 21) :type 'reg)  (t    :field (byte 5 16) :type 'reg)  (c    :field (byte 3 13))  (f    :field (byte 1 12))  (o    :field (byte 1 11))  (im11 :field (byte 11 0) :type 'im11))(sb!disassem:define-instruction-format    (extract/deposit-inst 32)  (op1    :field (byte 6 26))  (r2     :field (byte 5 21) :type 'reg)  (r1     :field (byte 5 16) :type 'reg)  (c      :field (byte 3 13) :type 'extract/deposit-condition)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -