From 57f8e261b638ac797036aa4cb66f6e2d604170f5 Mon Sep 17 00:00:00 2001 From: Juho Snellman Date: Thu, 1 Jun 2006 09:08:01 +0000 Subject: [PATCH] 0.9.13.15: Add x86-64 disassembler support for the #x66 prefix (patch by Lutz Euler on sbcl-devel) --- src/compiler/x86-64/insts.lisp | 42 ++++++++++++++++++++++++++++++++++++++++ version.lisp-expr | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index ef5b416..36cc3a1 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -257,6 +257,14 @@ (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) @@ -360,6 +368,10 @@ (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 @@ -693,6 +705,34 @@ (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)) @@ -1543,6 +1583,8 @@ ;; 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)))) diff --git a/version.lisp-expr b/version.lisp-expr index 1e16053..084c954 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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" -- 1.7.10.4