#| -*-Scheme-*-
-$Id: machin.scm,v 1.12 1993/06/29 22:25:51 gjr Exp $
+$Id: machin.scm,v 1.13 1993/07/20 00:52:23 gjr Exp $
Copyright (c) 1988-1993 Massachusetts Institute of Technology
(= (rtl:register-number expression) regnum:dynamic-link)))
(define-integrable (interpreter-environment-register)
- (rtl:make-offset (interpreter-regs-pointer) 3))
+ (rtl:make-offset (interpreter-regs-pointer)
+ (rtl:make-machine-constant 3)))
(define (interpreter-environment-register? expression)
(and (rtl:offset? expression)
(interpreter-regs-pointer? (rtl:offset-base expression))
- (= 3 (rtl:offset-number expression))))
+ (let ((offset (rtl:offset-offset expression)))
+ (rtl:machine-constant? offset)
+ (= 3 (rtl:machine-constant-value offset)))))
(define-integrable (interpreter-register:access)
(rtl:make-machine-register regnum:C-return-value))
3)))
((MACHINE-CONSTANT)
(if-integer (rtl:machine-constant-value expression)))
- ((ENTRY:PROCEDURE ENTRY:CONTINUATION ASSIGNMENT-CACHE VARIABLE-CACHE
- OFFSET-ADDRESS)
+ ((ENTRY:PROCEDURE ENTRY:CONTINUATION
+ ASSIGNMENT-CACHE VARIABLE-CACHE
+ OFFSET-ADDRESS BYTE-OFFSET-ADDRESS FLOAT-OFFSET-ADDRESS)
3)
((CONS-NON-POINTER)
(and (rtl:machine-constant? (rtl:cons-non-pointer-type expression))
(define compiler:primitives-with-no-open-coding
'(DIVIDE-FIXNUM GCD-FIXNUM FIXNUM-QUOTIENT FIXNUM-REMAINDER
INTEGER-QUOTIENT INTEGER-REMAINDER &/ QUOTIENT REMAINDER
- FLONUM-SIN FLONUM-COS FLONUM-TAN FLONUM-ASIN FLONUM-ACOS
- FLONUM-ATAN FLONUM-EXP FLONUM-LOG FLONUM-TRUNCATE FLONUM-ROUND
- FLONUM-REMAINDER FLONUM-SQRT
- VECTOR-CONS STRING-ALLOCATE FLOATING-VECTOR-CONS
- FLOATING-VECTOR-REF FLOATING-VECTOR-SET!))
\ No newline at end of file
+ FLONUM-SIN FLONUM-COS FLONUM-TAN FLONUM-ASIN FLONUM-ACOS FLONUM-ATAN2
+ FLONUM-ATAN FLONUM-EXP FLONUM-LOG FLONUM-REMAINDER FLONUM-SQRT
+ FLONUM-TRUNCATE FLONUM-ROUND FLONUM-CEILING FLONUM-FLOOR
+ VECTOR-CONS STRING-ALLOCATE FLOATING-VECTOR-CONS))
\ No newline at end of file
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/mips/rules1.scm,v 1.5 1991/10/25 00:13:22 cph Exp $
+$Id: rules1.scm,v 1.6 1993/07/20 00:52:24 gjr Exp $
-Copyright (c) 1989-91 Massachusetts Institute of Technology
+Copyright (c) 1989-1993 Massachusetts Institute of Technology
This material was developed by the Scheme project at the Massachusetts
Institute of Technology, Department of Electrical Engineering and
MIT in each case. |#
;;;; LAP Generation Rules: Data Transfers
+;;; package: (compiler lap-syntaxer)
(declare (usual-integrations))
\f
(define-rule statement
(ASSIGN (REGISTER (? target)) (OBJECT->ADDRESS (REGISTER (? source))))
(standard-unary-conversion source target object->address))
+\f
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (OFFSET-ADDRESS (REGISTER (? base))
+ (REGISTER (? index))))
+ (shifted-add target base index 2))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (OFFSET-ADDRESS (REGISTER (? source)) (? offset)))
+ (OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? offset))))
(standard-unary-conversion source target
(lambda (source target)
(add-immediate (* 4 offset) source target))))
(define-rule statement
(ASSIGN (REGISTER (? target))
- (BYTE-OFFSET-ADDRESS (REGISTER (? source)) (? offset)))
+ (BYTE-OFFSET-ADDRESS (REGISTER (? base))
+ (REGISTER (? index))))
+ (shifted-add target base index 0))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (BYTE-OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? offset))))
(standard-unary-conversion source target
(lambda (source target)
(add-immediate offset source target))))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET-ADDRESS (REGISTER (? base))
+ (REGISTER (? index))))
+ (shifted-add target base index 3))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET-ADDRESS (REGISTER (? source))
+ (MACHINE-CONSTANT (? offset))))
+ (standard-unary-conversion source target
+ (lambda (source target)
+ (add-immediate (* 8 offset) source target))))
+
+(define (shifted-add target base index shift)
+ (if (zero? shift)
+ (standard-binary-conversion base index target
+ (lambda (base index target)
+ (LAP (ADDU ,target ,base ,index))))
+ (let ((base (standard-source! base))
+ (index (standard-source! index))
+ (temp (standard-temporary!)))
+ (let ((target (standard-target! target)))
+ (LAP (SLL ,temp ,index ,shift)
+ (ADDU ,target ,base ,temp))))))
+
+(define (with-indexed-address base index shift recvr)
+ (let ((base (standard-source! base))
+ (index (standard-source! index))
+ (temp (standard-temporary!)))
+ (if (zero? shift)
+ (LAP (ADDU ,temp ,base ,index)
+ ,@(recvr temp))
+ (LAP (SLL ,temp ,index ,shift)
+ (ADDU ,temp ,base ,temp)
+ ,@(recvr temp)))))
\f
;;;; Loading of Constants
\f
;;;; Transfers from memory
+#|
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (OFFSET (REGISTER (? base)) (REGISTER (? index))))
+ (with-indexed-address base index 2
+ (lambda (address)
+ (let ((target (standard-target! target)))
+ (LAP (LW ,target (OFFSET 0 ,address))
+ (NOP))))))
+|#
+
(define-rule statement
- (ASSIGN (REGISTER (? target)) (OFFSET (REGISTER (? address)) (? offset)))
+ (ASSIGN (REGISTER (? target))
+ (OFFSET (REGISTER (? address)) (MACHINE-CONSTANT (? offset))))
(standard-unary-conversion address target
(lambda (address target)
(LAP (LW ,target (OFFSET ,(* 4 offset) ,address))
;;;; Transfers to memory
+#|
(define-rule statement
;; store an object in memory
- (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (OFFSET (REGISTER (? base)) (REGISTER (? index)))
+ (? source register-expression))
+ (QUALIFIER (word-register? source))
+ (with-indexed-address base index 2
+ (lambda (address)
+ (LAP (SW ,(standard-source! source) (OFFSET 0 ,address))))))
+|#
+
+(define-rule statement
+ ;; store an object in memory
+ (ASSIGN (OFFSET (REGISTER (? address)) (MACHINE-CONSTANT (? offset)))
(? source register-expression))
(QUALIFIER (word-register? source))
(LAP (SW ,(standard-source! source)
(LAP (ADDI ,regnum:stack-pointer ,regnum:stack-pointer -4)
(SW ,(standard-source! source)
(OFFSET 0 ,regnum:stack-pointer))))
-
+\f
;; Cheaper, common patterns.
+#|
(define-rule statement
- (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (OFFSET (REGISTER (? base)) (REGISTER (? index)))
+ (MACHINE-CONSTANT 0))
+ (with-indexed-address base index 2
+ (lambda (address)
+ (LAP (SW 0 (OFFSET 0 ,address))))))
+|#
+
+(define-rule statement
+ (ASSIGN (OFFSET (REGISTER (? address)) (MACHINE-CONSTANT (? offset)))
(MACHINE-CONSTANT 0))
(LAP (SW 0 (OFFSET ,(* 4 offset) ,(standard-source! address)))))
\f
;;;; CHAR->ASCII/BYTE-OFFSET
+#|
(define-rule statement
;; load char object from memory and convert to ASCII byte
(ASSIGN (REGISTER (? target))
- (CHAR->ASCII (OFFSET (REGISTER (? address)) (? offset))))
+ (CHAR->ASCII (OFFSET (REGISTER (? base))
+ (REGISTER (? index)))))
+ (with-indexed-address base index 2
+ (lambda (address)
+ (let ((target (standard-target! target)))
+ (LAP (LBU ,target
+ (OFFSET ,(if (eq? endianness 'LITTLE)
+ 0
+ 3)
+ ,address))
+ (NOP))))))
+|#
+
+(define-rule statement
+ ;; load char object from memory and convert to ASCII byte
+ (ASSIGN (REGISTER (? target))
+ (CHAR->ASCII (OFFSET (REGISTER (? address))
+ (MACHINE-CONSTANT (? offset)))))
(standard-unary-conversion address target
(lambda (address target)
(LAP (LBU ,target
,address))
(NOP)))))
+#|
(define-rule statement
;; load ASCII byte from memory
(ASSIGN (REGISTER (? target))
- (BYTE-OFFSET (REGISTER (? address)) (? offset)))
+ (BYTE-OFFSET (REGISTER (? base))
+ (REGISTER (? index))))
+ (with-indexed-address base index 0
+ (lambda (address)
+ (let ((target (standard-target! target)))
+ (LAP (LBU ,target (OFFSET 0 ,address))
+ (NOP))))))
+|#
+
+(define-rule statement
+ ;; load ASCII byte from memory
+ (ASSIGN (REGISTER (? target))
+ (BYTE-OFFSET (REGISTER (? address))
+ (MACHINE-CONSTANT (? offset))))
(standard-unary-conversion address target
(lambda (address target)
(LAP (LBU ,target (OFFSET ,offset ,address))
(NOP)))))
-
+\f
(define-rule statement
;; convert char object to ASCII byte
;; Missing optimization: If source is home and this is the last
(lambda (source target)
(LAP (ANDI ,target ,source #xFF)))))
+#|
(define-rule statement
;; store null byte in memory
- (ASSIGN (BYTE-OFFSET (REGISTER (? source)) (? offset))
+ (ASSIGN (BYTE-OFFSET (REGISTER (? base))
+ (REGISTER (? index)))
+ (CHAR->ASCII (CONSTANT #\NUL)))
+ (with-indexed-address base index 0
+ (lambda (address)
+ (LAP (SB 0 (OFFSET 0 ,address))))))
+|#
+
+(define-rule statement
+ ;; store null byte in memory
+ (ASSIGN (BYTE-OFFSET (REGISTER (? source))
+ (MACHINE-CONSTANT (? offset)))
(CHAR->ASCII (CONSTANT #\NUL)))
(LAP (SB 0 (OFFSET ,offset ,(standard-source! source)))))
+#|
+(define-rule statement
+ ;; store ASCII byte in memory
+ (ASSIGN (BYTE-OFFSET (REGISTER (? base))
+ (REGISTER (? index)))
+ (REGISTER (? source)))
+ (with-indexed-address base index 0
+ (lambda (address)
+ (LAP (SB ,(standard-source! source) (OFFSET 0 ,address))))))
+|#
+
(define-rule statement
;; store ASCII byte in memory
- (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (BYTE-OFFSET (REGISTER (? address))
+ (MACHINE-CONSTANT (? offset)))
(REGISTER (? source)))
(LAP (SB ,(standard-source! source)
(OFFSET ,offset ,(standard-source! address)))))
+#|
+(define-rule statement
+ ;; convert char object to ASCII byte and store it in memory
+ ;; register + byte offset <- contents of register (clear top bits)
+ (ASSIGN (BYTE-OFFSET (REGISTER (? base)) (REGISTER (? index)))
+ (CHAR->ASCII (REGISTER (? source))))
+ (with-indexed-address base index 0
+ (lambda (address)
+ (LAP (SB ,(standard-source! source) (OFFSET 0 ,address))))))
+|#
+
(define-rule statement
;; convert char object to ASCII byte and store it in memory
;; register + byte offset <- contents of register (clear top bits)
- (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
+ (ASSIGN (BYTE-OFFSET (REGISTER (? address))
+ (MACHINE-CONSTANT (? offset)))
(CHAR->ASCII (REGISTER (? source))))
(LAP (SB ,(standard-source! source)
(OFFSET ,offset ,(standard-source! address)))))
\ No newline at end of file
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/mips/rulflo.scm,v 1.6 1991/10/25 00:13:40 cph Exp $
+$Id: rulflo.scm,v 1.7 1993/07/20 00:52:26 gjr Exp $
-Copyright (c) 1989-91 Massachusetts Institute of Technology
+Copyright (c) 1989-1993 Massachusetts Institute of Technology
This material was developed by the Scheme project at the Massachusetts
Institute of Technology, Department of Electrical Engineering and
(let ((target (fpr->float-register (flonum-target! target))))
(LAP ,@(object->address source source)
,@(fp-load-doubleword 4 source target #T)))))
+
+;; Floating-point vector support
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET (REGISTER (? base))
+ (MACHINE-CONSTANT (? offset))))
+ (let* ((base (standard-source! base))
+ (target (fpr->float-register (flonum-target! target))))
+ (fp-load-doubleword (* 8 offset) base target #T)))
+
+(define-rule statement
+ (ASSIGN (FLOAT-OFFSET (REGISTER (? base))
+ (MACHINE-CONSTANT (? offset)))
+ (REGISTER (? source)))
+ (let ((base (standard-source! base))
+ (source (fpr->float-register (flonum-source! source))))
+ (fp-store-doubleword (* 8 offset) base source)))
+\f
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET (REGISTER (? base)) (REGISTER (? index))))
+ (with-indexed-address base index 3
+ (lambda (address)
+ (fp-load-doubleword 0 address
+ (fpr->float-register (flonum-target! target)) #T))))
+
+(define-rule statement
+ (ASSIGN (FLOAT-OFFSET (REGISTER (? base)) (REGISTER (? index)))
+ (REGISTER (? source)))
+ (with-indexed-address base index 3
+ (lambda (address)
+ (fp-store-doubleword 0 address
+ (fpr->float-register (flonum-source! source))))))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET (OFFSET-ADDRESS (REGISTER (? base))
+ (MACHINE-CONSTANT (? w-offset)))
+ (MACHINE-CONSTANT (? f-offset))))
+ (let* ((base (standard-source! base))
+ (target (fpr->float-register (flonum-target! target))))
+ (fp-load-doubleword (+ (* 4 w-offset) (* 8 f-offset)) base target #T)))
+
+(define-rule statement
+ (ASSIGN (FLOAT-OFFSET (OFFSET-ADDRESS (REGISTER (? base))
+ (MACHINE-CONSTANT (? w-offset)))
+ (MACHINE-CONSTANT (? f-offset)))
+ (REGISTER (? source)))
+ (let ((base (standard-source! base))
+ (source (fpr->float-register (flonum-source! source))))
+ (fp-store-doubleword (+ (* 4 w-offset) (* 8 f-offset)) base source)))
+
+(define-rule statement
+ (ASSIGN (REGISTER (? target))
+ (FLOAT-OFFSET (OFFSET-ADDRESS (REGISTER (? base))
+ (MACHINE-CONSTANT (? w-offset)))
+ (REGISTER (? index))))
+ (with-indexed-address base index 3
+ (lambda (address)
+ (fp-load-doubleword (* 4 w-offset) address
+ (fpr->float-register (flonum-target! target))
+ #T))))
+
+(define-rule statement
+ (ASSIGN (FLOAT-OFFSET (OFFSET-ADDRESS (REGISTER (? base))
+ (MACHINE-CONSTANT (? w-offset)))
+ (REGISTER (? index)))
+ (REGISTER (? source)))
+ (with-indexed-address base index 3
+ (lambda (address)
+ (fp-store-doubleword (* 4 w-offset) address
+ (fpr->float-register (flonum-source! source))))))
\f
;;;; Flonum Arithmetic