From: ssmith Date: Fri, 20 Jan 1995 22:45:55 +0000 (+0000) Subject: Made EBP switchable between datum mask and scratch register. X-Git-Tag: 20090517-FFI~6713 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=f9e9bfe223ef0c5a1579f888a557e45ead4d5b8d;p=mit-scheme.git Made EBP switchable between datum mask and scratch register. --- diff --git a/v8/src/compiler/machines/i386/lapgen.scm b/v8/src/compiler/machines/i386/lapgen.scm index 35da3a06a..4286185cc 100644 --- a/v8/src/compiler/machines/i386/lapgen.scm +++ b/v8/src/compiler/machines/i386/lapgen.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Id: lapgen.scm,v 1.5 1995/01/20 20:15:59 ssmith Exp $ +$Id: lapgen.scm,v 1.6 1995/01/20 22:45:36 ssmith Exp $ Copyright (c) 1992-1993 Massachusetts Institute of Technology @@ -39,13 +39,22 @@ MIT in each case. |# ;;;; Register-Allocator Interface -(define available-machine-registers - ;; esp holds the the stack pointer - ;; ebp holds the pointer mask - ;; esi holds the register array pointer - ;; edi holds the free pointer - ;; fr7 is not used so that we can always push on the stack once. - (list eax ecx edx ebx fr0 fr1 fr2 fr3 fr4 fr5 fr6)) +(define available-machine-registers) + +(if use-ebp-as-mask? + (set! available-machine-registers + ;; esp holds the the stack pointer + ;; ebp holds the pointer mask + ;; esi holds the register array pointer + ;; edi holds the free pointer + ;; fr7 is not used so that we can always push on the stack once. + (list eax ecx edx ebx fr0 fr1 fr2 fr3 fr4 fr5 fr6)) + (set! available-machine-registers + ;; esp holds the the stack pointer + ;; esi holds the register array pointer + ;; edi holds the free pointer + ;; fr7 is not used so that we can always push on the stack once. + (list eax ecx edx ebx ebp fr0 fr1 fr2 fr3 fr4 fr5 fr6))) (define-integrable (sort-machine-registers registers) registers) @@ -509,7 +518,7 @@ MIT in each case. |# (LAP (SHR W ,target (& ,scheme-datum-width)))) (define (object->datum target) - (LAP (AND W ,target (R ,regnum:datum-mask)))) + (LAP (AND W ,target ,datum-mask-value))) (define (object->address target) (declare (integrate-operator object->datum)) @@ -721,14 +730,11 @@ MIT in each case. |# (error "To must be a fixnum and from must be a fixnum or #f" from to) (cond ((eqv? from to) (LAP)) - ((false? from) - (if (= to 0) - (LAP (AND W (R ,reg) (R ,regnum:datum-mask))) - (LAP (AND W (R ,reg) (R ,regnum:datum-mask)) - (OR W (R ,reg) (& ,(fix:lsh to scheme-type-width)))))) ((eqv? (fix:or from to) to) (LAP (OR W (R ,reg) (& ,(fix:lsh to scheme-type-width))))) (else - (LAP (AND W (R ,reg) (R ,regnum:datum-mask)) - (OR W (R ,reg) (& ,(fix:lsh to scheme-type-width)))))))) + (if (= to 0) + (LAP (AND W (R ,reg) ,datum-mask-value)) + (LAP (AND W (R ,reg) ,datum-mask-value) + (OR W (R ,reg) (& ,(fix:lsh to scheme-type-width))))))))) diff --git a/v8/src/compiler/machines/i386/machin.scm b/v8/src/compiler/machines/i386/machin.scm index 2966e5628..427267e92 100644 --- a/v8/src/compiler/machines/i386/machin.scm +++ b/v8/src/compiler/machines/i386/machin.scm @@ -1,6 +1,6 @@ #| -*-Scheme-*- -$Id: machin.scm,v 1.6 1995/01/20 20:16:50 ssmith Exp $ +$Id: machin.scm,v 1.7 1995/01/20 22:45:45 ssmith Exp $ Copyright (c) 1992-1995 Massachusetts Institute of Technology @@ -161,6 +161,10 @@ MIT in each case. |# ;;;; Machine registers +;; This gives us an extra scratch register +(define use-ebp-as-mask? #f) + + (define eax 0) ; acumulator (define ecx 1) ; counter register (define edx 2) ; multiplication high-half target @@ -187,30 +191,58 @@ MIT in each case. |# (define number-of-temporary-registers 256) (define-integrable regnum:stack-pointer esp) -(define-integrable regnum:datum-mask ebp) + + + (define-integrable regnum:regs-pointer esi) (define-integrable regnum:free-pointer edi) (define-integrable regnum:hook eax) (define-integrable regnum:first-arg ecx) (define-integrable regnum:second-arg edx) +(define datum-mask-value) +(define regnum:datum-mask) + +(if use-ebp-as-mask? + (begin + (set! regnum:datum-mask ebp) + (set! datum-mask-value `(R ,ebp))) + (set! datum-mask-value `(& ,(- (expt 2 scheme-datum-width) 1)))) + (define-integrable (machine-register-known-value register) register ; ignored false) -(define (machine-register-value-class register) - (cond ((<= eax register ebx) - value-class=object) - ((= register regnum:datum-mask) - value-class=immediate) - ((or (= register regnum:stack-pointer) - (= register regnum:free-pointer) - (= register regnum:regs-pointer)) - value-class=address) - ((<= fr0 register fr7) - value-class=float) - (else - (error "illegal machine register" register)))) +(define machine-register-value-class) + +(if use-ebp-as-mask? + (set! machine-register-value-class + (lambda (register) + (cond ((<= eax register ebx) + value-class=object) + ((= register regnum:datum-mask) + value-class=immediate) + ((or (= register regnum:stack-pointer) + (= register regnum:free-pointer) + (= register regnum:regs-pointer)) + value-class=address) + ((<= fr0 register fr7) + value-class=float) + (else + (error "illegal machine register" register))))) + (set! machine-register-value-class + (lambda (register) + (cond ((or (<= eax register ebx) + (= ebp register)) + value-class=object) + ((or (= register regnum:stack-pointer) + (= register regnum:free-pointer) + (= register regnum:regs-pointer)) + value-class=address) + ((<= fr0 register fr7) + value-class=float) + (else + (error "illegal machine register" register)))))) (define *rtlgen/argument-registers* (vector ecx edx)) diff --git a/v8/src/compiler/machines/i386/rules3.scm b/v8/src/compiler/machines/i386/rules3.scm index 512012857..27126c2a0 100644 --- a/v8/src/compiler/machines/i386/rules3.scm +++ b/v8/src/compiler/machines/i386/rules3.scm @@ -1,6 +1,6 @@ -t#| -*-Scheme-*- +#| -*-Scheme-*- -$Id: rules3.scm,v 1.9 1995/01/20 20:17:29 ssmith Exp $ +$Id: rules3.scm,v 1.10 1995/01/20 22:45:55 ssmith Exp $ Copyright (c) 1992-1993 Massachusetts Institute of Technology @@ -40,7 +40,7 @@ MIT in each case. |# ;;;; Invocations (define-integrable (clear-continuation-type-code) - (LAP (AND W (@R ,regnum:stack-pointer) (R ,regnum:datum-mask)))) + (LAP (AND W (@R ,regnum:stack-pointer) ,datum-mask-value))) (define-rule statement (POP-RETURN) @@ -809,7 +809,7 @@ MIT in each case. |# (lambda (pc-label prefix) (LAP ,@prefix (MOV W (R ,edx) (@RO W ,eax (- ,code-block-label ,pc-label))) - (AND W (R ,edx) (R ,regnum:datum-mask)) + (AND W (R ,edx) ,datum-mask-value) (LEA (R ,ebx) (@RO W ,edx ,free-ref-offset)) (MOV W (R ,ecx) ,reg:environment) (MOV W (@RO W ,edx ,environment-offset) (R ,ecx)) @@ -843,31 +843,31 @@ MIT in each case. |# (XOR W (R ,ebx) (R ,ebx)) (MOV B (R ,ebx) (@ROI B ,eax (- ,bytes ,pc-label) ,ecx 1)) ;; address of vector - (AND W (R ,edx) (R ,regnum:datum-mask)) + (AND W (R ,edx) ,datum-mask-value) ;; Store n-sections in arg (MOV W ,reg:utility-arg-4 (R ,ebx)) ;; vector-ref -> cc block (MOV W (R ,edx) (@ROI B ,edx 4 ,ecx 4)) ;; address of cc-block - (AND W (R ,edx) (R ,regnum:datum-mask)) + (AND W (R ,edx) ,datum-mask-value) ;; cc-block length (MOV W (R ,ebx) (@R ,edx)) ;; Get environment (MOV W (R ,ecx) ,reg:environment) ;; Eliminate length tags - (AND W (R ,ebx) (R ,regnum:datum-mask)) + (AND W (R ,ebx) ,datum-mask-value) ;; Store environment (MOV W (@RI ,edx ,ebx 4) (R ,ecx)) ;; Get NMV header (MOV W (R ,ecx) (@RO B ,edx 4)) ;; Eliminate NMV tag - (AND W (R ,ecx) (R ,regnum:datum-mask)) + (AND W (R ,ecx) ,datum-mask-value) ;; Address of first free reference (LEA (R ,ebx) (@ROI B ,edx 8 ,ecx 4)) ;; Invoke linker ,@(invoke-hook/call entry:compiler-link) ,@(make-external-label (continuation-code-word false) - (generate-label)) + (generate-label)) ;; Increment counter and loop (INC W (@R ,esp)) (CMP W (@R ,esp) (& ,n-blocks))