mescc: Fix clobbering of struct by value assign.
[mes.git] / module / mescc / compile.scm
index 7d32a56c3197052e541c0a0ffac2659abc4409ec..d82724def744cde53a6daaa16e26bddf523bab38 100644 (file)
   (let ((reg-size (->size "*" info)))
     (wrap-as
      (cond
-       ((= n 1) (as info 'byte-r0->r1-mem))
-       ((= n 2) (cond ((= size 1) (append (as info 'byte-r0->r1-mem)
-                                          (as info 'r+value 1)
-                                          (as info 'value->r0 0)
-                                          (as info 'byte-r0->r1-mem)))
-                      (else (as info 'word-r0->r1-mem))))
-       ((= n 4) (as info 'long-r0->r1-mem))
-       ((and (= n 8) (or (= reg-size 8)
-                         (= size 4)))
-        (cond ((= size 4) (append (as info 'long-r0->r1-mem)
-                                  (as info 'r+value 4)
-                                  (as info 'value->r0 0)
-                                  (as info 'long-r0->r1-mem)))
-              ((and (= size 8) (= reg-size 8)) (as info 'quad-r0->r1-mem))
-              (else (error "r0->r1-mem*n-: not supported"))))
-       (else (append (let loop ((i 0))
-                       (if (>= i n) '()
-                           (append (if (= i 0) '()
-                                       (append (as info 'r+value reg-size)
-                                               (as info 'r0+value reg-size)))
-                                   (case (- n i)
-                                     ((1) (append (as info 'r+value -3)
-                                                  (as info 'r0+value -3)
-                                                  (as info 'r0-mem->r1-mem)))
-                                     ((2) (append (as info 'r+value -2)
-                                                  (as info 'r0+value -2)
-                                                  (as info 'r0-mem->r1-mem)))
-                                     ((3) (append (as info 'r+value -1)
-                                                  (as info 'r0+value -1)
-                                                  (as info 'r0-mem->r1-mem)))
-                                     (else (as info 'r0-mem->r1-mem)))
-                                   (loop (+ i reg-size)))))))))))
+      ((= n 1) (as info 'byte-r0->r1-mem))
+      ((= n 2) (cond ((= size 1) (append (as info 'byte-r0->r1-mem)
+                                         (as info 'r+value 1)
+                                         (as info 'value->r0 0)
+                                         (as info 'byte-r0->r1-mem)))
+                     (else (as info 'word-r0->r1-mem))))
+      ((= n 4) (as info 'long-r0->r1-mem))
+      ((and (= n 8) (or (= reg-size 8)
+                        (= size 4)))
+       (cond ((= size 4) (append (as info 'long-r0->r1-mem)
+                                 (as info 'r+value 4)
+                                 (as info 'value->r0 0)
+                                 (as info 'long-r0->r1-mem)))
+             ((and (= size 8) (= reg-size 8)) (as info 'quad-r0->r1-mem))
+             (else (error "r0->r1-mem*n-: not supported"))))
+      (else (let loop ((i 0))
+              (if (>= i n) '()
+                  (case (- n i)
+                    ((1) (as info 'byte-r0-mem->r1-mem))
+                    ((2) (as info 'word-r0-mem->r1-mem))
+                    ((3) (append (as info 'word-r0-mem->r1-mem)
+                                 (as info 'r+value 2)
+                                 (as info 'r0+value 2)
+                                 (loop (+ i 2))))
+                    ((4) (append (as info 'long-r0-mem->r1-mem)))
+                    (else (append (as info 'r0-mem->r1-mem)
+                                  (as info 'r+value reg-size)
+                                  (as info 'r0+value reg-size)
+                                  (loop (+ i reg-size))))))))))))
 
 (define (r0->r1-mem*n info n size)
   (append-text info (r0->r1-mem*n- info n size)))