[movitz-cvs] CVS movitz

ffjeld ffjeld at common-lisp.net
Tue Feb 5 22:40:54 UTC 2008


Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv11463

Modified Files:
	asm-x86.lisp 
Log Message:
Improve misc. instruction support.


--- /project/movitz/cvsroot/movitz/asm-x86.lisp	2008/02/04 21:03:35	1.17
+++ /project/movitz/cvsroot/movitz/asm-x86.lisp	2008/02/05 22:40:54	1.18
@@ -6,12 +6,15 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: asm-x86.lisp,v 1.17 2008/02/04 21:03:35 ffjeld Exp $
+;;;; $Id: asm-x86.lisp,v 1.18 2008/02/05 22:40:54 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
 (defpackage asm-x86
-  (:use :common-lisp :asm))
+  (:use :common-lisp :asm)
+  (:export #:encode-instruction
+	   #:*cpu-mode*
+	   #:*position-independent-p*))
 
 (in-package asm-x86)
 
@@ -133,7 +136,6 @@
 (defmacro encode (values-form)
   `(multiple-value-call #'encode-values-fun operator legacy-prefixes ,values-form))
 
-
 (defmacro merge-encodings (form1 form2)
   `(multiple-value-bind (prefixes1 rexes1 opcode1 mod1 reg1 rm1 scale1 index1 base1 displacement1 immediate1 operand-size1 address-size1)
        ,form1
@@ -372,7 +374,7 @@
 						  (:64-bit '(:rax :rcx :rdx :rbx :rsp :rbp :rsi :rdi :r8 :r9 :r10 :r11 :r12 :13 :r14 :r15))
 						  (:mm '(:mm0 :mm1 :mm2 :mm3 :mm4 :mm5 :mm6 :mm7))
 						  (:xmm '(:xmm0 :xmm1 :xmm2 :xmm3 :xmm4 :xmm5 :xmm6 :xmm7))))
-			      (error "Unknown ~D-bit register ~S." mode operand)))
+			      (error "Unknown ~(~D~) register ~S." mode operand)))
       (multiple-value-bind (reg offsets reg2 reg-scale)
 	  (parse-indirect-operand operand)
 	(check-type reg-scale (member nil 1 2 4 8))
@@ -702,7 +704,7 @@
 				       :rex default-rex)
 		       (encode-reg/mem ,operand operator-mode)))))
 
