ref: 1bf649bb8a77d72a5333d6290776b436c86e3134
parent: dc1c40487c001a71917a25627c2d9e14891f401b
	author: Ori Bernstein <ori@eigenstate.org>
	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;
}
}
--
⑨