#| -*-Scheme-*-
-$Id: lapgen.scm,v 4.47 1993/01/13 00:18:46 cph Exp $
+$Id: lapgen.scm,v 4.48 1993/07/06 00:56:23 gjr Exp $
-Copyright (c) 1988-93 Massachusetts Institute of Technology
+Copyright (c) 1988-1993 Massachusetts Institute of Technology
This material was developed by the Scheme project at the Massachusetts
Institute of Technology, Department of Electrical Engineering and
(register-alias register 'DATA)
(load-alias-register! register 'ADDRESS)))
-(define (offset->indirect-reference! offset)
- (indirect-reference! (rtl:register-number (rtl:offset-base offset))
- (rtl:offset-number offset)))
+(define (rtl:simple-byte-offset? expression)
+ (and (rtl:byte-offset? expression)
+ (let ((base (rtl:byte-offset-base expression))
+ (offset (rtl:byte-offset-offset expression)))
+ (if (rtl:register? base)
+ (or (rtl:machine-constant? offset)
+ (rtl:register? offset))
+ (and (rtl:byte-offset-address? base)
+ (rtl:machine-constant? offset)
+ (rtl:register? (rtl:byte-offset-address-base base))
+ (rtl:register? (rtl:byte-offset-address-offset base)))))
+ expression))
+
+(define (byte-offset->reference! offset)
+ ;; OFFSET must be a simple byte offset
+ (let ((base (rtl:byte-offset-base offset))
+ (offset (rtl:byte-offset-offset offset)))
+ (cond ((not (rtl:register? base))
+ (indexed-ea (rtl:register-number
+ (rtl:byte-offset-address-base base))
+ (rtl:register-number
+ (rtl:byte-offset-address-offset base))
+ 1
+ (rtl:machine-constant-value offset)))
+ ((rtl:machine-constant? offset)
+ (indirect-byte-reference! (rtl:register-number base)
+ (rtl:machine-constant-value offset)))
+ (else
+ (indexed-ea (rtl:register-number base)
+ (rtl:register-number offset)
+ 1
+ 0)))))
+\f
+(define (rtl:simple-offset? expression)
+ (and (rtl:offset? expression)
+ (let ((base (rtl:offset-base expression))
+ (offset (rtl:offset-offset expression)))
+ (if (rtl:register? base)
+ (or (rtl:machine-constant? offset)
+ (rtl:register? offset))
+ (and (rtl:offset-address? base)
+ (rtl:machine-constant? offset)
+ (rtl:register? (rtl:offset-address-base base))
+ (rtl:register? (rtl:offset-address-offset base)))))
+ expression))
+
+(define (offset->reference! offset)
+ ;; OFFSET must be a simple offset
+ (let ((base (rtl:offset-base offset))
+ (offset (rtl:offset-offset offset)))
+ (cond ((not (rtl:register? base))
+ (indexed-ea (rtl:register-number (rtl:offset-address-base base))
+ (rtl:register-number (rtl:offset-address-offset base))
+ 4
+ (* 4 (rtl:machine-constant-value offset))))
+ ((rtl:machine-constant? offset)
+ (indirect-reference! (rtl:register-number base)
+ (rtl:machine-constant-value offset)))
+ (else
+ (indexed-ea (rtl:register-number base)
+ (rtl:register-number offset)
+ 4
+ 0)))))
+
+(define (offset->reference!/char offset)
+ ;; OFFSET must be a simple offset
+ (let ((base (rtl:offset-base offset))
+ (offset (rtl:offset-offset offset)))
+ (cond ((not (rtl:register? base))
+ (indexed-ea (rtl:register-number (rtl:offset-address-base base))
+ (rtl:register-number (rtl:offset-address-offset base))
+ 4
+ (+ 3 (* 4 (rtl:machine-constant-value offset)))))
+ ((rtl:machine-constant? offset)
+ (indirect-byte-reference!
+ (rtl:register-number base)
+ (+ 3 (* 4 (rtl:machine-constant-value offset)))))
+ (else
+ (indexed-ea (rtl:register-number base)
+ (rtl:register-number offset)
+ 4
+ 3)))))
+\f
+(define (rtl:simple-float-offset? expression)
+ (and (rtl:float-offset? expression)
+ (let ((base (rtl:float-offset-base expression))
+ (offset (rtl:float-offset-offset expression)))
+ (and (or (rtl:machine-constant? offset)
+ (rtl:register? offset))
+ (or (rtl:register? base)
+ (and (rtl:offset-address? base)
+ (rtl:register? (rtl:offset-address-base base))
+ (rtl:machine-constant?
+ (rtl:offset-address-offset base))))))
+ expression))
+
+(define (float-offset->reference! offset)
+ ;; OFFSET must be a simple float offset
+ (let ((base (rtl:float-offset-base offset))
+ (offset (rtl:float-offset-offset offset)))
+ (cond ((not (rtl:register? base))
+ (let ((base*
+ (rtl:register-number (rtl:offset-address-base base)))
+ (w-offset
+ (rtl:machine-constant-value
+ (rtl:offset-address-offset base))))
+ (if (rtl:machine-constant? offset)
+ (indirect-reference!
+ base*
+ (+ (* 2 (rtl:machine-constant-value offset))
+ w-offset))
+ (indexed-ea base*
+ (rtl:register-number offset)
+ 8
+ (* 4 w-offset)))))
+ ((rtl:machine-constant? offset)
+ (indirect-reference! (rtl:register-number base)
+ (* 2 (rtl:machine-constant-value offset))))
+ (else
+ (indexed-ea (rtl:register-number base)
+ (rtl:register-number offset)
+ 8
+ 0)))))
+
+(define (indexed-ea base index scale offset)
+ (let ((base (allocate-indirection-register! base))
+ (index (preferred-data-register-reference index)))
+ (INST-EA (@AOXS ,(->areg base) ,offset (,index L ,scale)))))
(define (indirect-reference! register offset)
(offset-reference (allocate-indirection-register! register) offset))
(define-integrable (allocate-indirection-register! register)
(load-alias-register! register 'ADDRESS))
-
-#|
-
-;; *** This is believed to be a fossil. ***
-;; Left here until the first compilation to make sure that it really is.
-;; Can be removed the next time it is seen.
-
-(define (code-object-label-initialize code-object)
- code-object
- false)
-
-|#
-
+\f
(define (generate-n-times n limit instruction-gen with-counter)
(if (> n limit)
(let ((loop (generate-label 'LOOP)))
(LAP ,@(instruction-gen)
,@(loop (-1+ n)))))))
+#|
+
+;;; These seem to be fossils --- GJR 7/1/1993
+
(define (standard-target-expression? target)
- (or (and (rtl:offset? target)
- (rtl:register? (rtl:offset-base target)))
+ (or (rtl:simple-offset? target)
(rtl:free-push? target)
(rtl:stack-push? target)))
(define (standard-target-expression->ea target)
- (cond ((rtl:offset? target) (offset->indirect-reference! target))
+ (cond ((rtl:offset? target) (offset->reference! target))
((rtl:free-push? target) (INST-EA (@A+ 5)))
((rtl:stack-push? target) (INST-EA (@-A 7)))
(else (error "STANDARD-TARGET->EA: Not a standard target" target))))
+|#
(define (rtl:free-push? expression)
(and (rtl:post-increment? expression)
(operate-on-machine-target target)
(use-temporary target))))))
((OFFSET)
- (use-temporary (offset->indirect-reference! target)))
+ (use-temporary (offset->reference! target)))
(else
(error "Illegal machine target" target)))))
(operate-on-target (reference-target-alias! target type)))
operate-on-target))
-(define (machine-operation-target? target)
- (or (rtl:register? target)
- (and (rtl:offset? target)
- (rtl:register? (rtl:offset-base target)))))
+(define (machine-operation-target? expression)
+ (or (rtl:register? expression)
+ (rtl:simple-offset? expression)))
\f
(define (two-arg-register-operation
operate commutative?
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/rules1.scm,v 4.37 1992/07/05 14:20:36 jinx Exp $
+$Id: rules1.scm,v 4.38 1993/07/06 00:56:27 gjr Exp $
-Copyright (c) 1988-1992 Massachusetts Institute of Technology
+Copyright (c) 1988-1993 Massachusetts Institute of Technology
This material was developed by the Scheme project at the Massachusetts
Institute of Technology, Department of Electrical Engineering and
(ASSIGN (REGISTER (? target)) (REGISTER (? source)))
(assign-register->register target source))
+(define (assign-register->register target source)
+ (standard-move-to-target! source (register-type target) target)
+ (LAP))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (OFFSET-ADDRESS (REGISTER (? base))
+ (REGISTER (? index))))
+ (load-indexed-address target base index 4 0))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (BYTE-OFFSET-ADDRESS (REGISTER (? base))
+ (REGISTER (? index))))
+ (load-indexed-address target base index 1 0))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET-ADDRESS (REGISTER (? base))
+ (REGISTER (? index))))
+ (load-indexed-address target base index 8 0))
+
+(define-integrable (->areg reg)
+ (- reg 8))
+
+(define (load-indexed-address target base index scale offset)
+ (let ((load-address
+ (lambda (get-target-reference)
+ (let ((ea (indexed-ea base index scale offset)))
+ (LAP (LEA ,ea ,(get-target-reference)))))))
+ (cond ((or (not (machine-register? target))
+ (eq? (register-type target) 'ADDRESS))
+ (load-address
+ (lambda ()
+ (target-register-reference target 'ADDRESS))))
+ ((eq? (register-type target) 'DATA)
+ (let ((temp
+ (register-reference
+ (allocate-temporary-register! 'ADDRESS))))
+ (LAP ,@(load-address (lambda () temp))
+ (MOV L ,temp ,(register-reference target)))))
+ (else
+ (error "load-indexed-address: Unknown register type"
+ target)))))
+
+(define (target-register-reference target type)
+ (delete-dead-registers!)
+ (register-reference
+ (or (register-alias target type)
+ (allocate-alias-register! target type))))
+\f
(define-rule statement
- (ASSIGN (REGISTER (? target)) (OFFSET-ADDRESS (REGISTER (? source)) (? n)))
+ (ASSIGN (REGISTER (? target))
+ (OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? n))))
(load-static-link target source (* 4 n) false))
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (BYTE-OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? n))))
+ (load-static-link target source n false))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? n))))
+ (load-static-link target source (* 8 n) false))
+
(define-rule statement
;; This is an intermediate rule -- not intended to produce code.
(ASSIGN (REGISTER (? target))
(CONS-POINTER (MACHINE-CONSTANT (? type))
- (OFFSET-ADDRESS (REGISTER (? source)) (? n))))
+ (OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? n)))))
(load-static-link target source (* 4 n)
(lambda (target)
(LAP (OR UL (& ,(make-non-pointer-literal type 0)) ,target)))))
-(define-rule statement
- (ASSIGN (REGISTER (? target))
- (BYTE-OFFSET-ADDRESS (REGISTER (? source)) (? n)))
- (load-static-link target source n false))
-
(define-rule statement
(ASSIGN (REGISTER (? target))
(CONS-POINTER (MACHINE-CONSTANT (? type))
- (BYTE-OFFSET-ADDRESS (REGISTER (? source)) (? n))))
+ (BYTE-OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? n)))))
(load-static-link target source n
(lambda (target)
(LAP (OR UL (& ,(make-non-pointer-literal type 0)) ,target)))))
-\f
+
(define (load-static-link target source n suffix)
(cond ((and (not suffix) (zero? n))
(assign-register->register target source))
(else
(error "load-static-link: Unknown register type"
(register-type target))))))
+\f
(else
(let ((non-reusable
(cond ((not suffix)
(suffix (register-reference reusable-alias))
(LAP))))
non-reusable))))))
-
-(define (assign-register->register target source)
- (standard-move-to-target! source (register-type target) target)
- (LAP))
-
+\f
(define-rule statement
(ASSIGN (REGISTER (? target)) (OBJECT->TYPE (REGISTER (? source))))
;; See if we can reuse a source alias, because `object->type' can
(let ((source (register-reference source)))
(object->type source source)))
no-reuse))))
-\f
+
(define-rule statement
(ASSIGN (REGISTER (? target))
(CONS-POINTER (REGISTER (? type)) (REGISTER (? datum))))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (OBJECT->TYPE (OFFSET (REGISTER (? address)) (? offset))))
- (let ((source (indirect-reference! address offset)))
+ (? expression rtl:simple-offset?))
+ (let ((source (offset->reference! expression)))
+ (LAP (MOV L ,source ,(standard-target-reference target)))))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target)) (POST-INCREMENT (REGISTER 15) 1))
+ (LAP (MOV L (@A+ 7) ,(standard-target-reference target))))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (OBJECT->TYPE (? expression rtl:simple-offset?)))
+ (let ((source (offset->reference! expression)))
(delete-dead-registers!)
(object->type source (reference-target-alias! target 'DATA))))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (OBJECT->DATUM (OFFSET (REGISTER (? address)) (? offset))))
- (convert-object/offset->register target address offset object->datum))
+ (OBJECT->DATUM (? expression rtl:simple-offset?)))
+ (convert-object/offset->register target expression object->datum))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (OBJECT->ADDRESS (OFFSET (REGISTER (? address)) (? offset))))
- (convert-object/offset->register target address offset object->address))
+ (OBJECT->ADDRESS (? expression rtl:simple-offset?)))
+ (convert-object/offset->register target expression object->address))
(define-rule statement
(ASSIGN (REGISTER (? target))
(ADDRESS->FIXNUM
- (OBJECT->ADDRESS (OFFSET (REGISTER (? address)) (? offset)))))
- (convert-object/offset->register target address offset address->fixnum))
+ (OBJECT->ADDRESS (? expression rtl:simple-offset?))))
+ (convert-object/offset->register target expression address->fixnum))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (OBJECT->FIXNUM (OFFSET (REGISTER (? address)) (? offset))))
- (convert-object/offset->register target address offset object->fixnum))
+ (OBJECT->FIXNUM (? expression rtl:simple-offset?)))
+ (convert-object/offset->register target expression object->fixnum))
-(define (convert-object/offset->register target address offset conversion)
- (let ((source (indirect-reference! address offset)))
+(define (convert-object/offset->register target expression conversion)
+ (let ((source (offset->reference! expression)))
(delete-dead-registers!)
(let ((target (reference-target-alias! target 'DATA)))
(LAP (MOV L ,source ,target)
,@(conversion target)))))
+\f
+;;;; Transfers to Memory
(define-rule statement
- (ASSIGN (REGISTER (? target)) (OFFSET (REGISTER (? address)) (? offset)))
- (let ((source (indirect-reference! address offset)))
- (LAP (MOV L ,source ,(standard-target-reference target)))))
+ (ASSIGN (? expression rtl:simple-offset?)
+ (REGISTER (? r)))
+ (QUALIFIER (register-value-class=word? r))
+ (LAP (MOV L
+ ,(standard-register-reference r false true)
+ ,(offset->reference! expression))))
(define-rule statement
- (ASSIGN (REGISTER (? target)) (POST-INCREMENT (REGISTER 15) 1))
- (LAP (MOV L (@A+ 7) ,(standard-target-reference target))))
-\f
-;;;; Transfers to Memory
+ (ASSIGN (? expression rtl:simple-offset?)
+ (POST-INCREMENT (REGISTER 15) 1))
+ (LAP (MOV L (@A+ 7) ,(offset->reference! expression))))
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? a)) (? n))
+ (ASSIGN (? expression rtl:simple-offset?)
(CONSTANT (? object)))
- (load-constant object (indirect-reference! a n)))
+ (load-constant object (offset->reference! expression)))
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? a)) (? n))
+ (ASSIGN (? expression rtl:simple-offset?)
(CONS-POINTER (MACHINE-CONSTANT (? type))
(MACHINE-CONSTANT (? datum))))
- (load-non-pointer type datum (indirect-reference! a n)))
-
-(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? a)) (? n)) (REGISTER (? r)))
- (QUALIFIER (register-value-class=word? r))
- (LAP (MOV L
- ,(standard-register-reference r false true)
- ,(indirect-reference! a n))))
-
-(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? a)) (? n))
- (POST-INCREMENT (REGISTER 15) 1))
- (LAP (MOV L (@A+ 7) ,(indirect-reference! a n))))
+ (load-non-pointer type datum (offset->reference! expression)))
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
- (CONS-POINTER (MACHINE-CONSTANT (? type)) (REGISTER (? datum))))
- (let ((target (indirect-reference! address offset)))
+ (ASSIGN (? expression rtl:simple-offset?)
+ (CONS-POINTER (MACHINE-CONSTANT (? type))
+ (REGISTER (? datum))))
+ (let ((target (offset->reference! expression)))
(LAP (MOV L ,(standard-register-reference datum 'DATA true) ,target)
,@(memory-set-type type target))))
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (? expression rtl:simple-offset?)
(CONS-POINTER (MACHINE-CONSTANT (? type))
- (OFFSET-ADDRESS (REGISTER (? source)) (? n))))
+ (OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? n)))))
(let ((temp (reference-temporary-register! 'ADDRESS))
- (target (indirect-reference! address offset)))
+ (target (offset->reference! expression)))
(LAP (LEA ,(indirect-reference! source n) ,temp)
(MOV L ,temp ,target)
,@(memory-set-type type target))))
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (? expression rtl:simple-offset?)
(CONS-POINTER (MACHINE-CONSTANT (? type))
- (BYTE-OFFSET-ADDRESS (REGISTER (? source)) (? n))))
+ (BYTE-OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? n)))))
(let ((temp (reference-temporary-register! 'ADDRESS))
- (target (indirect-reference! address offset)))
+ (target (offset->reference! expression)))
(LAP (LEA ,(indirect-byte-reference! source n) ,temp)
(MOV L ,temp ,target)
,@(memory-set-type type target))))
;; Common case that can be done cheaply:
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
- (BYTE-OFFSET-ADDRESS (OFFSET (REGISTER (? address)) (? offset))
- (? n)))
+ (ASSIGN (? expression0 rtl:simple-offset?)
+ (BYTE-OFFSET-ADDRESS (? expression rtl:simple-offset?)
+ (MACHINE-CONSTANT (? n))))
+ (QUALIFIER (equal? expression0 expression))
(if (zero? n)
(LAP)
- (let ((target (indirect-reference! address offset)))
+ (let ((target (offset->reference! expression)))
(cond ((<= 1 n 8)
(LAP (ADDQ L (& ,n) ,target)))
((<= -8 n -1)
(LAP (ADD L (& ,n) ,target)))))))
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (? expression rtl:simple-offset?)
(CONS-POINTER (MACHINE-CONSTANT (? type))
(ENTRY:PROCEDURE (? label))))
(let ((temp (reference-temporary-register! 'ADDRESS))
- (target (indirect-reference! address offset)))
+ (target (offset->reference! expression)))
(LAP (LEA (@PCR ,(rtl-procedure/external-label (label->object label)))
,temp)
(MOV L ,temp ,target)
,@(memory-set-type type target))))
-(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? a0)) (? n0))
- (OFFSET (REGISTER (? a1)) (? n1)))
- (if (and (= a0 a1) (= n0 n1))
- (LAP)
- (let ((source (indirect-reference! a1 n1)))
- (LAP (MOV L ,source ,(indirect-reference! a0 n0))))))
+#|
+;; This is no better than assigning to a register and then assigning
+;; from the register
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? a)) (? n))
+ (ASSIGN (? expression rtl:simple-offset?)
(FIXNUM->OBJECT (REGISTER (? source))))
- (let ((target (indirect-reference! a n)))
+ (let ((target (offset->reference! expression)))
(let ((temporary (standard-move-to-temporary! source 'DATA)))
(LAP ,@(fixnum->object temporary)
(MOV L ,temporary ,target)))))
+|#
+
+(define-rule statement
+ (ASSIGN (? expression0 rtl:simple-offset?)
+ (? expression1 rtl:simple-offset?))
+ (if (equal? expression0 expression1)
+ (LAP)
+ (LAP (MOV L ,(offset->reference! expression1)
+ ,(offset->reference! expression0)))))
\f
;;;; Consing
(LAP (MOV L ,(standard-register-reference r false true) (@A+ 5))))
(define-rule statement
- (ASSIGN (POST-INCREMENT (REGISTER 13) 1) (OFFSET (REGISTER (? r)) (? n)))
- (LAP (MOV L ,(indirect-reference! r n) (@A+ 5))))
+ (ASSIGN (POST-INCREMENT (REGISTER 13) 1)
+ (? expression rtl:simple-offset?))
+ (LAP (MOV L ,(offset->reference! expression) (@A+ 5))))
+
+#|
+;; This is no better than assigning to a register and then assigning
+;; from the register
(define-rule statement
(ASSIGN (POST-INCREMENT (REGISTER 13) 1)
(let ((temporary (standard-move-to-temporary! r 'DATA)))
(LAP ,@(fixnum->object temporary)
(MOV L ,temporary (@A+ 5)))))
+|#
(define-rule statement
;; This pops the top of stack into the heap
(define-rule statement
(ASSIGN (PRE-INCREMENT (REGISTER 15) -1)
(CONS-POINTER (MACHINE-CONSTANT (? type))
- (OFFSET-ADDRESS (REGISTER (? r)) (? n))))
+ (OFFSET-ADDRESS (REGISTER (? r))
+ (MACHINE-CONSTANT (? n)))))
(LAP (PEA ,(indirect-reference! r n))
,@(memory-set-type type (INST-EA (@A 7)))))
(define-rule statement
(ASSIGN (PRE-INCREMENT (REGISTER 15) -1)
(CONS-POINTER (MACHINE-CONSTANT (? type))
- (BYTE-OFFSET-ADDRESS (REGISTER (? r)) (? n))))
+ (BYTE-OFFSET-ADDRESS (REGISTER (? r))
+ (MACHINE-CONSTANT (? n)))))
(LAP (PEA ,(indirect-byte-reference! r n))
,@(memory-set-type type (INST-EA (@A 7)))))
(define-rule statement
- (ASSIGN (PRE-INCREMENT (REGISTER 15) -1) (OFFSET (REGISTER (? r)) (? n)))
- (LAP (MOV L ,(indirect-reference! r n) (@-A 7))))
+ (ASSIGN (PRE-INCREMENT (REGISTER 15) -1)
+ (? expression rtl:simple-offset?))
+ (LAP (MOV L ,(offset->reference! expression) (@-A 7))))
+
+#|
+;; This is no better than assigning to a register and then assigning
+;; from the register
(define-rule statement
(ASSIGN (PRE-INCREMENT (REGISTER 15) -1)
(let ((temporary (standard-move-to-temporary! r 'DATA)))
(LAP ,@(fixnum->object temporary)
(MOV L ,temporary (@-A 7)))))
+|#
\f
;;;; Fixnum Operations
(ASSIGN (? target)
(FIXNUM-2-ARGS MULTIPLY-FIXNUM
(OBJECT->FIXNUM (CONSTANT 4))
- (OBJECT->FIXNUM (OFFSET (REGISTER (? r)) (? n)))
+ (OBJECT->FIXNUM (? expression rtl:simple-offset?))
(? overflow?)))
(QUALIFIER (machine-operation-target? target))
overflow? ; ignored
- (convert-index->fixnum/offset target r n))
+ (convert-index->fixnum/offset target expression))
(define-rule statement
(ASSIGN (? target)
(FIXNUM-2-ARGS MULTIPLY-FIXNUM
- (OBJECT->FIXNUM (OFFSET (REGISTER (? r)) (? n)))
+ (OBJECT->FIXNUM (? expression rtl:simple-offset?))
(OBJECT->FIXNUM (CONSTANT 4))
(? overflow?)))
(QUALIFIER (machine-operation-target? target))
overflow? ; ignored
- (convert-index->fixnum/offset target r n))
+ (convert-index->fixnum/offset target expression))
;;; end (IF (<= SCHEME-TYPE-WIDTH 6) ...)
))
(lambda (target)
(LAP (AS L L (& ,(+ scheme-type-width 2)) ,target)))))
-(define (convert-index->fixnum/offset target address offset)
- (let ((source (indirect-reference! address offset)))
+(define (convert-index->fixnum/offset target expression)
+ (let ((source (offset->reference! expression)))
(reuse-and-operate-on-machine-target! 'DATA target
(lambda (target)
(LAP (MOV L ,source ,target)
(LAP (MOV L (A 5) ,target)
(OR L (& ,(make-non-pointer-literal (ucode-type flonum) 0)) ,target)
,@(load-non-pointer (ucode-type manifest-nm-vector)
- flonum-size
+ 2
(INST-EA (@A+ 5)))
(FMOVE D ,source (@A+ 5))))))
(ASSIGN (REGISTER (? target)) (OBJECT->FLOAT (REGISTER (? source))))
(let ((source (standard-move-to-temporary! source 'DATA))
(temp (allocate-temporary-register! 'ADDRESS)))
- (delete-dead-registers!)
(LAP ,@(object->address source)
(MOV L ,source ,(register-reference temp))
(FMOVE D
,(offset-reference temp 1)
- ,(reference-target-alias! target 'FLOAT)))))
+ ,(target-float-reference target)))))
(define-rule statement
(ASSIGN (? target)
(define-rule statement
(ASSIGN (REGISTER (? target))
- (CHAR->ASCII (OFFSET (REGISTER (? address)) (? offset))))
+ (CHAR->ASCII (REGISTER (? source))))
(load-char-into-register 0
- (indirect-char/ascii-reference! address offset)
+ (reference-alias-register! source 'DATA)
target))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (CHAR->ASCII (REGISTER (? source))))
+ (CHAR->ASCII (? expression rtl:simple-offset?)))
(load-char-into-register 0
- (reference-alias-register! source 'DATA)
+ (offset->reference!/char expression)
target))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (BYTE-OFFSET (REGISTER (? address)) (? offset)))
+ (? expression rtl:simple-byte-offset?))
(load-char-into-register 0
- (indirect-byte-reference! address offset)
+ (byte-offset->reference! expression)
target))
(define-rule statement
(ASSIGN (REGISTER (? target))
(CONS-POINTER (MACHINE-CONSTANT (? type))
- (BYTE-OFFSET (REGISTER (? address)) (? offset))))
+ (? expression rtl:simple-byte-offset?)))
(load-char-into-register type
- (indirect-byte-reference! address offset)
+ (byte-offset->reference! expression)
target))
(define-rule statement
- (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
- (CHAR->ASCII (CONSTANT (? character))))
- (LAP (MOV B
- (& ,(char->signed-8-bit-immediate character))
- ,(indirect-byte-reference! address offset))))
+ (ASSIGN (? expression rtl:simple-byte-offset?)
+ (REGISTER (? source)))
+ (LAP (MOV B ,(coerce->any/byte-reference source)
+ ,(byte-offset->reference! expression))))
(define-rule statement
- (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
- (REGISTER (? source)))
- (let ((source (coerce->any/byte-reference source)))
- (let ((target (indirect-byte-reference! address offset)))
- (LAP (MOV B ,source ,target)))))
+ (ASSIGN (? expression rtl:simple-byte-offset?)
+ (CHAR->ASCII (CONSTANT (? character))))
+ (LAP (MOV B (& ,(char->signed-8-bit-immediate character))
+ ,(byte-offset->reference! expression))))
(define-rule statement
- (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (? expression rtl:simple-byte-offset?)
(CHAR->ASCII (REGISTER (? source))))
- (let ((source (coerce->any/byte-reference source)))
- (let ((target (indirect-byte-reference! address offset)))
- (LAP (MOV B ,source ,target)))))
+ (LAP (MOV B ,(coerce->any/byte-reference source)
+ ,(byte-offset->reference! expression))))
(define-rule statement
- (ASSIGN (BYTE-OFFSET (REGISTER (? target)) (? target-offset))
- (CHAR->ASCII (OFFSET (REGISTER (? source)) (? source-offset))))
- (let ((source (indirect-char/ascii-reference! source source-offset)))
- (LAP (MOV B ,source ,(indirect-byte-reference! target target-offset)))))
\ No newline at end of file
+ (ASSIGN (? expression0 rtl:simple-byte-offset?)
+ (CHAR->ASCII (? expression1 rtl:simple-offset?)))
+ (LAP (MOV B ,(offset->reference!/char expression1)
+ ,(byte-offset->reference! expression0))))
+
+(define-rule statement
+ (ASSIGN (? expression0 rtl:simple-byte-offset?)
+ (? expression1 rtl:simple-byte-offset?))
+ (LAP (MOV B ,(byte-offset->reference! expression1)
+ ,(byte-offset->reference! expression0))))
+\f
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (? expression rtl:simple-float-offset?))
+ (let ((ea (float-offset->reference! expression)))
+ (LAP (FMOVE D ,ea ,(target-float-reference target)))))
+
+(define-rule statement
+ (ASSIGN (? expression rtl:simple-float-offset?)
+ (REGISTER (? source)))
+ (LAP (FMOVE D ,(source-float-reference source)
+ ,(float-offset->reference! expression))))
+
+(define (target-float-reference target)
+ (delete-dead-registers!)
+ (reference-target-alias! target 'FLOAT))
+
+(define (source-float-reference source)
+ (register-reference
+ (or (register-alias source 'FLOAT)
+ (allocate-alias-register! source 'FLOAT))))
\ No newline at end of file