[movitz-cvs] CVS movitz
ffjeld
ffjeld at common-lisp.net
Sat Feb 16 19:14:11 UTC 2008
Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv6436
Modified Files:
asm-x86.lisp
Log Message:
More consistent names for the essential operators in the asm and asm-x86 packages.
--- /project/movitz/cvsroot/movitz/asm-x86.lisp 2008/02/16 18:01:07 1.22
+++ /project/movitz/cvsroot/movitz/asm-x86.lisp 2008/02/16 19:14:08 1.23
@@ -6,13 +6,14 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: asm-x86.lisp,v 1.22 2008/02/16 18:01:07 ffjeld Exp $
+;;;; $Id: asm-x86.lisp,v 1.23 2008/02/16 19:14:08 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
(defpackage asm-x86
(:use :common-lisp :asm)
- (:export #:encode-instruction
+ (:export #:assemble-instruction
+ #:disassemble-instruction
#:*cpu-mode*
#:*position-independent-p*))
@@ -167,7 +168,6 @@
:address-size (getone address-size1 address-size2 address-size))))))
-
(defun encoded-values (&key prefixes prefix rex opcode mod reg rm scale index base displacement immediate operand-size address-size)
(values (append (when prefix
(list prefix))
@@ -183,7 +183,8 @@
operand-size
address-size))
-(defun encode-instruction (instruction)
+(defun assemble-instruction (instruction)
+ "Assemble a single instruction to a list of octets of x86 machine code, according to *cpu-mode* etc."
(multiple-value-bind (instruction legacy-prefixes options)
(if (listp (car instruction))
(values (cdr instruction)
@@ -216,7 +217,7 @@
(cond
((atom body)
nil)
- ((member (car body) '(reg-modrm modrm opcode imm-modrm imm))
+ ((member (car body) '(reg-modrm modrm opcode imm-modrm imm opcode-reg))
(list body))
(t (mapcan #'find-forms body)))))
(let ((defun-name (intern (format nil "~A-~A" 'instruction-encoder operator))))
@@ -330,7 +331,6 @@
0)
(destructuring-bind (operator operand-size decoder-function &rest extra-args)
decoder
- (warn "extraS: ~S" extra-args)
(values (code-call (apply decoder-function
code
operator
@@ -874,6 +874,14 @@
:imm (code-call (decode-integer code imm-type))))
code))
+(defun decode-opcode-reg (code operator opcode operand-size address-size rex operand-ordering extra-operand)
+ (values (list* operator
+ (order-operands operand-ordering
+ :reg (nth (ldb (byte 3 0) opcode)
+ (register-set-by-mode operand-size))
+ :extra extra-operand))
+ code))
+
(defun decode-reg-modrm-16 (code operand-size)
(let* ((modrm (pop-code code mod/rm))
(mod (ldb (byte 2 6) modrm))
@@ -1156,9 +1164,26 @@
'(:rex.w :rex.r))
(t default-rex)))))))
-(defmacro opcode-reg (opcode op-reg)
- `(return-when
- (encode-opcode-reg operator legacy-prefixes ,opcode ,op-reg operator-mode default-rex)))
+(defmacro opcode-reg (opcode op-reg &optional extra-operand)
+ `(progn
+ (assembler
+ (when (and ,@(when extra-operand
+ `((eql , at extra-operand))))
+ (return-when
+ (encode-opcode-reg operator legacy-prefixes ,opcode ,op-reg operator-mode default-rex))))
+ (disassembler
+ (loop for reg from #b000 to #b111
+ do ,(if (not extra-operand)
+ `(define-disassembler (operator (logior ,opcode reg) operator-mode)
+ decode-opcode-reg
+ '(:reg)
+ nil)
+ `(define-disassembler (operator (logior ,opcode reg) operator-mode)
+ decode-opcode-reg
+ (operand-ordering operand-formals
+ :reg ',op-reg
+ :extra ',(first extra-operand))
+ ',(second extra-operand)))))))
(defun encode-opcode-reg-imm (operator legacy-prefixes opcode op-reg op-imm type operator-mode default-rex)
(when (immediate-p op-imm)
@@ -2089,10 +2114,8 @@
(reg-modrm x y #x86))
(define-operator* (:16 :xchgw :32 :xchgl :64 :xchgr) (x y)
- (when (eq y :ax-eax-rax)
- (opcode-reg #x90 x))
- (when (eq x :ax-eax-rax)
- (opcode-reg #x90 y))
+ (opcode-reg #x90 x (y :ax-eax-rax))
+ (opcode-reg #x90 y (x :ax-eax-rax))
(reg-modrm x y #x87)
(reg-modrm y x #x87))
More information about the Movitz-cvs
mailing list