[movitz-cvs] CVS movitz
ffjeld
ffjeld at common-lisp.net
Fri Jan 18 21:37:42 UTC 2008
Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv18702
Modified Files:
asm-x86.lisp
Log Message:
More instructions.
--- /project/movitz/cvsroot/movitz/asm-x86.lisp 2008/01/03 10:34:18 1.5
+++ /project/movitz/cvsroot/movitz/asm-x86.lisp 2008/01/18 21:37:41 1.6
@@ -6,7 +6,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: asm-x86.lisp,v 1.5 2008/01/03 10:34:18 ffjeld Exp $
+;;;; $Id: asm-x86.lisp,v 1.6 2008/01/18 21:37:41 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -102,7 +102,9 @@
prefixes))
(append (mapcar #'prefix-lookup (reverse prefixes))
(rex-encode rexes :rm rm)
- (when (< 8(integer-length opcode))
+ (when (< 16 (integer-length opcode))
+ (list (ldb (byte 8 16) opcode)))
+ (when (< 8(integer-length opcode))
(list (ldb (byte 8 8) opcode)))
(list (ldb (byte 8 0) opcode))
(when (or mod reg rm)
@@ -479,7 +481,8 @@
((and (not reg2)
register-index
(= 1 reg-scale)
- (zerop offset))
+ (and (zerop offset)
+ (not (= register-index #b101))))
(encoded-values :mod #b00
:rm register-index
:address-size address-size))
@@ -803,7 +806,7 @@
;;;;;;;;;;; BOUND, BSF, BSR, BSWAP
-(define-operator* (:16 :boundw :32 :boundl) (bounds reg)
+(define-operator* (:16 :boundw :32 :bound) (bounds reg)
(reg-modrm reg bounds #x62))
(define-operator* (:16 :bsfw :32 :bsfl :64 :bsfr) (src dst)
@@ -954,56 +957,6 @@
(reg-modrm dst src #x3b)
(reg-modrm src dst #x39))
-;;;;;;;;;;; MOV
-
-(define-operator/8 :movb (src dst)
- (when (eq src :al)
- (moffset #xa2 dst (uint 8)))
- (when (eq dst :al)
- (moffset #xa0 src (uint 8)))
- (opcode-reg-imm #xb0 dst src (xint 8))
- (imm-modrm src dst #xc6 0 (xint 8))
- (reg-modrm dst src #x8a)
- (reg-modrm src dst #x88))
-
-(define-operator/16 :movw (src dst)
- (when (eq src :ax)
- (moffset #xa3 dst (uint 16)))
- (when (eq dst :ax)
- (moffset #xa0 src (uint 16)))
- (opcode-reg-imm #xb8 dst src (xint 16))
- (imm-modrm src dst #xc7 0 (xint 16))
- (sreg-modrm src dst #x8c)
- (sreg-modrm dst src #x8e)
- (reg-modrm dst src #x8b)
- (reg-modrm src dst #x89))
-
-(define-operator/32 :movl (src dst)
- (when (eq src :eax)
- (moffset #xa3 dst (uint 32)))
- (when (eq dst :eax)
- (moffset #xa0 src (uint 32)))
- (opcode-reg-imm #xb8 dst src (xint 32))
- (imm-modrm src dst #xc7 0 (xint 32))
- (reg-modrm dst src #x8b)
- (reg-modrm src dst #x89))
-
-;;;;;;;;;;; POP
-
-(define-operator* (:16 :popw :32 :popl) (dst)
- (case dst
- (:ds (yield :opcode #x1f))
- (:es (yield :opcode #x07))
- (:ss (yield :opcode #x17))
- (:fs (yield :opcode #x0fa1))
- (:gs (yield :opcode #x0fa9)))
- (opcode-reg #x58 dst)
- (modrm dst #x8f 0))
-
-(define-operator/64* :popr (dst)
- (opcode-reg #x58 dst)
- (modrm dst #x8f 0))
-
;;;;;;;;;;; CMPXCHG
(define-operator/8 :cmpxchgb (cmp-reg cmp-modrm al-dst)
@@ -1206,6 +1159,11 @@
(define-jcc :jpo #x7b)
(define-jcc :js #x78)
(define-jcc :jz #x74)
+
+(define-operator* (:16 :jcxz :32 :jecxz :64 :jrcxz) (dst)
+ (pc-rel #xe3 dst (sint 8)
+ :operand-size operator-mode
+ :rex default-rex))
;;;;;;;;;;; JMP
@@ -1242,6 +1200,131 @@
(define-operator* (:16 :lidtw :32 :lidtl :64 :lidtr) (addr)
(modrm addr #x0f01 3))
+;;;;;;;;;;; LFENCE
+
+(define-operator :lfence ()
+ (opcode #x0faee8))
+
+;;;;;;;;;;; LOOP, LOOPE, LOOPNE
+
+(define-operator :loop (dst)
+ (pc-rel #xe2 dst (sint 8)))
+
+(define-operator :loope (dst)
+ (pc-rel #xe1 dst (sint 8)))
+
+(define-operator :loopne (dst)
+ (pc-rel #xe0 dst (sint 8)))
+
+;;;;;;;;;;; MOV
+
+(define-operator/8 :movb (src dst)
+ (when (eq src :al)
+ (moffset #xa2 dst (uint 8)))
+ (when (eq dst :al)
+ (moffset #xa0 src (uint 8)))
+ (opcode-reg-imm #xb0 dst src (xint 8))
+ (imm-modrm src dst #xc6 0 (xint 8))
+ (reg-modrm dst src #x8a)
+ (reg-modrm src dst #x88))
+
+(define-operator/16 :movw (src dst)
+ (when (eq src :ax)
+ (moffset #xa3 dst (uint 16)))
+ (when (eq dst :ax)
+ (moffset #xa0 src (uint 16)))
+ (opcode-reg-imm #xb8 dst src (xint 16))
+ (imm-modrm src dst #xc7 0 (xint 16))
+ (sreg-modrm src dst #x8c)
+ (sreg-modrm dst src #x8e)
+ (reg-modrm dst src #x8b)
+ (reg-modrm src dst #x89))
+
+(define-operator/32 :movl (src dst)
+ (when (eq src :eax)
+ (moffset #xa3 dst (uint 32)))
+ (when (eq dst :eax)
+ (moffset #xa0 src (uint 32)))
+ (opcode-reg-imm #xb8 dst src (xint 32))
+ (imm-modrm src dst #xc7 0 (xint 32))
+ (reg-modrm dst src #x8b)
+ (reg-modrm src dst #x89))
+
+;;;;;;;;;;; MOVSX
+
+(define-operator* (:32 :movsxb) (src dst)
+ (reg-modrm dst src #x0fbe))
+
+(define-operator* (:32 :movsxw) (src dst)
+ (reg-modrm dst src #x0fbf))
+
+;;;;;;;;;;; MOVZX
+
+(define-operator* (:32 :movzxb) (src dst)
+ (reg-modrm dst src #x0fb6))
+
+(define-operator* (:32 :movzxw) (src dst)
+ (reg-modrm dst src #x0fb7))
+
+;;;;;;;;;;; OR
+
+(define-operator/8 :orb (src dst)
+ (when (eq dst :al)
+ (imm src #x0c (xint 8)))
+ (imm-modrm src dst #x80 1 (xint 8))
+ (reg-modrm dst src #x0a)
+ (reg-modrm src dst #x08))
+
+(define-operator* (:16 :orw :32 :orl :64 :orr) (src dst)
+ (imm-modrm src dst #x83 1 (sint 8))
+ (when (eq dst :ax-eax-rax)
+ (imm src #x0d :int-16-32-64))
+ (imm-modrm src dst #x81 1 :int-16-32-64)
+ (reg-modrm dst src #x0b)
+ (reg-modrm src dst #x09))
+
+;;;;;;;;;;; OUT
+
+(define-operator/8 :outb (src port)
+ (when (eq :al src)
+ (typecase port
+ ((eql :dx)
+ (opcode #xee))
+ ((uint 8)
+ (imm port #xe6 (uint 8))))))
+
+(define-operator/16 :outw (src port)
+ (when (eq :ax src)
+ (typecase port
+ ((eql :dx)
+ (opcode #xef))
+ ((uint 8)
+ (imm port #xe7 (uint 8))))))
+
+(define-operator/32 :outl (src port)
+ (when (eq :eax src)
+ (typecase port
+ ((eql :dx)
+ (opcode #xef))
+ ((uint 8)
+ (imm port #xe7 (uint 8))))))
+
+;;;;;;;;;;; POP
+
+(define-operator* (:16 :popw :32 :popl) (dst)
+ (case dst
+ (:ds (yield :opcode #x1f))
+ (:es (yield :opcode #x07))
+ (:ss (yield :opcode #x17))
+ (:fs (yield :opcode #x0fa1))
+ (:gs (yield :opcode #x0fa9)))
+ (opcode-reg #x58 dst)
+ (modrm dst #x8f 0))
+
+(define-operator/64* :popr (dst)
+ (opcode-reg #x58 dst)
+ (modrm dst #x8f 0))
+
;;;;;;;;;;; PUSH
(define-operator* (:16 :pushw :32 :pushl) (src)
@@ -1268,3 +1351,106 @@
(define-operator :ret ()
(opcode #xc3))
+
+;;;;;;;;;;; SAR
+
+(define-operator/8 :sarb (count dst)
+ (case count
+ (1 (modrm dst #xd0 7))
+ (:cl (modrm dst #xd2 7)))
+ (imm-modrm count dst #xc0 7 (uint 8)))
+
+(define-operator* (:16 :sarw :32 :sarl :64 :sarr) (count dst)
+ (case count
+ (1 (modrm dst #xd1 7))
+ (:cl (modrm dst #xd3 7)))
+ (imm-modrm count dst #xc1 7 (uint 8)))
+
+;;;;;;;;;;; SHL
+
+(define-operator/8 :shlb (count dst)
+ (case count
+ (1 (modrm dst #xd0 4))
+ (:cl (modrm dst #xd2 4)))
+ (imm-modrm count dst #xc0 4 (uint 8)))
+
+(define-operator* (:16 :shlw :32 :shll :64 :shlr) (count dst)
+ (case count
+ (1 (modrm dst #xd1 4))
+ (:cl (modrm dst #xd3 4)))
+ (imm-modrm count dst #xc1 4 (uint 8)))
+
+;;;;;;;;;;; SHR
+
+(define-operator/8 :shrb (count dst)
+ (case count
+ (1 (modrm dst #xd0 5))
+ (:cl (modrm dst #xd2 5)))
+ (imm-modrm count dst #xc0 5 (uint 8)))
+
+(define-operator* (:16 :shrw :32 :shrl :64 :shrr) (count dst)
+ (case count
+ (1 (modrm dst #xd1 5))
+ (:cl (modrm dst #xd3 5)))
+ (imm-modrm count dst #xc1 5 (uint 8)))
+
+;;;;;;;;;;; STC, STD, STI
+
+(define-operator :stc ()
+ (opcode #xf9))
+
+(define-operator :std ()
+ (opcode #xfd))
+
+(define-operator :sti ()
+ (opcode #xfb))
+
+;;;;;;;;;;; SUB
+
+(define-operator/8 :subb (subtrahend dst)
+ (when (eq dst :al)
+ (imm subtrahend #x2c (xint 8)))
+ (imm-modrm subtrahend dst #x80 5 (xint 8))
+ (reg-modrm dst subtrahend #x2a)
+ (reg-modrm subtrahend dst #x28))
+
+(define-operator* (:16 :subw :32 :subl :64 :subr) (subtrahend dst)
+ (imm-modrm subtrahend dst #x83 5 (sint 8))
+ (when (eq dst :ax-eax-rax)
+ (imm subtrahend #x2d :int-16-32-64))
+ (imm-modrm subtrahend dst #x81 5 :int-16-32-64)
+ (reg-modrm dst subtrahend #x2b)
+ (reg-modrm subtrahend dst #x29))
+
+;;;;;;;;;;; TEST
+
+(define-operator/8 :testb (mask dst)
+ (when (eq dst :al)
+ (imm mask #xa8 (xint 8)))
+ (imm-modrm mask dst #xf6 0 (xint 8))
+ (reg-modrm mask dst #x84))
+
+(define-operator* (:16 :testw :32 :testl :64 :testr) (mask dst)
+ (when (eq dst :ax-eax-rax)
+ (imm mask #xa9 :int-16-32-64))
+ (imm-modrm mask dst #xf7 0 :int-16-32-64)
+ (reg-modrm mask dst #x85))
+
+
+;;;;;;;;;;; XOR
+
+
+(define-operator/8 :xorb (src dst)
+ (when (eq dst :al)
+ (imm src #x34 (xint 8)))
+ (imm-modrm src dst #x80 6 (xint 8))
+ (reg-modrm dst src #x32)
+ (reg-modrm src dst #x30))
+
+(define-operator* (:16 :xorw :32 :xorl :64 :xorr) (src dst)
+ (imm-modrm src dst #x83 6 (sint 8))
+ (when (eq dst :ax-eax-rax)
+ (imm src #x35 :int-16-32-64))
+ (imm-modrm src dst #x81 6 :int-16-32-64)
+ (reg-modrm dst src #x33)
+ (reg-modrm src dst #x31))
More information about the Movitz-cvs
mailing list