From 3e820084b8fbe20b23be861bc170d704763c9a83 Mon Sep 17 00:00:00 2001 From: "Guillermo J. Rozas" Date: Sat, 22 Aug 1987 22:44:35 +0000 Subject: [PATCH] Minor modifications for early instruction processing. --- v7/src/compiler/machines/vax/insmac.scm | 32 ++++++----- v7/src/compiler/machines/vax/insutl.scm | 71 +++++++++---------------- 2 files changed, 42 insertions(+), 61 deletions(-) diff --git a/v7/src/compiler/machines/vax/insmac.scm b/v7/src/compiler/machines/vax/insmac.scm index f8ebc9017..7cd4dba09 100644 --- a/v7/src/compiler/machines/vax/insmac.scm +++ b/v7/src/compiler/machines/vax/insmac.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/vax/insmac.scm,v 1.7 1987/08/22 22:10:08 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/vax/insmac.scm,v 1.8 1987/08/22 22:44:15 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -51,7 +51,7 @@ MIT in each case. |# `(MAKE-EFFECTIVE-ADDRESS ',keyword ',categories - ,(process-fields value)))))))) + ,(process-fields value false)))))))) (syntax-table-define assembler-syntax-table 'DEFINE-EA-TRANSFORMER (macro (name category type) @@ -76,25 +76,22 @@ MIT in each case. |# (macro (name value) `(define ,name ,value))) -(define ea-value-operator 'EA-VALUE) - (define (parse-instruction opcode tail early?) - (if early? - (fluid-let ((ea-value-operator 'EA-VALUE-EARLY)) - (process-fields (cons opcode tail))) - (process-fields (cons opcode tail)))) + (process-fields (cons opcode tail) early?)) -(define (process-fields fields) +(define (process-fields fields early?) (if (and (null? (cdr fields)) (eq? (caar fields) 'VARIABLE-WIDTH)) - (expand-variable-width (car fields)) + (expand-variable-width (car fields) + (if early? 'EA-VALUE-EARLY 'EA-VALUE)) (expand-fields fields + (if early? 'EA-VALUE-EARLY 'EA-VALUE) (lambda (code size) (if (not (zero? (remainder size 8))) (error "process-fields: bad syllable size" size)) code)))) -(define (expand-variable-width field) +(define (expand-variable-width field ea-value-operator) (let ((binding (cadr field)) (clauses (cddr field))) `(LIST @@ -104,16 +101,17 @@ MIT in each case. |# (map (lambda (clause) (expand-fields (cdr clause) + ea-value-operator (lambda (code size) (if (not (zero? (remainder size 8))) (error "expand-variable-width: bad clause size" size)) `(,code ,size ,@(car clause))))) clauses))))) -(define (expand-fields fields receiver) +(define (expand-fields fields ea-value-operator receiver) (if (null? fields) (receiver ''() 0) - (expand-fields (cdr fields) + (expand-fields (cdr fields) ea-value-operator (lambda (tail tail-size) (case (caar fields) ((BYTE) @@ -134,9 +132,15 @@ MIT in each case. |# ,(displacement-syntaxer expression size) ,tail) (+ size tail-size))))) + ((IMMEDIATE) + (receiver + `(CONS-SYNTAX + (COERCE-TO-TYPE ,(cadar fields) *IMMEDIATE-TYPE*) + ,tail) + tail-size)) (else (error "expand-fields: Unknown field kind" (caar fields)))))))) - + (define (displacement-syntaxer expression size) (cond ((not (pair? expression)) `(SYNTAX-DISPLACEMENT ,expression diff --git a/v7/src/compiler/machines/vax/insutl.scm b/v7/src/compiler/machines/vax/insutl.scm index 74d02c158..852da2e3b 100644 --- a/v7/src/compiler/machines/vax/insutl.scm +++ b/v7/src/compiler/machines/vax/insutl.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/vax/insutl.scm,v 1.5 1987/08/22 22:01:26 jinx Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/vax/insutl.scm,v 1.6 1987/08/22 22:44:35 jinx Exp $ Copyright (c) 1987 Massachusetts Institute of Technology @@ -61,14 +61,18 @@ MIT in each case. |# ;;;; Addressing modes -;; Missing: index and immediate modes. - (define-ea-database ((S (? value)) (R) (BYTE (6 value) (2 0))) + ((X (? n) (? base ea-i-?)) + (R M W V) + (BYTE (4 n) + (4 4)) + (OPERAND ? base)) + ((R (? n)) (R M W V) (BYTE (4 n) @@ -130,6 +134,12 @@ MIT in each case. |# (4 15)) (BYTE (32 off SIGNED))) + ((& (? value)) + (R M W A V I) + (BYTE (4 15) + (4 8)) + (IMMEDIATE value)) + ((@& (? value)) ; Absolute (R M W A V I) (BYTE (4 15) @@ -212,52 +222,16 @@ MIT in each case. |# ;;;; Effective address processing -;; Handling of index and immediate modes -;; Index mode: -;; (X (? n) (? base ea)) -;; base is prefixed by (BYTE (4 n) (4 4)). -;; Immediate mode: -;; (& (? value)) -;; The operand size dependent value is preceeded by -;; (BYTE (4 15) (4 8)) +(define *immediate-type*) (define (process-ea expression type) - (define (wrap keyword cats reg mode value) - (make-effective-address - keyword - cats - (cons-syntax - (syntax-evaluation reg coerce-4-bit-unsigned) - (cons-syntax (syntax-evaluation mode coerce-4-bit-unsigned) - value)))) - - (define (kernel expression) + (fluid-let ((*immediate-type* + (if (eq? '? type) *immediate-type* type))) (let ((match (pattern-lookup ea-database expression))) (cond (match (match)) - ((and (pair? expression) (eq? (car expression) '&)) - (wrap '& '(R A V I) ; M and W unpredictable - 15 8 - (cons-syntax - (coerce-to-type (cadr expression) type) - '()))) - ;; Guarantee idempotency for early processing. - ((effective-address? expression) - expression) - (else #F)))) - - (cond ((not (pair? expression)) - ;; Guarantee idempotency for early processing. - (if (effective-address? object) - object - #F)) - ((eq? (car expression) 'X) - (let ((base (kernel (caddr expression)))) - (and base - (memq 'I (ea-categories base)) - (wrap 'X '(R M W A V) - (cadr expression) 4 - (ea-value result))))) - (else (kernel expression)))) + ;; Guarantee idempotency for early instruction processing. + ((effective-address? expression) expression) + (else #F))))) (define (coerce-to-type expression type) (syntax-evaluation @@ -269,8 +243,8 @@ MIT in each case. |# ((d f g h l o q) (error "coerce-to-type: Unimplemented type" type)) (else (error "coerce-to-type: Unknown type" type))))) - -;;;; Transformers + +;;; Transformers (define-symbol-transformer cc (NEQ . #x2) (NEQU . #x2) (EQL . #x3) (EQLU . #x3) @@ -288,6 +262,8 @@ MIT in each case. |# (or (eq? (car expression) '@PCR) (eq? (car expression) '@PCO)) expression))) + +;;;; Effective address transformers (define-ea-transformer ea-a-b a b) (define-ea-transformer ea-a-d a d) @@ -324,3 +300,4 @@ MIT in each case. |# (define-ea-transformer ea-w-o w o) (define-ea-transformer ea-w-q w q) (define-ea-transformer ea-w-w w w) +(define-ea-transformer ea-i-? i ?) \ No newline at end of file -- 2.25.1