0.9.13.15:
authorJuho Snellman <jsnell@iki.fi>
Thu, 1 Jun 2006 09:08:01 +0000 (09:08 +0000)
committerJuho Snellman <jsnell@iki.fi>
Thu, 1 Jun 2006 09:08:01 +0000 (09:08 +0000)
Add x86-64 disassembler support for the #x66 prefix (patch by
        Lutz Euler on sbcl-devel)

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

index ef5b416..36cc3a1 100644 (file)
     (sb!disassem:dstate-put-inst-prop dstate 'operand-size-8))
   value)
 
+;;; This prefilter is used solely for its side effect, namely to put
+;;; the property OPERAND-SIZE-16 into the DSTATE.
+(defun prefilter-x66 (value dstate)
+  (declare (type (eql #x66) value)
+           (ignore value)
+           (type sb!disassem:disassem-state dstate))
+  (sb!disassem:dstate-put-inst-prop dstate 'operand-size-16))
+
 ;;; A register field that can be extended by REX.R.
 (defun prefilter-reg-r (value dstate)
   (declare (type reg value)
              (princ (schar (symbol-name (inst-operand-size dstate)) 0)
                     stream)))
 
+;;; Used to capture the effect of the #x66 operand size override prefix.
+(sb!disassem:define-arg-type x66
+  :prefilter #'prefilter-x66)
+
 (sb!disassem:define-arg-type displacement
   :sign-extend t
   :use-label #'offset-next
   (op  :field (byte 6 10))
   (dir :field (byte 1 9)))
 
+(sb!disassem:define-instruction-format (x66-reg-reg/mem-dir 24
+                                        :default-printer
+                                        `(:name
+                                          :tab
+                                          ,(swap-if 'dir 'reg/mem ", " 'reg)))
+  (x66     :field (byte 8 0)    :type 'x66 :value #x66)
+  (op      :field (byte 6 10))
+  (dir     :field (byte 1 9))
+  (width   :field (byte 1 8)    :type 'width)
+  (reg/mem :fields (list (byte 2 22) (byte 3 16))
+                                :type 'reg/mem)
+  (reg     :field (byte 3 19)   :type 'reg))
+
+(sb!disassem:define-instruction-format (x66-rex-reg-reg/mem-dir 32
+                                        :default-printer
+                                        `(:name
+                                          :tab
+                                          ,(swap-if 'dir 'reg/mem ", " 'reg)))
+  (x66     :field (byte 8 0)    :type 'x66 :value #x66)
+  (rex     :field (byte 4 12)   :value #b0100)
+  (wrxb    :field (byte 4 8)    :type 'wrxb)
+  (op      :field (byte 6 18))
+  (dir     :field (byte 1 17))
+  (width   :field (byte 1 16)   :type 'width)
+  (reg/mem :fields (list (byte 2 30) (byte 3 24))
+                                :type 'reg/mem)
+  (reg     :field (byte 3 27)   :type 'reg))
+
 ;;; Same as reg-reg/mem, but uses the reg field as a second op code.
 (sb!disassem:define-instruction-format (reg/mem 16
                                         :default-printer '(:name :tab reg/mem))
   ;; register to/from register/memory
   (:printer reg-reg/mem-dir ((op #b100010)))
   (:printer rex-reg-reg/mem-dir ((op #b100010)))
+  (:printer x66-reg-reg/mem-dir ((op #b100010)))
+  (:printer x66-rex-reg-reg/mem-dir ((op #b100010)))
   ;; immediate to register/memory
   (:printer reg/mem-imm ((op '(#b1100011 #b000))))
   (:printer rex-reg/mem-imm ((op '(#b1100011 #b000))))
index 1e16053..084c954 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.13.14"
+"0.9.13.15"