From: Kevin R. <kev...@us...> - 2004-12-01 15:30:48
|
Update of /cvsroot/sbcl/sbcl/src/compiler/x86-64 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12236/src/compiler/x86-64 Modified Files: Tag: x86-64-again-branch insts.lisp Log Message: x86-64-again-branch.19: * fix sb-aclrepl inspector's bignum header (reported by Juho Snellman) * Add missing instruction bytes in disassembly which were added by read-suffix called by prefilter * Disasble old "DEC" disassembly opcode since that is now REX prefix * Partial fix of disassembly for POP and DEC Index: insts.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/x86-64/insts.lisp,v retrieving revision 1.1.8.10 retrieving revision 1.1.8.11 diff -u -d -r1.1.8.10 -r1.1.8.11 --- insts.lisp 29 Nov 2004 21:04:32 -0000 1.1.8.10 +++ insts.lisp 1 Dec 2004 15:30:39 -0000 1.1.8.11 @@ -20,7 +20,9 @@ ;;; this type is used mostly in disassembly and represents legacy ;;; registers only. r8-15 are handled separately -(deftype reg () '(unsigned-byte 3)) +;;(deftype reg () '(unsigned-byte 3)) +;;; KMR: Includes r8-r15 +(deftype reg () '(unsigned-byte 4)) ;;; default word size for the chip: if the operand size !=:dword ;;; we need to output #x66 (or REX) prefix @@ -238,6 +240,18 @@ (sb!disassem:define-arg-type word-reg :printer #'print-word-reg) +(sb!disassem:define-arg-type modrm-word-reg + :prefilter (lambda (value dstate) + (declare (type sb!disassem:disassem-state dstate) + (list value)) + (setf (sb!disassem:dstate-get-prop dstate 'width) :qword) + (let ((rex.r (car value)) + (reg (cadr value))) + (declare (type (unsigned-byte 1) rex.r) + (type (unsigned-byte 3) reg)) + (+ (ash rex.r 3) reg))) + :printer #'print-word-reg) + (sb!disassem:define-arg-type imm-addr :prefilter #'read-address :printer #'print-label) @@ -392,6 +406,19 @@ :tab accum ", " imm)) (imm :type 'imm-data)) +(sb!disassem:define-instruction-format (modrm-reg-no-width 24 + :default-printer '(:name :tab reg)) + (rex :field (byte 4 4) :value #b0100) + (rexw :field (byte 3 1)) + (rexx :field (byte 1 1)) + (op :field (byte 8 8)) + (mod :field (byte 2 22)) + (reg :fields (list (byte 2 1) (byte 3 19)) :type 'modrm-word-reg) ;; includes rex.r + (r/m :fields (list (byte 0 1) (byte 3 16))) ;; includes rex.b + ;; optional fields + (accum :type 'word-accum) + (imm)) + (sb!disassem:define-instruction-format (reg-no-width 8 :default-printer '(:name :tab reg)) (op :field (byte 5 3)) @@ -441,6 +468,18 @@ (op :field (byte 6 2)) (dir :field (byte 1 1))) +(sb!disassem:define-instruction-format (rex-reg/mem 24 + :default-printer '(:name :tab reg/mem)) + (rex :field (byte 4 4) :value #b0100) + (rexw :field (byte 3 1)) + (rexx :field (byte 1 1)) + (op :field (byte 8 8)) + (width :field (byte 1 8) :type 'width) ;; KMR: this isn't correct + (reg/mem :fields (list (byte 2 22) (byte 3 16)) + :type 'sized-reg/mem) + ;; optional fields + (imm)) + ;;; Same as reg-rem/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)) @@ -1144,6 +1183,7 @@ (define-instruction pop (segment dst) (:printer reg-no-width ((op #b01011))) + (:printer rex-reg/mem ((op #b10001111))) (:printer reg/mem ((op '(#b1000111 #b000)) (width 1))) (:emitter (let ((size (operand-size dst))) @@ -1374,7 +1414,7 @@ (define-instruction dec (segment dst) ;; Register. - (:printer reg-no-width ((op #b01001))) + (:printer modrm-reg-no-width ((op #b11111111) (mod #b11))) ;; Register/Memory (:printer reg/mem ((op '(#b1111111 #b001)))) (:emitter |