mescc: Fix clobbering of struct by value assign.
[mes.git] / module / mescc / x86_64 / as.scm
index 0b11af006e19e503aab90aae7ab0423f7294b79e..968d7c4beb2a218597df27189aeeef86abf71b27 100644 (file)
     `((,(string-append "mov____(%" r0 "),%" r2))
       (,(string-append "mov____%" r2 ",(%" r1 ")")))))
 
+(define (x86_64:byte-r0-mem->r1-mem info)
+  (let* ((registers (.registers info))
+         (r0 (get-r0 info))
+         (r1 (get-r1 info))
+         (r2 (car registers))
+         (l2 (r->l r2)))
+    `((,(string-append "mov____(%" r0 "),%" l2))
+      (,(string-append "mov____%" l2 ",(%" r1 ")")))))
+
+(define (x86_64:word-r0-mem->r1-mem info)
+  (let* ((registers (.registers info))
+         (r0 (get-r0 info))
+         (r1 (get-r1 info))
+         (r2 (car registers))
+         (x2 (r->x r2)))
+    `((,(string-append "mov____(%" r0 "),%" x2))
+      (,(string-append "mov____%" x2 ",(%" r1 ")")))))
+
+(define (x86_64:long-r0-mem->r1-mem info)
+  (let* ((registers (.registers info))
+         (r0 (get-r0 info))
+         (r1 (get-r1 info))
+         (r2 (car registers))
+         (e2 (r->e r2)))
+    `((,(string-append "mov____(%" r0 "),%" e2))
+      (,(string-append "mov____%" e2 ",(%" r1 ")")))))
+
 (define (x86_64:r0+value info v)
   (let ((r0 (get-r0 info)))
     `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,%" r0) (#:immediate1 ,v))
     (byte-r . ,x86_64:byte-r)
     (byte-r->local+n . ,x86_64:byte-r->local+n)
     (byte-r0->r1-mem . ,x86_64:byte-r0->r1-mem)
-    (byte-r0->r1-mem . ,x86_64:byte-r0->r1-mem)
+    (byte-r0-mem->r1-mem . ,x86_64:byte-r0-mem->r1-mem)
     (byte-signed-r . ,x86_64:byte-signed-r)
     (call-label . ,x86_64:call-label)
     (call-r . ,x86_64:call-r)
     (long-r . ,x86_64:long-r)
     (long-r->local+n . ,x86_64:long-r->local+n)
     (long-r0->r1-mem . ,x86_64:long-r0->r1-mem)
+    (long-r0-mem->r1-mem . ,x86_64:long-r0-mem->r1-mem)
     (long-signed-r . ,x86_64:long-signed-r)
     (mem->r . ,x86_64:mem->r)
     (nop . ,x86_64:nop)
     (word-r . ,x86_64:word-r)
     (word-r->local+n . ,x86_64:word-r->local+n)
     (word-r0->r1-mem . ,x86_64:word-r0->r1-mem)
+    (word-r0-mem->r1-mem . ,x86_64:word-r0-mem->r1-mem)
     (word-signed-r . ,x86_64:word-signed-r)
     (xor-zf . ,x86_64:xor-zf)
     (zf->r . ,x86_64:zf->r)