From 02030c555e27a330f378c39027ad3f501e1af830 Mon Sep 17 00:00:00 2001 From: "Guillermo J. Rozas" Date: Fri, 17 Jul 1987 15:49:20 +0000 Subject: [PATCH] Complete the 68020 instruction set. --- v7/src/compiler/machines/bobcat/coerce.scm | 17 +- v7/src/compiler/machines/bobcat/decls.scm | 6 +- v7/src/compiler/machines/bobcat/insmac.scm | 4 +- v7/src/compiler/machines/bobcat/instr1.scm | 19 ++- v7/src/compiler/machines/bobcat/instr2.scm | 101 ++++++++--- v7/src/compiler/machines/bobcat/instr3.scm | 159 +++++++++++++++++- v7/src/compiler/machines/bobcat/insutl.scm | 9 +- .../compiler/machines/bobcat/make.scm-68040 | 6 +- 8 files changed, 276 insertions(+), 45 deletions(-) diff --git a/v7/src/compiler/machines/bobcat/coerce.scm b/v7/src/compiler/machines/bobcat/coerce.scm index 9508b2a36..be2d9d7c7 100644 --- a/v7/src/compiler/machines/bobcat/coerce.scm +++ b/v7/src/compiler/machines/bobcat/coerce.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/coerce.scm,v 1.7 1987/03/19 00:52:34 cph Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/coerce.scm,v 1.8 1987/07/17 15:40:20 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -51,13 +51,21 @@ MIT in each case. |# (and (< offset 128) offset)) (error "Short label out of range" offset))))) +(define coerce-bit-field-width + (standard-coercion + (lambda (w) + (cond ((< 0 w 32) w) + ((= w 32) 0) + (else (error "Bad bit field width" w)))))) + (define make-coercion (coercion-maker `((UNSIGNED . ,coerce-unsigned-integer) (SIGNED . ,coerce-signed-integer) (QUICK . ,coerce-quick) (SHIFT-NUMBER . ,coerce-quick) - (SHORT-LABEL . ,coerce-short-label)))) + (SHORT-LABEL . ,coerce-short-label) + (BFWIDTH . ,coerce-bit-field-width)))) (define-coercion 'UNSIGNED 1) (define-coercion 'UNSIGNED 2) @@ -65,11 +73,15 @@ MIT in each case. |# (define-coercion 'UNSIGNED 4) (define-coercion 'UNSIGNED 5) (define-coercion 'UNSIGNED 6) +(define-coercion 'UNSIGNED 7) (define-coercion 'UNSIGNED 8) (define-coercion 'UNSIGNED 9) (define-coercion 'UNSIGNED 10) +(define-coercion 'UNSIGNED 11) (define-coercion 'UNSIGNED 12) (define-coercion 'UNSIGNED 13) +(define-coercion 'UNSIGNED 14) +(define-coercion 'UNSIGNED 15) (define-coercion 'UNSIGNED 16) (define-coercion 'UNSIGNED 32) @@ -78,5 +90,6 @@ MIT in each case. |# (define-coercion 'SIGNED 32) (define-coercion 'QUICK 3) +(define-coercion 'BFWIDTH 5) (define-coercion 'SHIFT-NUMBER 3) (define-coercion 'SHORT-LABEL 8) \ No newline at end of file diff --git a/v7/src/compiler/machines/bobcat/decls.scm b/v7/src/compiler/machines/bobcat/decls.scm index bb97bacbe..53e870ebb 100644 --- a/v7/src/compiler/machines/bobcat/decls.scm +++ b/v7/src/compiler/machines/bobcat/decls.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/decls.scm,v 1.18 1987/07/15 02:59:48 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/decls.scm,v 1.19 1987/07/17 15:46:27 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -109,7 +109,7 @@ MIT in each case. |# ;;;; Lap level integration and expansion dependencies (define filenames/dependency-group/lap - (filename/append "machines/bobcat" "instr1" "instr2" "instr3")) + (filename/append "machines/bobcat" "instr1" "instr2" "instr3" "instr4")) (define filenames/dependency-group/lap-syn1 (append (filename/append "back-end" "lapgn1" "lapgn2" "lapgn3" "regmap") @@ -194,6 +194,6 @@ MIT in each case. |# (file-dependency/syntax/join (append (filename/append "machines/bobcat" "insutl" "instr1" "instr2" - "instr3") + "instr3" "instr4") (filename/append "machines/spectrum" "instrs")) assembler-syntax-table) \ No newline at end of file diff --git a/v7/src/compiler/machines/bobcat/insmac.scm b/v7/src/compiler/machines/bobcat/insmac.scm index aa66e115f..277902cd9 100644 --- a/v7/src/compiler/machines/bobcat/insmac.scm +++ b/v7/src/compiler/machines/bobcat/insmac.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/insmac.scm,v 1.119 1987/07/08 22:05:47 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/insmac.scm,v 1.120 1987/07/17 15:48:27 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -195,7 +195,7 @@ MIT in each case. |# (coercion-type (if (null? (cddr descriptor)) 'UNSIGNED (caddr descriptor)))) (case coercion-type - ((UNSIGNED SIGNED SHIFT-NUMBER QUICK) + ((UNSIGNED SIGNED SHIFT-NUMBER QUICK BFWIDTH) (receiver `(,(integer-syntaxer expression coercion-type size)) size false false)) ((SHORT-LABEL) diff --git a/v7/src/compiler/machines/bobcat/instr1.scm b/v7/src/compiler/machines/bobcat/instr1.scm index 6caf7caff..8cd76b22a 100644 --- a/v7/src/compiler/machines/bobcat/instr1.scm +++ b/v7/src/compiler/machines/bobcat/instr1.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/instr1.scm,v 1.62 1987/07/08 22:06:08 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/instr1.scm,v 1.63 1987/07/17 15:48:41 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -114,6 +114,9 @@ MIT in each case. |# (define-ea-transformer ea-d&-& (DATA) (&)) (define-ea-transformer ea-all-A () (A)) + +(define-ea-transformer ea-d/c () (A @A+ @-A &)) +(define-ea-transformer ea-d/c&a (ALTERABLE) (A @A+ @-A &)) ;;;; Special purpose transformers @@ -127,6 +130,10 @@ MIT in each case. |# (define-symbol-transformer lw (W . 1) (L . 0)) (define-symbol-transformer rl (R . 0) (L . 1)) (define-symbol-transformer us (U . 0) (S . 1)) +(define-symbol-transformer chkwl (W . 6) (L . 4)) +(define-symbol-transformer bwl+1 (B . 1) (W . 2) (L . 3)) +(define-symbol-transformer nwl-n (W . 2) (L . 3)) + (define-symbol-transformer cc (T . 0) (F . 1) (HI . 2) (LS . 3) (HS . 4) (LO . 5) (CC . 4) (CS . 5) (NE . 6) (EQ . 7) (VC . 8) (VS . 9) @@ -140,4 +147,12 @@ MIT in each case. |# (define-reg-list-transformer @-reg-list (D0 . 0) (D1 . 1) (D2 . 2) (D3 . 3) (D4 . 4) (D5 . 5) (D6 . 6) (D7 . 7) (A0 . 8) (A1 . 9) (A2 . 10) (A3 . 11) (A4 . 12) (A5 . 13) - (A6 . 14) (A7 . 15)) \ No newline at end of file + (A6 . 14) (A7 . 15)) + +;; Control registers for 68010 and 68020 + +(define-symbol-transformer cont-reg + (SFC . #x000) (DFC . #x001) (USP . #x800) (VBR . #x801) + ;; The ones below are for the 68020 only. + (CACR . #x002) (CAAR . #x802) (MSP . #x803) (ISP . #x804)) + diff --git a/v7/src/compiler/machines/bobcat/instr2.scm b/v7/src/compiler/machines/bobcat/instr2.scm index 8b1119caf..b8b6c6cd8 100644 --- a/v7/src/compiler/machines/bobcat/instr2.scm +++ b/v7/src/compiler/machines/bobcat/instr2.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/instr2.scm,v 1.10 1987/07/08 22:06:40 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/instr2.scm,v 1.11 1987/07/17 15:48:53 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -72,7 +72,7 @@ MIT in each case. |# (let-syntax ((define-binary-addition (macro (keyword Qkeyword Xkeyword opcode Qbit Iopcode) `(BEGIN - (define-instruction ,Qkeyword ;ADDQ + (define-instruction ,Qkeyword ;ADDQ/SUBQ ((B (& (? data)) (? ea ea-all-A)) (WORD (4 #b0101) (3 data QUICK) @@ -88,7 +88,7 @@ MIT in each case. |# (6 ea DESTINATION-EA)))) (define-instruction ,keyword - (((? s bwl ssym) (& (? data)) (? ea ea-d&a)) ;ADDI + (((? s bwl ssym) (& (? data)) (? ea ea-d&a)) ;ADDI/SUBI (WORD (4 #b0000) (4 ,Iopcode) (2 s) @@ -114,9 +114,9 @@ MIT in each case. |# (3 rx) (1 #b1) (2 s) - (6 ea DESTINATION-EA))) + (6 ea DESTINATION-EA))) - (((? s wl ssym) (? ea ea-all) (A (? rx))) ;ADDA + (((? s wl ssym) (? ea ea-all) (A (? rx))) ;ADDA/SUBA (WORD (4 ,opcode) (3 rx) (1 s) @@ -142,14 +142,6 @@ MIT in each case. |# (define-binary-addition ADD ADDQ ADDX #b1101 #b0 #b0110) (define-binary-addition SUB SUBQ SUBX #b1001 #b1 #b0100)) -(define-instruction DIV - (((? sgn us) (D (? rx)) (? ea ea-d)) - (WORD (4 #b1000) - (3 rx) - (1 sgn) - (2 #b11) - (6 ea SOURCE-EA 'W)))) - (define-instruction EXT (((? s wl) (D (? rx))) (WORD (9 #b010010001) @@ -157,14 +149,6 @@ MIT in each case. |# (3 #b000) (3 rx)))) -(define-instruction MUL - (((? sgn us) (? ea ea-d) (D (? rx))) - (WORD (4 #b1100) - (3 rx) - (1 sgn) - (2 #b11) - (6 ea SOURCE-EA 'W)))) - (define-instruction NEG (((? s bwl) (? dea ea-d&a)) (WORD (8 #b01000100) @@ -176,6 +160,77 @@ MIT in each case. |# (WORD (8 #b01000000) (2 s) (6 dea DESTINATION-EA)))) + +;;; Multiplication and division + +#| + +;; These are the 68000/68010 versions + +(define-instruction DIV + (((? sgn us) (D (? rx)) (? ea ea-d)) + (WORD (4 #b1000) + (3 rx) + (1 sgn) + (2 #b11) + (6 ea SOURCE-EA 'W)))) + +(define-instruction MUL + (((? sgn us) (? ea ea-d) (D (? rx))) + (WORD (4 #b1100) + (3 rx) + (1 sgn) + (2 #b11) + (6 ea SOURCE-EA 'W)))) + +|# + +;; These are the 68020 versions + +(let-syntax ((define-mul-and-div + (macro (keyword word-form-bit long-form-bit) + `(define-instruction ,keyword + (((? sgn us) W (D (? n)) (? ea ea-d)) + (WORD (1 #b1) + (1 ,word-form-bit) + (2 #b00) + (3 n) + (1 sgn) + (2 #b11) + (6 ea SOURCE-EA 'W))) + + (((? sgn us) L (D (? q)) (? ea ea-d)) + (WORD (9 #b010011000) + (1 ,long-form-bit) + (6 ea SOURCE-EA 'L)) + (EXTENSION-WORD (1 #b0) + (3 q) + (1 sgn) + (8 #b00000000) + (3 q))) + + (((? sgn us) L (D (? r)) (D (? q)) (? ea ea-d)) + (WORD (9 #b010011000) + (1 ,long-form-bit) + (6 ea SOURCE-EA 'L)) + (EXTENSION-WORD (1 #b0) + (3 q) + (1 sgn) + (8 #b10000000) + (3 r))))))) + (define-mul-and-div MUL #b1 #b0) + (define-mul-and-div DIV #b0 #b1)) + +(define-instruction DIVL + (((? sgn us) L (D (? r)) (D (? q)) (? ea ea-d)) + (WORD (9 #b010011000) + (1 #b1) ; DIV long-form-bit + (6 ea SOURCE-EA 'L)) + (EXTENSION-WORD (1 #b0) + (3 q) + (1 sgn) + (8 #b00000000) + (3 r)))) ;;;; Comparisons @@ -262,8 +317,8 @@ MIT in each case. |# (2 s) (6 #b111100)) (immediate-words data ssym)))))) - (define-bitwise-logical AND #b1100 #b0010) - (define-bitwise-logical OR #b1000 #b0000)) + (define-bitwise-logical AND #b1100 #b0010) ; and ANDI + (define-bitwise-logical OR #b1000 #b0000)) ; and ORI (define-instruction EOR (((? s bwl) (D (? rx)) (? ea ea-d&a)) diff --git a/v7/src/compiler/machines/bobcat/instr3.scm b/v7/src/compiler/machines/bobcat/instr3.scm index 84c8f941e..6019cacb0 100644 --- a/v7/src/compiler/machines/bobcat/instr3.scm +++ b/v7/src/compiler/machines/bobcat/instr3.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/instr3.scm,v 1.11 1987/07/16 10:13:36 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/instr3.scm,v 1.12 1987/07/17 15:49:06 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -65,6 +65,20 @@ MIT in each case. |# (8 #b00000000)) (relative-word l)) + ;; 68020 only + + (((? c cc) L (@PCO (? o))) + (WORD (4 #b0110) + (4 cc) + (8 #b11111111)) + (immediate-long o)) + + (((? c cc) L (@PCR (? l))) + (WORD (4 #b0110) + (4 cc) + (8 #b11111111)) + (relative-long l)) + (((? c cc) U (@PCO (? o))) (WORD (4 #b0110) (4 c) @@ -94,6 +108,16 @@ MIT in each case. |# (WORD (16 #b0110000000000000)) (relative-word l)) + ;; 68020 only + + ((L (@PCO (? o))) + (WORD (16 #b0110000011111111)) + (immediate-long o)) + + ((L (@PCR (? l))) + (WORD (16 #b0110000011111111)) + (relative-long l)) + ((U (@PCO (? o))) (WORD (16 #b0110000000000000)) (immediate-word o)) @@ -101,7 +125,7 @@ MIT in each case. |# ((U (@PCR (? l))) (WORD (16 #b0110000000000000)) (relative-word l))) - + (define-instruction BSR ((B (@PCO (? o))) (WORD (8 #b01100001) @@ -119,6 +143,16 @@ MIT in each case. |# (WORD (16 #b0110000100000000)) (relative-word l)) + ;; 68020 onlyu + + ((L (@PCO (? o))) + (WORD (16 #b0110000111111111)) + (immediate-long o)) + + ((L (@PCR (? l))) + (WORD (16 #b0110000111111111)) + (relative-long l)) + ((U (@PCO (? o))) (WORD (16 #b0110000100000000)) (immediate-word o)) @@ -152,6 +186,13 @@ MIT in each case. |# (WORD (10 #b0100111010) (6 ea DESTINATION-EA)))) +;; 68010 and 68020 only + +(define-instruction RTD + (((& (? offset))) + (WORD (16 #b0100111001110100)) + (EXTENSION-WORD (16 offset)))) + (define-instruction RTE (() (WORD (16 #b0100111001110011)))) @@ -164,16 +205,20 @@ MIT in each case. |# (() (WORD (16 #b0100111001110101)))) -(define-instruction TRAP - (((& (? v))) - (WORD (12 #b010011100100) - (4 v)))) - (define-instruction TRAPV (() (WORD (16 #b0100111001110110)))) -;;;; Randomness +;;;; Family member dependent miscellaneous instructions. + +#| + +;; These are the 68000/68010 versions + +(define-instruction TRAP + (((& (? v))) + (WORD (12 #b010011100100) + (4 v)))) (define-instruction CHK (((? ea ea-d) (D (? rx))) @@ -188,6 +233,67 @@ MIT in each case. |# (3 rx)) (immediate-word d))) +|# + +;;;; Family member dependent miscellaneous instructions (continued). + +;; These are the 68020 versions + +(define-instruction TRAP + (((& (? v))) + (WORD (12 #b010011100100) + (4 v))) + + (((? c cc)) + (WORD (4 #b0101) + (4 cc) + (8 #b11111100))) + + (((? c cc) W (& (? data))) + (WORD (4 #b0101) + (4 cc) + (8 #b11111010)) + (EXTENSION-WORD (16 data))) + + (((? c cc) L (& (? data))) + (WORD (4 #b0101) + (4 cc) + (8 #b11111011)) + (EXTENSION-WORD (32 data)))) + +(define-instruction CHK + ;; This is for compatibility with older (68000/68010) syntax. + ;; There is no size suffix to the opcode. + + (((? ea ea-d) (D (? rx))) + (WORD (4 #b0100) + (3 rx) + (3 #b110) + (6 ea SOURCE-EA 'W))) + + (((? size chkwl) (? ea ea-d) (D (? rx))) + (WORD (4 #b0100) + (3 rx) + (3 size) + (6 ea SOURCE-EA 'W)))) + +(define-instruction LINK + ((W (A (? rx)) (& (? d))) + (WORD (13 #b0100111001010) + (3 rx)) + (immediate-word d)) + + ((L (A (? rx)) (& (? d))) + (WORD (13 #b0100100000001) + (3 rx)) + (immediate-long d))) + +;;;; Randomness + +(define-instruction ILLEGAL + (() + (WORD (16 #b0100101011111100)))) + (define-instruction NOP (() (WORD (16 #b0100111001110001)))) @@ -390,3 +496,40 @@ MIT in each case. |# (3 #b001) (3 ry)) (relative-word l))) + +;;;; 68010 and 68020 only privileged MOVE instructions. + +;;; move from/to control register. + +(define-instruction MOVEC + ((((? creg cont-reg)) ((? rtype da) (? greg))) + (WORD (15 #b010011100111101) + (1 #b0)) + (EXTENSION-WORD (1 rtype) + (3 greg) + (12 creg))) + + ((((? rtype da) (? greg)) ((? creg cont-reg))) + (WORD (15 #b010011100111101) + (1 #b1)) + (EXTENSION-WORD (1 rtype) + (3 greg) + (12 creg)))) + +(define-instruction MOVES + (((? size bwl) ((? rtype da) (? reg)) (? dest ea-m&a)) + (WORD (8 #b00001110) + (2 size) + (6 dest DESTINATION-EA)) + (EXTENSION-WORD (1 rtype) + (3 reg) + (1 #b1) + (11 #b00000000000))) + (((? size bwl) (? dest ea-m&a) ((? rtype da) (? reg))) + (WORD (8 #b00001110) + (2 size) + (6 dest DESTINATION-EA)) + (EXTENSION-WORD (1 rtype) + (3 reg) + (1 #b0) + (11 #b00000000000)))) diff --git a/v7/src/compiler/machines/bobcat/insutl.scm b/v7/src/compiler/machines/bobcat/insutl.scm index e48cd48ea..d5f0d6aeb 100644 --- a/v7/src/compiler/machines/bobcat/insutl.scm +++ b/v7/src/compiler/machines/bobcat/insutl.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/insutl.scm,v 1.2 1987/07/01 20:53:42 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/insutl.scm,v 1.3 1987/07/17 15:49:20 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -230,12 +230,17 @@ MIT in each case. |# (define-integrable (relative-word address) (syntax-evaluation `(- ,address *PC*) coerce-16-bit-signed)) +(define-integrable (relative-long address) + (syntax-evaluation `(- ,address *PC*) coerce-32-bit-signed)) + (define-integrable (offset-word data) (syntax-evaluation data coerce-16-bit-signed)) (define-integrable (output-bit-string bit-string) bit-string) +;;;; Randoms + ;; Auxiliary procedure for register list transformers (define (encode-register-list reg-list encoding) @@ -249,4 +254,4 @@ MIT in each case. |# (begin (bit-string-set! bit-string (cdr place)) (loop (cdr regs))))))) - (loop reg-list))) \ No newline at end of file + (loop reg-list))) diff --git a/v7/src/compiler/machines/bobcat/make.scm-68040 b/v7/src/compiler/machines/bobcat/make.scm-68040 index 3e4578b60..1eab6bab7 100644 --- a/v7/src/compiler/machines/bobcat/make.scm-68040 +++ b/v7/src/compiler/machines/bobcat/make.scm-68040 @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.32 1987/07/16 10:15:36 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.33 1987/07/17 15:42:50 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -46,11 +46,11 @@ MIT in each case. |# (make-environment (define :name "Liar (Bobcat 68020)") (define :version 1) - (define :modification 32) + (define :modification 33) (define :files) ; (parse-rcs-header -; "$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.32 1987/07/16 10:15:36 jinx Exp $" +; "$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.33 1987/07/17 15:42:50 jinx Exp $" ; (lambda (filename version date time zone author state) ; (set! :version (car version)) ; (set! :modification (cadr version)))) -- 2.25.1