-(defun encode-reg-modrm (operator legacy-prefixes op-reg op-modrm opcode operator-mode default-rex &rest extras)
+(defun encode-reg-modrm (operator legacy-prefixes op-reg op-modrm opcode operator-mode default-rex &optional reg/mem-mode &rest extras)
   (let* ((reg-map (ecase operator-mode
 		    (:8-bit '(:al :cl :dl :bl :ah :ch :dh :bh))
 		    (:16-bit '(:ax :cx :dx :bx :sp :bp :si :di))
@@ -718,11 +720,10 @@
 				      :operand-size operator-mode
 				      :rex default-rex
 				      extras)
-			       (encode-reg/mem op-modrm operator-mode))))))
-
-(defmacro reg-modrm (op-reg op-modrm opcode &rest extras)
-  `(return-when (encode-reg-modrm operator legacy-prefixes ,op-reg ,op-modrm ,opcode operator-mode default-rex , at extras)))
+			       (encode-reg/mem op-modrm (or reg/mem-mode operator-mode)))))))
 
+(defmacro reg-modrm (op-reg op-modrm opcode &optional reg/mem-mode &rest extras)
+  `(return-when (encode-reg-modrm operator legacy-prefixes ,op-reg ,op-modrm ,opcode operator-mode default-rex ,reg/mem-mode , at extras)))
 
 (defun encode-reg-cr (operator legacy-prefixes op-reg op-cr opcode operator-mode default-rex &rest extras)
   (let* ((reg-map (ecase operator-mode
@@ -1140,10 +1141,12 @@
   (typecase factor
     ((sint 8)
      (reg-modrm product1 product2 #x6b
-      :displacement (encode-integer factor '(sint 8))))
+		nil
+		:displacement (encode-integer factor '(sint 8))))
     ((sint 32)
      (reg-modrm product1 product2 #x69
-      :displacement (encode-integer factor '(sint 32))))))
+		nil
+		:displacement (encode-integer factor '(sint 32))))))
 
 ;;;;;;;;;;; IN
 
@@ -1264,7 +1267,8 @@
   (pc-rel #xe9 dst (sint 32))
   (when (or (not *position-independent-p*)
 	    (indirect-operand-p dst))
-    (modrm dst #xff 4)))
+    (let ((operator-mode :32-bit))
+      (modrm dst #xff 4))))
 
 (define-operator* (:16 :jmpw-segment :32 :jmp-segment :64 :jmpr-segment) (addr)
   (modrm addr #xff 5))
@@ -1292,6 +1296,11 @@
 (define-operator :leave ()
   (opcode #xc9))
 
+;;;;;;;;;;; LFENCE
+
+(define-operator :lfence ()
+  (opcode #x0faee8))
+
 ;;;;;;;;;;; LGDT, LIDT
 
 (define-operator* (:16 :lgdtw :32 :lgdt :64 :lgdtr) (addr)
@@ -1300,10 +1309,10 @@
 (define-operator* (:16 :lidtw :32 :lidt :64 :lidtr) (addr)
   (modrm addr #x0f01 3))
 
-;;;;;;;;;;; LFENCE
+;;;;;;;;;;; LMSW
 
-(define-operator :lfence ()
-  (opcode #x0faee8))
+(define-operator/16 :lmsw (src)
+  (modrm src #x0f01 6))
 
 ;;;;;;;;;;; LOOP, LOOPE, LOOPNE
 
@@ -1360,6 +1369,17 @@
   (reg-cr src dst #x0f22)
   (reg-cr dst src #x0f20))
 
+;;;;;;;;;;; MOVS
+
+(define-operator/8 :movsb ()
+  (opcode #xa4))
+
+(define-operator/16 :movsw ()
+  (opcode #xa5))
+
+(define-operator/32 :movsl ()
+  (opcode #xa5))
+
 ;;;;;;;;;;; MOVSX
 
 (define-operator* (:32 :movsxb) (src dst)
@@ -1371,7 +1391,7 @@
 ;;;;;;;;;;; MOVZX
 
 (define-operator* (:32 :movzxb) (src dst)
-  (reg-modrm dst src #x0fb6))
+  (reg-modrm dst src #x0fb6 :8-bit))
 
 (define-operator* (:32 :movzxw) (src dst)
   (reg-modrm dst src #x0fb7))
@@ -1578,6 +1598,7 @@
     (let ((immediate (resolve-operand count)))
       (when (typep immediate '(uint #x8))
 	(reg-modrm dst1 dst2 #x0fa4
+		   nil
 		   :immediate (encode-integer count '(uint 8)))))))
 
 ;;;;;;;;;;; SHR
@@ -1603,6 +1624,7 @@
     (let ((immediate (resolve-operand count)))
       (when (typep immediate '(uint #x8))
 	(reg-modrm dst1 dst2 #x0fac
+		   nil
 		   :immediate (encode-integer count '(uint 8)))))))
     
 
@@ -1648,7 +1670,10 @@
   (imm-modrm mask dst #xf7 0 :int-16-32-64)
   (reg-modrm mask dst #x85))
 
-;;;;;;;;;;; XCHG
+;;;;;;;;;;; WBINVD, WSRMSR
+
+(define-operator :wbinvd ()
+  (opcode #x0f09))
 
 (define-operator :wrmsr ()
   (opcode #x0f30))




More information about the Movitz-cvs mailing list