libc/string/memset.c: Use unsigned long for stores

While most 64-bit architectures have an assembly implementation of this
file, RISC-V does not. As we now store 8 bytes instead of 4 it should speed
up RISC-V.

Reviewed By:	kib
MFC after:	1 week
Differential Revision: https://reviews.freebsd.org/D29536
This commit is contained in:
Alex Richardson 2021-04-20 00:19:20 +01:00
parent 0b4ad01d91
commit ab147542b7

View File

@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$");
#include <limits.h> #include <limits.h>
#define wsize sizeof(u_int) #define wsize sizeof(u_long)
#define wmask (wsize - 1) #define wmask (wsize - 1)
#ifdef BZERO #ifdef BZERO
@ -67,7 +67,7 @@ memset(void *dst0, int c0, size_t length)
{ {
size_t t; size_t t;
#ifndef BZERO #ifndef BZERO
u_int c; u_long c;
#endif #endif
u_char *dst; u_char *dst;
@ -84,6 +84,9 @@ memset(void *dst0, int c0, size_t length)
* *
* but we use a minimum of 3 here since the overhead of the code * but we use a minimum of 3 here since the overhead of the code
* to do word writes is substantial. * to do word writes is substantial.
*
* TODO: This threshold might not be sensible for 64-bit u_long.
* We should benchmark and revisit this decision.
*/ */
if (length < 3 * wsize) { if (length < 3 * wsize) {
while (length != 0) { while (length != 0) {
@ -95,12 +98,12 @@ memset(void *dst0, int c0, size_t length)
#ifndef BZERO #ifndef BZERO
if ((c = (u_char)c0) != 0) { /* Fill the word. */ if ((c = (u_char)c0) != 0) { /* Fill the word. */
c = (c << 8) | c; /* u_int is 16 bits. */ c = (c << 8) | c; /* u_long is 16 bits. */
#if UINT_MAX > 0xffff #if ULONG_MAX > 0xffff
c = (c << 16) | c; /* u_int is 32 bits. */ c = (c << 16) | c; /* u_long is 32 bits. */
#endif #endif
#if UINT_MAX > 0xffffffff #if ULONG_MAX > 0xffffffff
c = (c << 32) | c; /* u_int is 64 bits. */ c = (c << 32) | c; /* u_long is 64 bits. */
#endif #endif
} }
#endif #endif
@ -116,7 +119,7 @@ memset(void *dst0, int c0, size_t length)
/* Fill words. Length was >= 2*words so we know t >= 1 here. */ /* Fill words. Length was >= 2*words so we know t >= 1 here. */
t = length / wsize; t = length / wsize;
do { do {
*(u_int *)dst = WIDEVAL; *(u_long *)(void *)dst = WIDEVAL;
dst += wsize; dst += wsize;
} while (--t != 0); } while (--t != 0);