0.pre8.63:
authorAlexey Dejneka <adejneka@comail.ru>
Thu, 17 Apr 2003 13:33:37 +0000 (13:33 +0000)
committerAlexey Dejneka <adejneka@comail.ru>
Thu, 17 Apr 2003 13:33:37 +0000 (13:33 +0000)
        Added disassembling of BT/BTC/BTS/BTR.

BUGS
src/compiler/x86/insts.lisp
version.lisp-expr

diff --git a/BUGS b/BUGS
index 47768d1..2b36d3f 100644 (file)
--- 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
index 135e0e3..9febabb 100644 (file)
       (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))
 (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)
                                :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))
 \f
 ;;;; This section was added by jrd, for fp instructions.
 
           (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)))
 
index bc6c594..0de56bf 100644 (file)
@@ -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"