svm: Added compiler temporaries, for now, with warnings.
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Sun, 5 Feb 2012 22:46:25 +0000 (15:46 -0700)
committerMatt Birkholz <matt@birkholz.chandler.az.us>
Sun, 5 Feb 2012 22:46:25 +0000 (15:46 -0700)
src/compiler/machines/svm/lapgen.scm
src/compiler/machines/svm/machine.scm
src/microcode/cmpintmd/svm1.h
src/microcode/svm1-interp.c

index 7f532932fa5596097dd174cd558167b984d9d31a..24ce0ddbfd8d5c03c5362d29f2fdccb85d3fab89 100644 (file)
@@ -61,27 +61,26 @@ USA.
         (error:bad-range-argument source #f))))
 
 (define (home->register-transfer source target)
-  ;; Not sure why this started happening after 9.1.1 during the
-  ;; compilation of runtime/poplat.scm...
-  (warn "Ignoring unspill:" source "->" target)
-  (LAP))
+  (warn "Unspilled:" source "->" target)
+  (LAP ,@(inst:load (register-type source)
+                   (register-reference target)
+                   (home source))))
 
 (define (register->home-transfer source target)
-  ;; Not sure why this started happening after 9.1.1 during the
-  ;; compilation of runtime/poplat.scm...
-  (warn "Ignoring spill:" source "->" target)
-  (LAP))
+  (warn "Spilled:" source "->" target)
+  (LAP ,@(inst:store (register-type target)
+                    (register-reference source)
+                    (home target))))
 
 (define (pseudo-register-home register)
-  ;; With 256 registers, pseudo registers should not need "homes".
-  ;; Before 9.1.1 this was true.  Lately runtime/poplat.scm gets the
-  ;; no-reuse-possible optimization in standard-register-reference,
-  ;; which assumes a home.
-
-  ;; That optimization in standard-register-reference is the only use
-  ;; of pseudo-register-home in the machine-independent compiler, so
-  ;; this definition just aims to defeat it for now.
-  (reference-alias-register! register (register-type register)))
+  (warn "Needed home:" register)
+  (home register))
+
+(define-integrable (home register)
+  (ea:offset rref:interpreter-register-block
+            (+ number-of-fixed-interpreter-registers
+                (* words-per-compiler-temporary (register-renumber register)))
+            'WORD))
 \f
 ;;;; Linearizer interface
 
index d8194a78ed4501a541c77da6b824684b39e8cc9b..b341b66b1ca6ccfe7b5707cc85b0139f2d59fcbc 100644 (file)
@@ -280,7 +280,9 @@ USA.
 ;;;; Machine registers, register references.
 
 (define-integrable number-of-machine-registers 512)
-(define-integrable number-of-temporary-registers 512)
+(define-integrable number-of-temporary-registers 256)
+(define-integrable number-of-fixed-interpreter-registers 14)
+(define-integrable words-per-compiler-temporary 2)
 
 (define register-reference
   (let ((references (make-vector number-of-machine-registers)))
index 5c77d3e432a4f52c864d1e73525512137835932c..332e754a2aa63a8fe313c3f18f40f9129839d059 100644 (file)
@@ -31,7 +31,9 @@ USA.
 
 #define ASM_RESET_HOOK initialize_svm1
 
-#define COMPILER_REGBLOCK_N_FIXED 512
+#define COMPILER_REGBLOCK_N_TEMPS 256
+#define COMPILER_TEMP_SIZE ((sizeof (double)) / (sizeof (SCHEME_OBJECT)))
+#define COMPILER_REGBLOCK_N_FIXED REGBLOCK_MINIMUM_LENGTH
 
 typedef byte_t insn_t;
 
index 28a1cf7cb9a2e95831c6f0d6caef97c8ef6a91ed..4b25452f1573617735083ebf71ebe3e88b56b99b 100644 (file)
@@ -180,6 +180,10 @@ initialize_svm1 (void)
   for (i = 0; (i < N_FLOAT_REGISTERS); i += 1)
     FREG_SET (i, 0.0);
   WREG_SET (SVM1_REG_INTERPRETER_REGISTER_BLOCK, ((word_t)Registers));
+
+  /* These are hard-coded into compiler/machines/svm/machine.scm. */
+  assert (COMPILER_TEMP_SIZE == 2);
+  assert (COMPILER_REGBLOCK_N_FIXED == 14);
 }
 
 #define IMPORT_REGS() do                                               \