<html><body>
<p><font size="2" face="sans-serif">If you compile with -O3, gcc will already do loop unrolling for naive implementations. There isn't a good reason to make the code more complex when you could just enable -O3 for your libc parts. <br>
</font><font size="2" face="sans-serif"><br>
</font><font size="2" face="sans-serif">Patrick<br>
</font><font size="2" face="sans-serif"><br>
</font><font size="2" face="sans-serif">> On May 7, 2015, at 2:12 AM, Stewart Smith <stewart@linux.vnet.ibm.com> wrote:<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> Makes booting with gcov enabled take dozens of seconds faster<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com><br>
</font><font size="2" face="sans-serif">> ---<br>
</font><font size="2" face="sans-serif">> libc/string/memset.c        |   15 ++++++++++++++-<br>
</font><font size="2" face="sans-serif">> libc/test/run-memops-test.c |   16 ++++++++++++++++<br>
</font><font size="2" face="sans-serif">> libc/test/run-memops.c      |    3 +++<br>
</font><font size="2" face="sans-serif">> 3 files changed, 33 insertions(+), 1 deletion(-)<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> diff --git a/libc/string/memset.c b/libc/string/memset.c<br>
</font><font size="2" face="sans-serif">> index f8dfbf5..e7172b0 100644<br>
</font><font size="2" face="sans-serif">> --- a/libc/string/memset.c<br>
</font><font size="2" face="sans-serif">> +++ b/libc/string/memset.c<br>
</font><font size="2" face="sans-serif">> @@ -15,7 +15,20 @@<br>
</font><font size="2" face="sans-serif">> void *<br>
</font><font size="2" face="sans-serif">> memset(void *dest, int c, size_t size)<br>
</font><font size="2" face="sans-serif">> {<br>
</font><font size="2" face="sans-serif">> -    unsigned char *d = (unsigned char *)dest;<br>
</font><font size="2" face="sans-serif">> +    unsigned char *d;<br>
</font><font size="2" face="sans-serif">> +    unsigned long long *d64 = (unsigned long long*)dest;<br>
</font><font size="2" face="sans-serif">> +    unsigned long long c8 = c;<br>
</font><font size="2" face="sans-serif">> +<br>
</font><font size="2" face="sans-serif">> +    if (size > 8) {<br>
</font><font size="2" face="sans-serif">> +        c8 = c8 | c8 << 8ULL | c8 << 16ULL | c8 << 24ULL | c8 << 32ULL<br>
</font><font size="2" face="sans-serif">> +            | c8 << 40ULL | c8 << 48ULL | c8 << 56ULL;<br>
</font><font size="2" face="sans-serif">> +        while (size > 8) {<br>
</font><font size="2" face="sans-serif">> +            *d64++ = c8;<br>
</font><font size="2" face="sans-serif">> +            size = size - 8;<br>
</font><font size="2" face="sans-serif">> +        }<br>
</font><font size="2" face="sans-serif">> +    }<br>
</font><font size="2" face="sans-serif">> +<br>
</font><font size="2" face="sans-serif">> +    d = (unsigned char *)d64;<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">>    while (size-- > 0) {<br>
</font><font size="2" face="sans-serif">>        *d++ = (unsigned char)c;<br>
</font><font size="2" face="sans-serif">> diff --git a/libc/test/run-memops-test.c b/libc/test/run-memops-test.c<br>
</font><font size="2" face="sans-serif">> index 0979994..6ec5a27 100644<br>
</font><font size="2" face="sans-serif">> --- a/libc/test/run-memops-test.c<br>
</font><font size="2" face="sans-serif">> +++ b/libc/test/run-memops-test.c<br>
</font><font size="2" face="sans-serif">> @@ -41,3 +41,19 @@<br>
</font><font size="2" face="sans-serif">> #include "../string/strncpy.c"<br>
</font><font size="2" face="sans-serif">> #include "../string/strstr.c"<br>
</font><font size="2" face="sans-serif">> #include "../string/strtok.c"<br>
</font><font size="2" face="sans-serif">> +<br>
</font><font size="2" face="sans-serif">> +char buf[100];<br>
</font><font size="2" face="sans-serif">> +<br>
</font><font size="2" face="sans-serif">> +int test_memset(void);<br>
</font><font size="2" face="sans-serif">> +<br>
</font><font size="2" face="sans-serif">> +int test_memset(void)<br>
</font><font size="2" face="sans-serif">> +{<br>
</font><font size="2" face="sans-serif">> +    int i;<br>
</font><font size="2" face="sans-serif">> +    int r= 0;<br>
</font><font size="2" face="sans-serif">> +<br>
</font><font size="2" face="sans-serif">> +    memset(buf, 0x42, sizeof(buf));<br>
</font><font size="2" face="sans-serif">> +    for(i=0; i<sizeof(buf); i++)<br>
</font><font size="2" face="sans-serif">> +        if (buf[i] != 0x42)<br>
</font><font size="2" face="sans-serif">> +            r = -1;<br>
</font><font size="2" face="sans-serif">> +    return r;<br>
</font><font size="2" face="sans-serif">> +}<br>
</font><font size="2" face="sans-serif">> diff --git a/libc/test/run-memops.c b/libc/test/run-memops.c<br>
</font><font size="2" face="sans-serif">> index 15ec9bd..7158b6b 100644<br>
</font><font size="2" face="sans-serif">> --- a/libc/test/run-memops.c<br>
</font><font size="2" face="sans-serif">> +++ b/libc/test/run-memops.c<br>
</font><font size="2" face="sans-serif">> @@ -21,7 +21,10 @@<br>
</font><font size="2" face="sans-serif">> #include <string.h><br>
</font><font size="2" face="sans-serif">> #include <stdio.h><br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> +int test_memset(void);<br>
</font><font size="2" face="sans-serif">> +<br>
</font><font size="2" face="sans-serif">> int main(void)<br>
</font><font size="2" face="sans-serif">> {<br>
</font><font size="2" face="sans-serif">> +    assert(test_memset() == 0);<br>
</font><font size="2" face="sans-serif">>    return 0;<br>
</font><font size="2" face="sans-serif">> }<br>
</font><font size="2" face="sans-serif">> -- <br>
</font><font size="2" face="sans-serif">> 1.7.10.4<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> _______________________________________________<br>
</font><font size="2" face="sans-serif">> Skiboot mailing list<br>
</font><font size="2" face="sans-serif">> Skiboot@lists.ozlabs.org<br>
</font><font size="2" face="sans-serif">> <a href="https://lists.ozlabs.org/listinfo/skiboot">https://lists.ozlabs.org/listinfo/skiboot</a><br>
</font></body></html>