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