[Git][cmucl/cmucl][issue-97-define-ud2-inst] Modify UD1 inst so it prints out registers correctly

Raymond Toy gitlab at common-lisp.net
Fri Apr 9 23:14:59 UTC 2021



Raymond Toy pushed to branch issue-97-define-ud2-inst at cmucl / cmucl


Commits:
cfb35624 by Raymond Toy at 2021-04-09T16:14:44-07:00
Modify UD1 inst so it prints out registers correctly

Hack the definition of the ud1 instruction format so that the reg/mem
field is really a word register.  This then makes the pending
interrupt trap print out as "ud1 ecx, ecx" instead of "ud1 ecx, cl".

I don't know why the printer wanted to print cl, but `print-reg` was
passing `:byte` as the size (from the dstate `'width`).

This works around the issue.

- - - - -


1 changed file:

- src/compiler/x86/insts.lisp


Changes:

=====================================
src/compiler/x86/insts.lisp
=====================================
@@ -2062,13 +2062,20 @@
  (code :field (byte 8 8)))
 
 
+;; The UD1 instruction.  The mod bits of the mod r/m byte MUST be #b11
+;; so that the reg/mem field is actually a register.  This is a hack
+;; to allow us to print out the reg/mem reg as a 32 reg.  Using just
+;; reg/mem, the register sometimes printed out as a byte reg and I
+;; (toy.raymond) don't know why.
 (disassem:define-instruction-format
     (ud1 24 :default-printer '(:name :tab reg ", " reg/mem))
   (prefix    :field (byte 8 0) :value #b00001111)
   (op        :field (byte 8 8) :value #b10111001)
-  (reg/mem   :fields (list (byte 2 22) (byte 3 16))
-	     :type 'reg/mem)
-  (reg	     :field (byte 3 19) :type 'word-reg))
+  ;; The mod bits ensure that the reg/mem field is interpreted as a
+  ;; register, not memory.
+  (reg/mem   :field (byte 3 16) :type 'word-reg)
+  (reg	     :field (byte 3 19) :type 'word-reg)
+  (mod       :field (byte 2 22) :value #b11))
 
 (defun snarf-error-junk (sap offset &optional length-only)
   (let* ((length (system:sap-ref-8 sap offset))
@@ -2125,7 +2132,7 @@
 ;; We just want the trap code in the third byte of the instruction.
 (define-instruction ud1 (segment code)
   (:declare (type (unsigned-byte 8) code))
-  (:printer ud1 ((op #b10111001))
+  (:printer ud1 ((op #b10111001) (reg nil :type 'word-reg))
 	    :default
 	    :control #'ud1-control)
   (:emitter



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/cfb35624edee9113a81d900066dc2a9d70e7117c

-- 
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/cfb35624edee9113a81d900066dc2a9d70e7117c
You're receiving this email because of your account on gitlab.common-lisp.net.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20210409/f7e850ee/attachment-0001.html>


More information about the cmucl-cvs mailing list