Initial revision
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Fri, 14 Aug 1987 05:05:26 +0000 (05:05 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Fri, 14 Aug 1987 05:05:26 +0000 (05:05 +0000)
v7/src/compiler/machines/vax/instr1.scm [new file with mode: 0644]
v7/src/compiler/machines/vax/instr2.scm [new file with mode: 0644]
v7/src/compiler/machines/vax/instr3.scm [new file with mode: 0644]

diff --git a/v7/src/compiler/machines/vax/instr1.scm b/v7/src/compiler/machines/vax/instr1.scm
new file mode 100644 (file)
index 0000000..ff9efd2
--- /dev/null
@@ -0,0 +1,297 @@
+#| -*-Scheme-*-
+
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/vax/instr1.scm,v 1.1 1987/08/14 05:04:50 jinx Exp $
+
+Copyright (c) 1987 Massachusetts Institute of Technology
+
+This material was developed by the Scheme project at the Massachusetts
+Institute of Technology, Department of Electrical Engineering and
+Computer Science.  Permission to copy this software, to redistribute
+it, and to use it for any purpose is granted, subject to the following
+restrictions and understandings.
+
+1. Any copy made of this software must include this copyright notice
+in full.
+
+2. Users of this software agree to make their best efforts (a) to
+return to the MIT Scheme project any improvements or extensions that
+they make, so that these may be included in future releases; and (b)
+to inform MIT of noteworthy uses of this software.
+
+3. All materials developed as a consequence of the use of this
+software shall duly acknowledge such use, in accordance with the usual
+standards of acknowledging credit in academic research.
+
+4. MIT has made no warrantee or representation that the operation of
+this software will be error-free, and MIT is under no obligation to
+provide any services, by way of maintenance, update, or otherwise.
+
+5. In conjunction with products arising from the use of this material,
+there shall be no use of the name of the Massachusetts Institute of
+Technology nor of any adaptation thereof in any advertising,
+promotional, or sales literature without prior written consent from
+MIT in each case. |#
+
+;;;; VAX Instruction Set Description, Part 1
+
+;;; The ordering is essentially that in "Vax Architecture Handbook" 1981.
+
+(declare (usual-integrations))
+\f
+;;;; REMARKS
+
+#|
+
+A) There are three types of operand specifiers:
+
+    - General addressing mode operand specifier, with matching pattern syntax
+
+      (? foo ea-<access-type>-<operand-type>)
+
+      Access types and operand types are described on the "Vax Architecture
+      Handbook", on Appendix E. 
+      They are implemented in insutl.scm
+
+    - Displacement for branch instructions.  The matching pattern syntax is
+
+      (? value displacement)
+
+      This matches either (@PCO offset) or (@PCR label).
+
+    - Immediate operand.  Only the BUG instruction uses this.  The
+      matching syntax is (? value).      
+
+B) The instruction set is currently incomplete.  In particular, none
+of the instructions in chapters 14 or 16 are below.  The missing
+opcodes are
+
+- Chap. 14: MOVC, MOVTC, MOVTUC, CMPC, SCANC, SPANC, LOCC, SKPC,
+            MATCHC, CRC.
+
+- Chap. 16: EDITPC.
+
+|#
+\f
+;; Utility
+
+(define-macro (define-trivial-instruction mnemonic opcode)
+  `(define-instruction ,mnemonic
+     (()
+      (BYTE (8 ,opcode)))))
+
+;; Pseudo-op
+
+(define-instruction DC
+  ((B (? value))
+   (BYTE (8 value SIGNED)))
+
+  ((W (? value))
+   (BYTE (16 value SIGNED)))
+
+  ((L (? value))
+   (BYTE (32 value SIGNED))))
+
+;;; Privilleged and miscellaneous (Chap. 10)
+
+(define-instruction CHM
+  ((K (? code ea-r-w))         ; kernel
+   (BYTE (8 #xBC))
+   (OPERAND code))
+
+  ((E (? code ea-r-w))         ; executive
+   (BYTE (8 #xBD))
+   (OPERAND code))
+
+  ((S (? code ea-r-w))         ; supervisor
+   (BYTE (8 #xBE))
+   (OPERAND code))
+
+  ((U (? code ea-r-w))         ; user
+   (BYTE (8 #xBF))
+   (OPERAND code)))
+
+(define-instruction PROBE
+  ((R (? mode ea-r-b) (? len ea-r-w) (? base ea-a-b))
+   (BYTE (8 #xOC))
+   (OPERAND mode)
+   (OPERAND len)
+   (OPERAND base))
+
+  ((W (? mode ea-r-b) (? len ea-r-w) (? base ea-a-b))
+   (BYTE (8 #xOD))
+   (OPERAND mode)
+   (OPERAND len)
+   (OPERAND base)))
+
+(define-trivial-instruction REI #x02)
+(define-trivial-instruction LDPCTX #x06)
+(define-trivial-instruction SVPCTX #x07)
+\f
+(define-instruction MTPR
+  (((? src ea-r-l) (? procreg ea-r-l))
+   (BYTE (8 #xDA))
+   (OPERAND src)
+   (OPERAND procreg)))
+
+(define-instruction MFPR
+  (((? procreg ea-r-l) (? dst ea-w-l))
+   (BYTE (8 #xDB))
+   (OPERAND procreg)
+   (OPERAND dst)))
+
+(define-trivial-instruction XFC #xFC)
+
+(define-trivial-instruction BPT #x03)
+
+(define-instruction BUG
+  ((W (? message))
+   (BYTE (16 #xFEFF)
+        (16 message)))
+
+  ((L (? message))
+   (BYTE (16 #xFDFF)
+        (32 message))))
+
+(define-trivial-instruction HALT #x00)
+\f
+;;;; Integer and floating point instructions (Chap. 11)
+
+(define-instruction MOV
+  ((B (? src ea-r-b) (? dst ea-w-b))
+   (BYTE (8 #x90))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W (? src ea-r-w) (? dst ea-w-w))
+   (BYTE (8 #xB0))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L (? src ea-r-l) (? dst ea-w-l))
+   (BYTE (8 #xD0))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((Q (? src ea-r-q) (? dst ea-w-q))
+   (BYTE (8 #x7D))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((O (? src ea-r-o) (? dst ea-w-o))
+   (BYTE (16 #x7DFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F (? src ea-r-f) (? dst ea-w-f))
+   (BYTE (8 #x50))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D (? src ea-r-d) (? dst ea-w-d))
+   (BYTE (8 #x70))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((G (? src ea-r-g) (? dst ea-w-g))
+   (BYTE (16 #x50FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H (? src ea-r-h) (? dst ea-w-h))
+   (BYTE (16 #x70FD))
+   (OPERAND src)
+   (OPERAND dst)))
+
+(define-instruction PUSHL
+  (((? src ea-r-l))
+   (BYTE (8 #XDD))
+   (OPERAND src)))
+\f
+(define-instruction CLR
+  ((B (? dst ea-w-b))
+   (BYTE (8 #x94))
+   (OPERAND dst))
+
+  ((W (? dst ea-w-w))
+   (BYTE (8 #xB4))
+   (OPERAND dst))
+
+  ((L (? dst ea-w-l))
+   (BYTE (8 #xD4))
+   (OPERAND dst))
+
+  ((F (? dst ea-w-f))
+   (BYTE (8 #xD4))
+   (OPERAND dst))
+
+  ((Q (? dst ea-w-q))
+   (BYTE (8 #x7C))
+   (OPERAND dst))
+
+  ((D (? dst ea-w-d))
+   (BYTE (8 #x7C))
+   (OPERAND dst))
+  
+  ((G (? dst ea-w-g))
+   (BYTE (8 #x7C))
+   (OPERAND dst))
+
+  ((O (? dst ea-w-o))
+   (BYTE (16 #x7CFD))
+   (OPERAND dst))
+
+  ((H (? dst ea-w-h))
+   (BYTE (16 #x7CFD))
+   (OPERAND dst)))
+\f
+(define-instruction MNEG
+  ((B (? src ea-r-b) (? dst ea-w-b))
+   (BYTE (8 #x8E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W (? src ea-r-w) (? dst ea-w-w))
+   (BYTE (8 #xAE))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L (? src ea-r-l) (? dst ea-w-l))
+   (BYTE (8 #xCE))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F (? src ea-r-f) (? dst ea-w-f))
+   (BYTE (8 #x52))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D (? src ea-r-d) (? dst ea-w-d))
+   (BYTE (8 #x72))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((G (? src ea-r-g) (? dst ea-w-g))
+   (BYTE (16 #x52FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H (? src ea-r-h) (? dst ea-w-h))
+   (BYTE (16 #x72FD))
+   (OPERAND src)
+   (OPERAND dst)))
+
+(define-instruction MCOM
+  ((B (? src ea-r-b) (? dst ea-w-b))
+   (BYTE (8 #x92))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W (? src ea-r-w) (? dst ea-w-w))
+   (BYTE (8 #xB2))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L (? src ea-r-l) (? dst ea-w-l))
+   (BYTE (8 #xD2))
+   (OPERAND src)
+   (OPERAND dst)))
diff --git a/v7/src/compiler/machines/vax/instr2.scm b/v7/src/compiler/machines/vax/instr2.scm
new file mode 100644 (file)
index 0000000..b3c91f4
--- /dev/null
@@ -0,0 +1,581 @@
+#| -*-Scheme-*-
+
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/vax/instr2.scm,v 1.1 1987/08/14 05:05:08 jinx Exp $
+
+Copyright (c) 1987 Massachusetts Institute of Technology
+
+This material was developed by the Scheme project at the Massachusetts
+Institute of Technology, Department of Electrical Engineering and
+Computer Science.  Permission to copy this software, to redistribute
+it, and to use it for any purpose is granted, subject to the following
+restrictions and understandings.
+
+1. Any copy made of this software must include this copyright notice
+in full.
+
+2. Users of this software agree to make their best efforts (a) to
+return to the MIT Scheme project any improvements or extensions that
+they make, so that these may be included in future releases; and (b)
+to inform MIT of noteworthy uses of this software.
+
+3. All materials developed as a consequence of the use of this
+software shall duly acknowledge such use, in accordance with the usual
+standards of acknowledging credit in academic research.
+
+4. MIT has made no warrantee or representation that the operation of
+this software will be error-free, and MIT is under no obligation to
+provide any services, by way of maintenance, update, or otherwise.
+
+5. In conjunction with products arising from the use of this material,
+there shall be no use of the name of the Massachusetts Institute of
+Technology nor of any adaptation thereof in any advertising,
+promotional, or sales literature without prior written consent from
+MIT in each case. |#
+
+;;;; VAX Instruction Set Description, Part 2
+
+;;; The ordering is essentially that in "Vax Architecture Handbook" 1981.
+
+(declare (usual-integrations))
+\f
+(define-instruction CVT
+  ((B W (? src ea-r-b) (? dst ea-w-w))
+   (BYTE (8 #x99))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((B L (? src ea-r-b) (? dst ea-w-l))
+   (BYTE (8 #x98))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W B (? src ea-r-w) (? dst ea-w-b))
+   (BYTE (8 #x33))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W L (? src ea-r-w) (? dst ea-w-l))
+   (BYTE (8 #x32))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L B (? src ea-r-l) (? dst ea-w-b))
+   (BYTE (8 #xF6))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L W (? src ea-r-l) (? dst ea-w-w))
+   (BYTE (8 #xF7))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((B F (? src ea-r-b) (? dst ea-w-f))
+   (BYTE (8 #x4C))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((B D (? src ea-r-b) (? dst ea-w-d))
+   (BYTE (8 #x6C))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((B G (? src ea-r-b) (? dst ea-w-g))
+   (BYTE (16 #x4CFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((B H (? src ea-r-b) (? dst ea-w-h))
+   (BYTE (16 #x6CFD))
+   (OPERAND src)
+   (OPERAND dst))
+\f
+  ((W F (? src ea-r-w) (? dst ea-w-f))
+   (BYTE (8 #x4D))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W D (? src ea-r-w) (? dst ea-w-d))
+   (BYTE (8 #x6D))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W G (? src ea-r-w) (? dst ea-w-g))
+   (BYTE (16 #x4DFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W H (? src ea-r-w) (? dst ea-w-h))
+   (BYTE (16 #x6DFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L F (? src ea-r-l) (? dst ea-w-f))
+   (BYTE (8 #x4E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L D (? src ea-r-l) (? dst ea-w-d))
+   (BYTE (8 #x6E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L G (? src ea-r-l) (? dst ea-w-g))
+   (BYTE (16 #x4EFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L H (? src ea-r-l) (? dst ea-w-h))
+   (BYTE (16 #x6EFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F B (? src ea-r-f) (? dst ea-w-b))
+   (BYTE (8 #x48))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D B (? src ea-r-d) (? dst ea-w-b))
+   (BYTE (8 #x68))
+   (OPERAND src)
+   (OPERAND dst))
+\f
+  ((G B (? src ea-r-g) (? dst ea-w-b))
+   (BYTE (16 #x48FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H B (? src ea-r-h) (? dst ea-w-b))
+   (BYTE (16 #x68FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F W (? src ea-r-f) (? dst ea-w-w))
+   (BYTE (8 #x49))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D W (? src ea-r-d) (? dst ea-w-w))
+   (BYTE (8 #x69))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((G W (? src ea-r-g) (? dst ea-w-w))
+   (BYTE (16 #x49FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H W (? src ea-r-h) (? dst ea-w-w))
+   (BYTE (16 #x69FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F L T (? src ea-r-f) (? dst ea-w-l))
+   (BYTE (8 #x4A))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F L R (? src ea-r-f) (? dst ea-w-l))
+   (BYTE (8 #x4B))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D L T (? src ea-r-d) (? dst ea-w-l))
+   (BYTE (8 #x6A))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D L R (? src ea-r-d) (? dst ea-w-l))
+   (BYTE (8 #x6B))
+   (OPERAND src)
+   (OPERAND dst))
+\f
+  ((G L T (? src ea-r-g) (? dst ea-w-l))
+   (BYTE (16 #x4AFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((G L R (? src ea-r-g) (? dst ea-w-l))
+   (BYTE (16 #x48FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H L T (? src ea-r-h) (? dst ea-w-l))
+   (BYTE (16 #x6AFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H L R (? src ea-r-h) (? dst ea-w-l))
+   (BYTE (16 #x6BFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F D (? src ea-r-f) (? dst ea-w-d))
+   (BYTE (8 #x56))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F G (? src ea-r-f) (? dst ea-w-g))
+   (BYTE (16 #x99FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F H (? src ea-r-f) (? dst ea-w-h))
+   (BYTE (16 #x98FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D F (? src ea-r-d) (? dst ea-w-f))
+   (BYTE (16 #x76))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D H (? src ea-r-d) (? dst ea-w-h))
+   (BYTE (16 #x32FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((G F (? src ea-r-g) (? dst ea-w-f))
+   (BYTE (16 #x33FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((G H (? src ea-r-g) (? dst ea-w-h))
+   (BYTE (16 #x56FD))
+   (OPERAND src)
+   (OPERAND dst))
+\f
+  ((H F (? src ea-r-h) (? dst ea-w-f))
+   (BYTE (16 #xF6FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H D (? src ea-r-h) (? dst ea-w-d))
+   (BYTE (16 #xF7FD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H G (? src ea-r-h) (? dst ea-w-g))
+   (BYTE (16 #x76FD))
+   (OPERAND src)
+   (OPERAND dst)))
+
+(define-instruction CMP
+  ((B (? src1 ea-r-b) (? src2 ea-r-b))
+   (BYTE (8 #x91))
+   (OPERAND src1)
+   (OPERAND src2))
+
+  ((W (? src1 ea-r-w) (? src2 ea-r-w))
+   (BYTE (8 #xB1))
+   (OPERAND src1)
+   (OPERAND src2))
+
+  ((L (? src1 ea-r-l) (? src2 ea-r-l))
+   (BYTE (8 #xD1))
+   (OPERAND src1)
+   (OPERAND src2))
+
+  ((F (? src1 ea-r-f) (? src2 ea-r-f))
+   (BYTE (8 #x51))
+   (OPERAND src1)
+   (OPERAND src2))
+
+  ((D (? src1 ea-r-d) (? src2 ea-r-d))
+   (BYTE (8 #x71))
+   (OPERAND src1)
+   (OPERAND src2))
+
+  ((G (? src1 ea-r-g) (? src2 ea-r-g))
+   (BYTE (16 #x51FD))
+   (OPERAND src1)
+   (OPERAND src2))
+
+  ((H (? src1 ea-r-h) (? src2 ea-r-h))
+   (BYTE (16 #x71FD))
+   (OPERAND src1)
+   (OPERAND src2)))
+\f
+(define-instruction MOVZ
+  ((B W (? src ea-r-b) (? dst ea-w-w))
+   (BYTE (8 #x9B))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((B L (? src ea-r-b) (? dst ea-w-l))
+   (BYTE (8 #x9A))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W L (? src ea-r-w) (? dst ea-w-l))
+   (BYTE (8 #x3C))
+   (OPERAND src)
+   (OPERAND dst)))
+
+(define-instruction TST
+  ((B (? src ea-r-b))
+   (BYTE (8 #x95))
+   (OPERAND src))
+
+  ((W (? src ea-r-w))
+   (BYTE (8 #xB5))
+   (OPERAND src))
+
+  ((L (? src ea-r-l))
+   (BYTE (8 #xD5))
+   (OPERAND src))
+
+  ((F (? src ea-r-f))
+   (BYTE (8 #x53))
+   (OPERAND src))
+
+  ((D (? src ea-r-d))
+   (BYTE (8 #x73))
+   (OPERAND src))
+
+  ((G (? src ea-r-g))
+   (BYTE (16 #x53FD))
+   (OPERAND src))
+
+  ((H (? src ea-r-h))
+   (BYTE (16 #x73FD))
+   (OPERAND src)))
+\f
+(let-syntax
+    ((define-arithmetic
+       (macro (name digit)
+        `(define-instruction ,name
+           ((B (? op ea-r-b) (? res ea-m-b))
+            (BYTE (8 ,(+ #x80 digit)))
+            (OPERAND op)
+            (OPERAND res))
+
+           ((B (? op1 ea-r-b) (? op2 ea-r-b) (? res ea-w-b))
+            (BYTE (8 ,(+ #x81 digit)))
+            (OPERAND op1)
+            (OPERAND op2)
+            (OPERAND res))
+
+           ((W (? op ea-r-w) (? res ea-m-w))
+            (BYTE (8 ,(+ #xA0 digit)))
+            (OPERAND op)
+            (OPERAND res))
+
+           ((W (? op1 ea-r-w) (? op2 ea-r-w) (? res ea-w-w))
+            (BYTE (8 ,(+ #xA1 digit)))
+            (OPERAND op1)
+            (OPERAND op2)
+            (OPERAND res))
+
+           ((L (? op ea-r-l) (? res ea-m-l))
+            (BYTE (8 ,(+ #xC0 digit)))
+            (OPERAND op)
+            (OPERAND res))
+
+           ((L (? op1 ea-r-l) (? op2 ea-r-l) (? res ea-w-l))
+            (BYTE (8 ,(+ #xC1 digit)))
+            (OPERAND op1)
+            (OPERAND op2)
+            (OPERAND res))
+
+           ((F (? op ea-r-f) (? res ea-m-f))
+            (BYTE (8 ,(+ #x40 digit)))
+            (OPERAND op)
+            (OPERAND res))
+
+           ((F (? op1 ea-r-f) (? op2 ea-r-f) (? res ea-w-f))
+            (BYTE (8 ,(+ #x41 digit)))
+            (OPERAND op1)
+            (OPERAND op2)
+            (OPERAND res))
+\f
+           ((D (? op ea-r-d) (? res ea-m-d))
+            (BYTE (8 ,(+ #x60 digit)))
+            (OPERAND op)
+            (OPERAND res))
+
+           ((D (? op1 ea-r-d) (? op2 ea-r-d) (? res ea-w-d))
+            (BYTE (8 ,(+ #x61 digit)))
+            (OPERAND op1)
+            (OPERAND op2)
+            (OPERAND res))
+
+           ((G (? op ea-r-g) (? res ea-m-g))
+            (BYTE (16 ,(+ #x40FD (* digit #x100))))
+            (OPERAND op)
+            (OPERAND res))
+
+           ((G (? op1 ea-r-g) (? op2 ea-r-g) (? res ea-w-g))
+            (BYTE (16 ,(+ #x41FD (* digit #x100))))
+            (OPERAND op1)
+            (OPERAND op2)
+            (OPERAND res))
+
+           ((H (? op ea-r-h) (? res ea-m-h))
+            (BYTE (16 ,(+ #x60FD (* digit #x100))))
+            (OPERAND op)
+            (OPERAND res))
+
+           ((H (? op1 ea-r-h) (? op2 ea-r-h) (? res ea-w-h))
+            (BYTE (16 ,(+ #x61FD (* digit #x100))))
+            (OPERAND op1)
+            (OPERAND op2)
+            (OPERAND res))))))
+
+  (define-arithmetic ADD #x0)
+  (define-arithmetic SUB #x2)
+  (define-arithmetic MUL #x4)
+  (define-arithmetic DIV #x6))
+
+(define-instruction ADAWI
+  (((? add ea-r-w) (? sum m w))
+   (BYTE (8 #x58))
+   (OPERAND add)
+   (OPERAND sum)))
+\f
+(define-instruction INC
+  ((B (? sum ea-m-b))
+   (BYTE (8 #x96))
+   (OPERAND sum))
+
+  ((W (? sum ea-m-w))
+   (BYTE (8 #xB6))
+   (OPERAND sum))
+
+  ((L (? sum ea-m-l))
+   (BYTE (8 #xD6))
+   (OPERAND sum)))
+
+(define-instruction DEC
+  ((B (? dif ea-m-b))
+   (BYTE (8 #x97))
+   (OPERAND dif))
+
+  ((W (? dif ea-m-w))
+   (BYTE (8 #xB7))
+   (OPERAND dif))
+
+  ((L (? dif ea-m-l))
+   (BYTE (8 #xD7))
+   (OPERAND dif)))
+
+(define-instruction ADWC
+  (((? add ea-r-l) (? sum m l))
+   (BYTE (8 #xD8))
+   (OPERAND add)
+   (OPERAND sum)))
+
+(define-instruction SBWC
+  (((? sub ea-r-l) (? dif m l))
+   (BYTE (8 #xD9))
+   (OPERAND sub)
+   (OPERAND dif)))
+
+(define-instruction EMUL
+  (((? mul1 ea-r-l) (? mul2 ea-r-l) (? add ea-r-l) (? prod ea-w-q))
+   (BYTE (8 #x7A))
+   (OPERAND mul1)
+   (OPERAND mul2)
+   (OPERAND add)
+   (OPERAND prod)))
+
+(define-instruction EDIV
+  (((? divr ea-r-l) (? divd ea-r-q) (? quo ea-w-l) (? rem ea-w-l))
+   (BYTE (8 #x7B))
+   (OPERAND divr)
+   (OPERAND divd)
+   (OPERAND quo)
+   (OPERAND rem)))
+\f
+(define-instruction EMOD
+  ((F (? mulr ea-r-f) (? mulrx ea-r-b) (? muld ea-r-f)
+      (? int ea-w-l) (? fract ea-w-f))
+   (BYTE (8 #x54))
+   (OPERAND mulr)
+   (OPERAND mulrx)
+   (OPERAND muld)
+   (OPERAND int)
+   (OPERAND fract))
+
+  ((D (? mulr ea-r-d) (? mulrx ea-r-b) (? muld ea-r-d)
+      (? int ea-w-l) (? fract ea-w-d))
+   (BYTE (8 #x74))
+   (OPERAND mulr)
+   (OPERAND mulrx)
+   (OPERAND muld)
+   (OPERAND int)
+   (OPERAND fract))
+
+  ((G (? mulr ea-r-g) (? mulrx ea-r-w) (? muld ea-r-g)
+      (? int ea-w-l) (? fract ea-w-g))
+   (BYTE (16 #x54FD))
+   (OPERAND mulr)
+   (OPERAND mulrx)
+   (OPERAND muld)
+   (OPERAND int)
+   (OPERAND fract))
+
+  ((H (? mulr ea-r-h) (? mulrx ea-r-w) (? muld ea-r-h)
+      (? int ea-w-l) (? fract ea-w-h))
+   (BYTE (16 #x74FD))
+   (OPERAND mulr)
+   (OPERAND mulrx)
+   (OPERAND muld)
+   (OPERAND int)
+   (OPERAND fract)))
+
+(define-instruction BIT
+  ((B (? mask ea-r-b) (? src ea-r-b))
+   (BYTE (8 #x93))
+   (OPERAND mask)
+   (OPERAND src))
+
+  ((W (? mask ea-r-w) (? src ea-r-w))
+   (BYTE (8 #xB3))
+   (OPERAND mask)
+   (OPERAND src))
+
+  ((L (? mask ea-r-l) (? src ea-r-l))
+   (BYTE (8 #xD3))
+   (OPERAND mask)
+   (OPERAND src)))
+\f
+(let-syntax
+    ((define-bitwise
+       (macro (name opcode)
+        `(define-instruction ,name
+           ((B (? mask ea-r-b) (? dst ea-m-b))
+            (BYTE (8 ,(+ #x80 opcode)))
+            (OPERAND mask)
+            (OPERAND dst))
+
+           ((B (? mask ea-r-b) (? src ea-r-b) (? dst ea-w-b))
+            (BYTE (8 ,(+ #x81 opcode)))
+            (OPERAND mask)
+            (OPERAND src)
+            (OPERAND dst))
+
+           ((W (? mask ea-r-w) (? dst ea-m-w))
+            (BYTE (8 ,(+ #xA0 opcode)))
+            (OPERAND mask)
+            (OPERAND dst))
+
+           ((W (? mask ea-r-w) (? src ea-r-w) (? dst ea-w-w))
+            (BYTE (8 ,(+ #xA1 opcode)))
+            (OPERAND mask)
+            (OPERAND src)
+            (OPERAND dst))
+           
+           ((L (? mask ea-r-l) (? dst ea-m-l))
+            (BYTE (8 ,(+ #xC0 opcode)))
+            (OPERAND mask)
+            (OPERAND dst))
+
+           ((L (? mask ea-r-l) (? src ea-r-l) (? dst ea-w-l))
+            (BYTE (8 ,(+ #xC1 opcode)))
+            (OPERAND mask)
+            (OPERAND src)
+            (OPERAND dst))))))
+
+  (define-bitwise BIS #x8)
+  (define-bitwise BIC #xA)
+  (define-bitwise XOR #xC))
diff --git a/v7/src/compiler/machines/vax/instr3.scm b/v7/src/compiler/machines/vax/instr3.scm
new file mode 100644 (file)
index 0000000..34b1a7d
--- /dev/null
@@ -0,0 +1,661 @@
+#| -*-Scheme-*-
+
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/vax/instr3.scm,v 1.1 1987/08/14 05:05:26 jinx Exp $
+
+Copyright (c) 1987 Massachusetts Institute of Technology
+
+This material was developed by the Scheme project at the Massachusetts
+Institute of Technology, Department of Electrical Engineering and
+Computer Science.  Permission to copy this software, to redistribute
+it, and to use it for any purpose is granted, subject to the following
+restrictions and understandings.
+
+1. Any copy made of this software must include this copyright notice
+in full.
+
+2. Users of this software agree to make their best efforts (a) to
+return to the MIT Scheme project any improvements or extensions that
+they make, so that these may be included in future releases; and (b)
+to inform MIT of noteworthy uses of this software.
+
+3. All materials developed as a consequence of the use of this
+software shall duly acknowledge such use, in accordance with the usual
+standards of acknowledging credit in academic research.
+
+4. MIT has made no warrantee or representation that the operation of
+this software will be error-free, and MIT is under no obligation to
+provide any services, by way of maintenance, update, or otherwise.
+
+5. In conjunction with products arising from the use of this material,
+there shall be no use of the name of the Massachusetts Institute of
+Technology nor of any adaptation thereof in any advertising,
+promotional, or sales literature without prior written consent from
+MIT in each case. |#
+
+;;;; VAX Instruction Set Description, Part 3
+
+;;; The ordering is essentially that in "Vax Architecture Handbook" 1981.
+
+(declare (usual-integrations))
+\f
+(define-instruction ASH
+  ((L (? cnt ea-r-b) (? src ea-r-l) (? dst ea-w-l))
+   (BYTE (8 #x78))
+   (OPERAND cnt)
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((Q (? cnt ea-r-b) (? src ea-r-q) (? dst ea-w-q))
+   (BYTE (8 #x79))
+   (OPERAND cnt)
+   (OPERAND src)
+   (OPERAND dst)))
+
+(define-instruction ROTL
+  (((? cnt ea-r-b) (? src ea-r-l) (? dst ea-w-l))
+   (BYTE (8 #x9C))
+   (OPERAND cnt)
+   (OPERAND src)
+   (OPERAND dst)))
+
+(define-instruction POLY
+  ((F (? arg ea-r-f) (? degree ea-r-w) (? tbladdr ea-a-b))
+   (BYTE (8 #x55))
+   (OPERAND arg)
+   (OPERAND degree)
+   (OPERAND tbladdr))
+
+  ((D (? arg ea-r-d) (? degree ea-r-w) (? tbladdr ea-a-b))
+   (BYTE (8 #x75))
+   (OPERAND arg)
+   (OPERAND degree)
+   (OPERAND tbladdr))
+
+  ((G (? arg ea-r-g) (? degree ea-r-w) (? tbladdr ea-a-b))
+   (BYTE (16 #x55FD))
+   (OPERAND arg)
+   (OPERAND degree)
+   (OPERAND tbladdr))
+
+  ((H (? arg ea-r-h) (? degree ea-r-w) (? tbladdr ea-a-b))
+   (BYTE (16 #x75FD))
+   (OPERAND arg)
+   (OPERAND degree)
+   (OPERAND tbladdr)))
+\f
+;;;; Special instructions (Chap. 12)
+
+(define-instruction PUSHR
+  (((? mask ea-r-w))
+   (BYTE (8 #xBB))
+   (OPERAND mask)))
+
+(define-instruction POPR
+  (((? mask ea-r-w))
+   (BYTE (8 #xBA))
+   (OPERAND mask)))
+
+(define-instruction MOVPSL
+  (((? dst ea-w-l))
+   (BYTE (8 #xDC))
+   (OPERAND dst)))
+
+(define-instruction BISPSW
+  (((? mask ea-r-w))
+   (BYTE (8 #xB8))
+   (OPERAND mask)))
+
+(define-instruction BICPSW
+  (((? mask ea-r-w))
+   (BYTE (8 #xB9))
+   (OPERAND mask)))
+\f
+(define-instruction MOVA
+  ((B (? src ea-a-b) (? dst ea-w-l))
+   (BYTE (8 #x9E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((W (? src ea-a-w) (? dst ea-w-l))
+   (BYTE (8 #x3E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((L (? src ea-a-l) (? dst ea-w-l))
+   (BYTE (8 #xDE))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((F (? src ea-a-f) (? dst ea-w-l))
+   (BYTE (8 #xDE))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((Q (? src ea-a-q) (? dst ea-w-l))
+   (BYTE (8 #x7E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((D (? src ea-a-d) (? dst ea-w-l))
+   (BYTE (8 #x7E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((G (? src ea-a-g) (? dst ea-w-l))
+   (BYTE (8 #x7E))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((H (? src ea-a-h) (? dst ea-w-l))
+   (BYTE (16 #x7EFD))
+   (OPERAND src)
+   (OPERAND dst))
+
+  ((O (? src ea-a-o) (? dst ea-w-l))
+   (BYTE (16 #x7EFD))
+   (OPERAND src)
+   (OPERAND dst)))
+\f
+(define-instruction PUSHA
+  ((B (? src ea-a-b))
+   (BYTE (8 #x9E))
+   (OPERAND src))
+
+  ((W (? src ea-a-w))
+   (BYTE (8 #x3E))
+   (OPERAND src))
+
+  ((L (? src ea-a-l))
+   (BYTE (8 #xDE))
+   (OPERAND src))
+
+  ((F (? src ea-a-f))
+   (BYTE (8 #xDE))
+   (OPERAND src))
+
+  ((Q (? src ea-a-q))
+   (BYTE (8 #x7E))
+   (OPERAND src))
+
+  ((D (? src ea-a-d))
+   (BYTE (8 #x7E))
+   (OPERAND src))
+
+  ((G (? src ea-a-g))
+   (BYTE (8 #x7E))
+   (OPERAND src))
+
+  ((H (? src ea-a-h))
+   (BYTE (16 #x7EFD))
+   (OPERAND src))
+
+  ((O (? src ea-a-o))
+   (BYTE (16 #x7EFD))
+   (OPERAND src)))
+\f
+;;; Array indeces and queues
+
+(define-instruction INDEX
+  (((? subscript ea-r-l) (? low ea-r-l) (? high ea-r-l)
+    (? size ea-r-l) (? indexin ea-r-l) (? indexout ea-w-l))
+   (BYTE (8 #x0A))
+   (OPERAND subscript)
+   (OPERAND low)
+   (OPERAND high)
+   (OPERAND size)
+   (OPERAND indexin)
+   (OPERAND indexout)))
+
+(define-instruction INSQUE
+  (((? entry ea-a-b) (? pred ea-a-b))
+   (BYTE (8 #x0E))
+   (OPERAND entry)
+   (OPERAND pred)))
+
+(define-instruction REMQUE
+  (((? entry ea-a-b) (? addr ea-w-l))
+   (BYTE (8 #x0F))
+   (OPERAND entry)
+   (OPERAND addr)))
+
+(define-instruction INSQHI
+  (((? entry ea-a-b) (? header ea-a-q))
+   (BYTE (8 #x5C))
+   (OPERAND entry)
+   (OPERAND header)))
+
+(define-instruction INSQTI
+  (((? entry ea-a-b) (? header ea-a-q))
+   (BYTE (8 #x5D))
+   (OPERAND entry)
+   (OPERAND header)))
+
+(define-instruction REMQHI
+  (((? header ea-a-q) (? addr ea-w-l))
+   (BYTE (8 #x5E))
+   (OPERAND header)
+   (OPERAND addr)))
+
+(define-instruction REMQTI
+  (((? header ea-a-q) (? addr ea-w-l))
+   (BYTE (8 #x5F))
+   (OPERAND header)
+   (OPERAND addr)))
+\f
+;;; Bit field instructions
+
+(let-syntax
+    ((define-field-instruction
+       (macro (name suffix1 suffix2 opcode mode)
+        `(define-instruction ,name
+           ((,suffix1 (? pos ea-r-l) (? size ea-r-b) (? base ea-v-b) (? dst ,mode))
+            (BYTE (8 ,opcode))
+            (OPERAND pos)
+            (OPERAND size)
+            (OPERAND base)
+            (OPERAND dst))
+
+           ((,suffix2 (? pos ea-r-l) (? size ea-r-b) (? base ea-v-b) (? dst ,mode))
+            (BYTE (8 ,(1+ opcode2)))
+            (OPERAND pos)
+            (OPERAND size)
+            (OPERAND base)
+            (OPERAND dst))))))
+
+  (define-field-instruction FF S C #xEA ea-w-l)
+  (define-field-instruction EXTV S Z #xEE ea-w-l)
+  (define-field-instruction CMPV S Z #xEC ea-r-l))
+
+(define-instruction INSV
+  (((? src ea-r-l) (? pos ea-r-l) (? size ea-r-b) (? base ea-v-b))
+   (BYTE (8 #xF0))
+   (OPERAND src)
+   (OPERAND pos)
+   (OPERAND size)
+   (OPERAND base)))
+\f
+;;;; Control instructions (Chap. 13)
+
+;; The VAX only has byte offset conditional branch instructions.
+;; Longer displacements are obtained by negating the condition and
+;; branching over an unconditional instruction.
+
+(define-instruction B
+  ((B (? c cc) (? dest displacement))
+   (BYTE (4 c)
+        (4 #x1))
+   (DISPLACEMENT (8 dest)))
+
+  ((W (? c inverse-cc) (? dest displacement))
+   (BYTE (4 c)                         ; (B B (~ cc) (+ *PC* 3))
+        (4 #x1))
+   (DISPLACEMENT (8 3))
+   (BYTE (8 #x31))                     ; (BR W dest)
+   (DISPLACEMENT (16 dest)))
+
+  ;; Self adjusting version. It does not handle @PCO
+  (((? c cc cs) (@PCR (? label)))
+   (VARIABLE-WIDTH
+    (disp `(- ,label (+ *PC* 2)))
+    ((-128 127)
+     (BYTE (4 c)
+          (4 #x1))
+     (BYTE (8 disp SIGNED)))
+     ;; The following range is correct.  Think about it.
+    ((-32765 32770)
+     (BYTE (4 (inverse-cc cs))         ; (B B (~ cc) (+ *PC* 3))
+          (4 #x1))
+     (BYTE (8 #x03))
+     (BYTE (8 #x31))                   ; (BR W label)
+     (BYTE (16 (- disp 3) SIGNED)))
+    ((() ())
+     (BYTE (4 (inverse-cc cs))         ; (B B (~ cc) (+ *PC* 6))
+          (4 #x1))
+     (BYTE (8 #x06))
+     (BYTE (8 #x17))                   ; (JMP (@PCO L label))
+     (BYTE (4 15)
+          (4 14))
+     (BYTE (32 (- disp 6) SIGNED))))))
+\f
+(let-syntax
+    ((define-unconditional-transfer
+       (macro (nameb namej bit)
+        `(begin
+           (define-instruction ,nameb
+             ((B (? dest displacement))
+              (BYTE (8 ,(+ #x10 bit)))
+              (DISPLACEMENT (8 dest)))
+   
+             ((W (? dest displacement))
+              (BYTE (8 ,(+ #x30 bit)))
+              (DISPLACEMENT (16 dest)))
+
+             ;; Self tensioned version. @PCO not handled.
+             (((@PCR (? label)))
+              (VARIABLE-WIDTH
+               (disp `(- ,label (+ *PC* 2)))
+               ((-128 127)             ; (BR/BSB B label)
+                (BYTE (8 ,(+ #x10 bit)))
+                (BYTE (8 disp SIGNED)))
+               ;; The following range is correct.  Think about it.
+               ((-32767 32768)         ; (BR/BSB W label)
+                (BYTE (8 ,(+ #x30 bit)))
+                (BYTE (16 (- disp 1) SIGNED)))
+               ((() ())                ; (JMP/JSB (@PCO L label))
+                (BYTE (8 ,(+ #x16 bit)))
+                (BYTE (4 15)
+                      (4 14))
+                (BYTE (32 (- disp 4) SIGNED))))))
+
+           (define-instruction ,namej
+             (((? dst ea-a-b))
+              (BYTE (8 ,(+ #x16 bit)))
+              (OPERAND dst)))))))
+
+  (define-unconditional-transfer BR JMP #x1)
+  (define-unconditional-transfer BSB JSB #x0))
+\f
+(define-trivial-instruction RSB #x05)
+
+(define-instruction CALLG
+  (((? arglist ea-a-b) (? dst ea-a-b))
+   (BYTE (8 #xFA))
+   (OPERAND arglist)
+   (OPERAND dst)))
+
+(define-instruction CALLS
+  (((? narg ea-r-l) (? dst ea-a-b))
+   (BYTE (8 #xFB))
+   (OPERAND narg)
+   (OPERAND dst)))
+
+(define-trivial-instruction RET #x04)
+
+(define-instruction BLB
+  ((S (? src ea-r-l) (? dest displacement))
+   (BYTE (8 #xE8))
+   (OPERAND src)
+   (DISPLACEMENT (8 dest)))
+
+  ((C (? src ea-r-l) (? dest displacement))
+   (BYTE (8 #xE9))
+   (OPERAND src)
+   (DISPLACEMENT (8 dest))))
+\f
+(define-instruction BB
+  ((S (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE0))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest)))
+  
+  ((C (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE1))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest)))
+  
+  ((S S (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE2))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest)))
+  
+  ((C S (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE3))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest)))
+  
+  ((S C (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE4))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest)))
+  
+  ((C C (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE5))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest)))
+
+  ((S S I (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE6))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest)))
+
+  ((C C I (? pos ea-r-l) (? base ea-v-b) (? dest displacement))
+   (BYTE (8 #xE7))
+   (OPERAND pos)
+   (OPERAND base)
+   (DISPLACEMENT (8 dest))))
+\f
+(define-instruction ACB
+  ((B (? limit ea-r-b) (? add ea-r-b) (? index ea-m-b) (? dest displacement))
+   (BYTE (8 #x9D))
+   (OPERAND limit)
+   (OPERAND add)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+  
+  ((W (? limit ea-r-w) (? add ea-r-w) (? index ea-m-w) (? dest displacement))
+   (BYTE (8 #x3D))
+   (OPERAND limit)
+   (OPERAND add)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+  
+  ((L (? limit ea-r-l) (? add ea-r-l) (? index ea-m-l) (? dest displacement))
+   (BYTE (8 #xF1))
+   (OPERAND limit)
+   (OPERAND add)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+  
+  ((F (? limit ea-r-f) (? add ea-r-f) (? index ea-m-f) (? dest displacement))
+   (BYTE (8 #x4F))
+   (OPERAND limit)
+   (OPERAND add)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+  
+  ((D (? limit ea-r-d) (? add ea-r-d) (? index ea-m-d) (? dest displacement))
+   (BYTE (8 #x6F))
+   (OPERAND limit)
+   (OPERAND add)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+  
+  ((G (? limit ea-r-g) (? add ea-r-g) (? index ea-m-g) (? dest displacement))
+   (BYTE (16 #x4FFD))
+   (OPERAND limit)
+   (OPERAND add)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+  
+  ((H (? limit ea-r-h) (? add ea-r-h) (? index ea-m-h) (? dest displacement))
+   (BYTE (16 #x6FFD))
+   (OPERAND limit)
+   (OPERAND add)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest))))
+\f
+(define-instruction AOB
+  ((LSS (? limit ea-r-l) (? index ea-m-l) (? dest displacement))
+   (BYTE (8 #xF2))
+   (OPERAND limit)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+
+  ((LEQ (? limit ea-r-l) (? index ea-m-l) (? dest displacement))
+   (BYTE (8 #xF3))
+   (OPERAND limit)
+   (OPERAND index)
+   (DISPLACEMENT (8 dest))))
+
+(define-instruction SOB
+  ((GEQ (? index ea-m-l) (? dest displacement))
+   (BYTE (8 #xF4))
+   (OPERAND index)
+   (DISPLACEMENT (8 dest)))
+
+  ((GTR (? index ea-m-l) (? dest displacement))
+   (BYTE (8 #xF5))
+   (OPERAND index)
+   (DISPLACEMENT (8 dest))))
+
+;; NOTE: The displacements must be placed separately on the
+;; instruction stream after the instruction.
+;;
+;; For example:
+;;
+;; (CASE B (R 0) (& 5) (& 2))
+;; (LABEL case-begin)
+;; (DC W `(- case-5 case-begin))
+;; (DC W `(- case-6 case-begin))
+;; (DC W `(- case-7 case-begin))
+;; <fall through if out of range>
+
+(define-instruction CASE
+  ((B (? selector ea-r-b) (? base ea-r-b) (? limit ea-r-b))
+   (BYTE (8 #x8F))
+   (OPERAND selector)
+   (OPERAND base)
+   (OPERAND limit))
+
+  ((W (? selector ea-r-w) (? base ea-r-w) (? limit ea-r-w))
+   (BYTE (8 #xAF))
+   (OPERAND selector)
+   (OPERAND base)
+   (OPERAND limit))
+
+  ((L (? selector ea-r-l) (? base ea-r-l) (? limit ea-r-l))
+   (BYTE (8 #xCF))
+   (OPERAND selector)
+   (OPERAND base)
+   (OPERAND limit)))
+\f
+;;;; BCD instructions (Chap 15.)
+
+(let-syntax
+    ((define-add/sub-bcd-instruction
+       (macro (name opcode4)
+        `(define-instruction ,name
+           (((? oplen ea-r-w) (? op ea-a-b)
+              (? reslen ea-r-w) (? res ea-a-b))
+            (BYTE (8 ,opcode4))
+            (OPERAND oplen)
+            (OPERAND op)
+            (OPERAND reslen)
+            (OPERAND res))
+
+           (((? op1len ea-r-w) (? op1 ea-a-b)
+             (? op2len ea-r-w) (? op2 ea-a-b)
+              (? reslen ea-r-w) (? res ea-a-b))
+            (BYTE (8 ,(1+ opcode4)))
+            (OPERAND op1len)
+            (OPERAND op1)
+            (OPERAND op2len)
+            (OPERAND op2)
+            (OPERAND reslen)
+            (OPERAND res))))))
+
+  (define-add/sub-bcd-instruction ADDP #x20)
+  (define-add/sub-bcd-instruction SUBP #x22))
+
+(let-syntax
+    ((define-add/sub-bcd-instruction
+       (macro (name opcode)
+        `(define-instruction ,name
+           (((? op1len ea-r-w) (? op1 ea-a-b)
+             (? op2len ea-r-w) (? op2 ea-a-b)
+              (? reslen ea-r-w) (? res ea-a-b))
+            (BYTE (8 ,opcode))
+            (OPERAND op1len)
+            (OPERAND op1)
+            (OPERAND op2len)
+            (OPERAND op2)
+            (OPERAND reslen)
+            (OPERAND res))))))
+
+  (define-add/sub-bcd-instruction MULP #x25)
+  (define-add/sub-bcd-instruction DIVP #x27))
+\f
+(define-instruction CMPP
+  (((? len ea-r-w) (? src1 ea-a-b) (? src2 ea-a-b))
+   (BYTE (8 #x35))
+   (OPERAND len)
+   (OPERAND src1)
+   (OPERAND src2))
+
+  (((? len1 ea-r-w) (? src1 ea-a-b) (? len2 ea-r-w) (? src2 ea-a-b))
+   (BYTE (8 #x37))
+   (OPERAND len1)
+   (OPERAND src1)
+   (OPERAND len2)
+   (OPERAND src2)))
+
+(define-instruction ASHP
+  (((? srclen ea-r-w) (? src ea-a-b)
+    (? round ea-r-b)
+    (? dstlen ea-r-w) (? dst ea-a-b))
+   (BYTE (8 #xF8))
+   (OPERAND srclen)
+   (OPERAND src)
+   (OPERAND round)
+   (OPERAND dstlen)
+   (OPERAND dst)))
+
+(define-instruction MOVP
+  (((? len ea-r-w) (? src ea-a-b) (? dst ea-a-b))
+   (BYTE (8 #x34))
+   (OPERAND len)
+   (OPERAND src)
+   (OPERAND dst)))   
+\f
+(define-instruction CVTLP
+  (((? src ea-r-l) (? len ea-r-w) (? dst ea-a-b))
+   (BYTE (8 #xF9))
+   (OPERAND src)
+   (OPERAND len)
+   (OPERAND dst)))
+
+(define-instruction CVTPL
+  (((? len ea-r-w) (? src ea-a-b) (? dst ea-w-l))
+   (BYTE (8 #x36))
+   (OPERAND len)
+   (OPERAND src)
+   (OPERAND dst)))
+
+(let-syntax
+    ((define-cvt-trailing-instruction
+       (macro (name opcode)
+        `(define-instruction ,name
+           (((? srclen ea-r-w) (? src ea-a-b) 
+             (? tbl ea-a-b)
+             (? dstlen ea-r-w) (? dst ea-a-b))
+            (BYTE (8 ,opcode))
+            (OPERAND srclen)
+            (OPERAND src)
+            (OPERAND tbl)
+            (OPERAND dstlen)
+            (OPERAND dst))))))
+
+  (define-cvt-trailing-instruction CVTPT #x24)
+  (define-cvt-trailing-instruction CVTTT #x26))
+
+(let-syntax
+    ((define-cvt-separate-instruction
+       (macro (name opcode)
+        `(define-instruction ,name
+           (((? srclen ea-r-w) (? src ea-a-b)
+             (? dstlen ea-r-w) (? dst ea-a-b))
+            (BYTE (8 ,opcode))
+            (OPERAND srclen)
+            (OPERAND src)
+            (OPERAND dstlen)
+            (OPERAND dst))))))
+
+  (define-cvt-separate-instruction CVTPS #x08)
+  (define-cvt-separate-instruction CVTSP #x09))
\ No newline at end of file