From: Alexey Dejneka Date: Thu, 17 Apr 2003 13:33:37 +0000 (+0000) Subject: 0.pre8.63: X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=3b0127f4fc07a0ced81303b3b5ffe2ac603be87d;p=sbcl.git 0.pre8.63: Added disassembling of BT/BTC/BTS/BTR. --- diff --git a/BUGS b/BUGS index 47768d1..2b36d3f 100644 --- a/BUGS +++ b/BUGS @@ -1296,9 +1296,9 @@ WORKAROUND: for :EXTERNAL-FORMAT in DEFKNOWN OPEN (and LOAD) is a workaround for the problem (and should be removed when the problem is fixed). -245: - On X86 IMUL instruction with an immediate operand is printed - incorrectly. +245: bugs in disassembler + a. On X86 an immediate operand for IMUL is printed incorrectly. + b. On X86 operand size prefix is not recognized. 246: "NTH-VALUE scaling problem" NTH-VALUE's current implementation for constant integers scales in diff --git a/src/compiler/x86/insts.lisp b/src/compiler/x86/insts.lisp index 135e0e3..9febabb 100644 --- a/src/compiler/x86/insts.lisp +++ b/src/compiler/x86/insts.lisp @@ -108,6 +108,14 @@ (print-byte-reg value stream dstate) (print-mem-access value stream t dstate))) +(defun print-word-reg/mem (value stream dstate) + (declare (type (or list reg) value) + (type stream stream) + (type sb!disassem:disassem-state dstate)) + (if (typep value 'reg) + (print-word-reg value stream dstate) + (print-mem-access value stream nil dstate))) + (defun print-label (value stream dstate) (declare (ignore dstate)) (sb!disassem:princ16 value stream)) @@ -273,6 +281,9 @@ (sb!disassem:define-arg-type byte-reg/mem :prefilter #'prefilter-reg/mem :printer #'print-byte-reg/mem) +(sb!disassem:define-arg-type word-reg/mem + :prefilter #'prefilter-reg/mem + :printer #'print-word-reg/mem) ;;; added by jrd (eval-when (:compile-toplevel :load-toplevel :execute) @@ -470,6 +481,12 @@ :type 'sized-reg/mem) ;; optional fields (imm)) + +(sb!disassem:define-instruction-format (ext-reg/mem-imm 24 + :include 'ext-reg/mem + :default-printer + '(:name :tab reg/mem ", " imm)) + (imm :type 'imm-data)) ;;;; This section was added by jrd, for fp instructions. @@ -1613,19 +1630,33 @@ (emit-byte segment (dpb opcode (byte 3 3) #b10000011)) (emit-ea segment src (reg-tn-encoding index)))))) +(eval-when (:compile-toplevel :execute) + (defun bit-test-inst-printer-list (subop) + `((ext-reg/mem-imm ((op (#b1011101 ,subop)) + (reg/mem nil :type word-reg/mem) + (imm nil :type imm-data) + (width 0))) + (ext-reg-reg/mem ((op ,(dpb subop (byte 3 2) #b1000001)) + (width 1)) + (:name :tab reg/mem ", " reg))))) + (define-instruction bt (segment src index) + (:printer-list (bit-test-inst-printer-list #b100)) (:emitter (emit-bit-test-and-mumble segment src index #b100))) (define-instruction btc (segment src index) + (:printer-list (bit-test-inst-printer-list #b111)) (:emitter (emit-bit-test-and-mumble segment src index #b111))) (define-instruction btr (segment src index) + (:printer-list (bit-test-inst-printer-list #b110)) (:emitter (emit-bit-test-and-mumble segment src index #b110))) (define-instruction bts (segment src index) + (:printer-list (bit-test-inst-printer-list #b101)) (:emitter (emit-bit-test-and-mumble segment src index #b101))) diff --git a/version.lisp-expr b/version.lisp-expr index bc6c594..0de56bf 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -18,4 +18,4 @@ ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.pre8.62" +"0.pre8.63"