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:
parent
0b4ad01d91
commit
ab147542b7
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user