Let caller specify how to get a temporary in ADD-IMMEDIATE.
authorTaylor R Campbell <campbell@mumble.net>
Sun, 25 Aug 2019 15:40:15 +0000 (15:40 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Sun, 25 Aug 2019 19:11:54 +0000 (19:11 +0000)
Fixes

;  Compiling file: "test-hack.bin" => "test-hack.com"...
;Unassigned variable: *needed-registers*

because of attempt to allocate a temporary in ADD-IMMEDIATE during
GENERATE/REMOTE-LINKS.

src/compiler/machines/aarch64/lapgen.scm
src/compiler/machines/aarch64/rules2.scm
src/compiler/machines/aarch64/rules3.scm
src/compiler/machines/aarch64/rulfix.scm

index 6590d91f21dcaa4cc90c3455293c378b818b21a6..c45811ab8383aa8d923d18c60f2adefa20c153e1 100644 (file)
@@ -297,7 +297,7 @@ USA.
 (define (load-displaced-address target base offset scale)
   (standard-unary target base
     (lambda (target base)
-      (add-immediate target base (* offset scale)))))
+      (add-immediate target base (* offset scale) general-temporary!))))
 
 (define (load-indexed-address target base offset scale)
   (standard-binary target base offset
@@ -362,23 +362,23 @@ USA.
              (MOVK X ,target (LSL (&U ,(chunk16 32)) 32))
              (MOVK X ,target (LSL (&U ,(chunk16 48)) 48))))))
 \f
-(define (add-immediate target source imm)
+(define (add-immediate target source imm get-temporary)
   (define (add addend) (LAP (ADD X ,target ,source ,addend)))
   (define (sub addend) (LAP (SUB X ,target ,source ,addend)))
-  (immediate-addition imm add sub))
+  (immediate-addition imm add sub get-temporary))
 
-(define (add-immediate-with-flags target source imm)
+(define (add-immediate-with-flags target source imm get-temporary)
   (define (adds addend) (LAP (ADDS X ,target ,source ,addend)))
   (define (subs addend) (LAP (SUBS X ,target ,source ,addend)))
-  (immediate-addition imm adds subs))
+  (immediate-addition imm adds subs get-temporary))
 
-(define (cmp-immediate source imm)
+(define (cmp-immediate source imm get-temporary)
   ;; Same as above but with zero destination.
   (define (cmp operand) (LAP (CMP X ,source ,operand)))
   (define (cmn operand) (LAP (CMN X ,source ,operand)))
-  (immediate-addition imm cmp cmn))
+  (immediate-addition imm cmp cmn get-temporary))
 
-(define (immediate-addition imm add sub)
+(define (immediate-addition imm add sub get-temporary)
   ;; XXX Use INST-EA instead of quasiquote?  Dunno...
   (cond ((fits-in-unsigned-12? imm)
          (add `(&U ,imm)))
index 1d555f97637ae7519310f8d05e8cdfb30291a072..bf455ead8d9b1612fe1ea5b155c8bac8a32adec3 100644 (file)
@@ -98,7 +98,7 @@ USA.
       (zero-test! register)
       (begin
         (set-equal-branches!)
-        (cmp-immediate register immediate))))
+        (cmp-immediate register immediate general-temporary!))))
 
 (define (set-always-branches!)
   (set-current-branches!
index 18a340d49571133d69c8d523c0905de218d291a3..996be6e4558b8ac56e74090b2d9a15deb4da2a9d 100644 (file)
@@ -583,7 +583,8 @@ USA.
             (STR X ,target ,Free)
             ,@(register->register-transfer Free target)
             ,@(add-immediate Free Free
-                             (* address-units-per-object (+ 1 size))))))
+                             (* address-units-per-object (+ 1 size))
+                             general-temporary!))))
     ((1)
      (let ((entry (vector-ref entries 0)))
        (generate/cons-closure target
@@ -610,7 +611,7 @@ USA.
          ;; the next object.  We do this because we need to set the
          ;; last component here, but we do not have negative load/store
          ;; offsets without pre/post-increment.
-         ,@(add-immediate Free Free (* 8 size))
+         ,@(add-immediate Free Free (* 8 size) general-temporary!)
          ;; Set the last component to be the relocation reference point.
          ,@(affix-type temp type-code:compiled-entry target general-temporary!)
          (STR X ,temp (POST+ ,Free (& 8))))))
@@ -647,7 +648,7 @@ USA.
          ;; the next object.  We do this because we need to set the
          ;; last component here, but we do not have negative load/store
          ;; offsets without pre/post-increment.
-         ,@(add-immediate Free Free (* 8 size))
+         ,@(add-immediate Free Free (* 8 size) general-temporary!)
          ;; Set the last component to be the relocation reference point.
          ,@(affix-type temp type-code:compiled-entry target general-temporary!)
          (STR X ,temp (POST+ ,Free (& 8))))))
@@ -737,7 +738,7 @@ USA.
          ;; Set this block's environment.
          (STR X ,temp (+ ,arg2 (&U (* 8 ,environment-index))))
          ;; arg3 := constants address
-         ,@(add-immediate arg3 arg2 free-ref-offset)
+         ,@(add-immediate arg3 arg2 free-ref-offset (lambda () temp))
          ;; arg4 := n sections
          ,@(load-unsigned-immediate arg4 n-sections)
          ,@(invoke-interface/call code:compiler-link continuation-label)
index 0af7cec4ec70ead4e49ab34e2db0636f775c7fd9..6716c977edd0329524dbf3bd87d4f4f6261fecce 100644 (file)
@@ -106,13 +106,13 @@ USA.
 (define (fixnum-add-constant target source n overflow?)
   (let ((imm (* fixnum-1 n)))
     (cond ((not overflow?)
-           (add-immediate target source imm))
+           (add-immediate target source imm general-temporary!))
           ((zero? n)
            (set-never-branches!)
            (register->register-transfer source target))
           (else
            (set-overflow-branches!)
-           (add-immediate-with-flags target source imm)))))
+           (add-immediate-with-flags target source imm general-temporary!)))))
 
 (define (load-fixnum-constant target n)
   (load-signed-immediate target (* n fixnum-1)))