shithub: mc

Download patch

ref: 3eac4fd0e131b25af66ac9e0952cafab6b0b965f
parent: c2288eaf1b9e3a8d824ce361bfa76b60cdba36fe
author: Ori Bernstein <[email protected]>
date: Sun Sep 7 18:31:04 EDT 2014

Clean up the blitting code.

    First, simplifies the generation code. Second, tries to use
    the largest 'mov's available.

--- a/6/isel.c
+++ b/6/isel.c
@@ -374,7 +374,8 @@
 
 static void blit(Isel *s, Loc *to, Loc *from, size_t dstoff, size_t srcoff, size_t sz)
 {
-    size_t i;
+    size_t i, m, modesz;
+    Mode modes[] = {ModeQ, ModeL, ModeW, ModeB, ModeNone};
     Loc *sp, *dp; /* pointers to src, dst */
     Loc *tmp, *src, *dst; /* source memory, dst memory */
 
@@ -381,23 +382,18 @@
     sp = inr(s, from);
     dp = inr(s, to);
 
-    /* Slightly funny loop condition: We might have trailing bytes
-     * that we can't blit word-wise. */
-    tmp = locreg(ModeQ);
-    for (i = 0; i < sz/Ptrsz; i++) {
-        src = locmem(i*Ptrsz + srcoff, sp, NULL, ModeQ);
-        dst = locmem(i*Ptrsz + dstoff, dp, NULL, ModeQ);
-        g(s, Imov, src, tmp, NULL);
-        g(s, Imov, tmp, dst, NULL);
-    }
-    /* now, the trailing bytes */
-    tmp = locreg(ModeB);
-    i *= Ptrsz; /* we counted in Ptrsz chunks; now we need a byte offset */
-    for (; i < sz; i++) {
-        src = locmem(i + srcoff, sp, NULL, ModeB);
-        dst = locmem(i + dstoff, dp, NULL, ModeB);
-        g(s, Imov, src, tmp, NULL);
-        g(s, Imov, tmp, dst, NULL);
+    modesz = 8;
+    i = 0;
+    for (m = 0; modes[m] != ModeNone; m++) {
+        tmp = locreg(modes[m]);
+        while (i + modesz <= sz) {
+            src = locmem(i + srcoff, sp, NULL, modes[m]);
+            dst = locmem(i + dstoff, dp, NULL, modes[m]);
+            g(s, Imov, src, tmp, NULL);
+            g(s, Imov, tmp, dst, NULL);
+            i += modesz;
+        }
+        modesz /= 2;
     }
 }