shithub: rd

Download patch

ref: a417c3351cf35b6005ff5324b84caa5a1ec8097a
parent: c682a8b62453198bc2a2eafa96637cae61be64ed
author: Yaroslav K <yarikos@gmail.com>
date: Tue Mar 31 15:13:26 EDT 2026

Optimized memfill

--- a/rle.c
+++ b/rle.c
@@ -59,19 +59,28 @@
 static void*
 memfill(void *a1, ulong n1, void *a2, ulong n2)
 {
-	char *s1, *s2, *e1, *e2;
+	char *p, *e;
 
 	if((long)n1 < 0 || (long)n2 <= 0)
 		abort();
-	s1 = a1;
-	s2 = a2;
-	e1 = s1+n1;
-	e2 = s2+n2;
-	while(s1 < e1){
-		*s1++ = *s2++;
-		if(s2 >= e2)
-			s2 = a2;
+
+	if(n2 > n1)
+		n2 = n1;
+
+	memmove(a1, a2, n2);
+
+	p = (char*)a1 + n2;
+	e = (char*)a1 + n1;
+
+	while(p + n2 < e){
+		memmove(p, a1, n2);
+		p += n2;
+		n2 <<= 1;
 	}
+
+	if(p < e)
+		memmove(p, a1, e - p);
+
 	return a1;
 }
 
--