xref: /aosp_15_r20/external/arm-trusted-firmware/lib/libc/memset.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #include <stddef.h>
8*54fd6939SJiyong Park #include <string.h>
9*54fd6939SJiyong Park #include <stdint.h>
10*54fd6939SJiyong Park 
memset(void * dst,int val,size_t count)11*54fd6939SJiyong Park void *memset(void *dst, int val, size_t count)
12*54fd6939SJiyong Park {
13*54fd6939SJiyong Park 	uint8_t *ptr = dst;
14*54fd6939SJiyong Park 	uint64_t *ptr64;
15*54fd6939SJiyong Park 	uint64_t fill = (unsigned char)val;
16*54fd6939SJiyong Park 
17*54fd6939SJiyong Park 	/* Simplify code below by making sure we write at least one byte. */
18*54fd6939SJiyong Park 	if (count == 0U) {
19*54fd6939SJiyong Park 		return dst;
20*54fd6939SJiyong Park 	}
21*54fd6939SJiyong Park 
22*54fd6939SJiyong Park 	/* Handle the first part, until the pointer becomes 64-bit aligned. */
23*54fd6939SJiyong Park 	while (((uintptr_t)ptr & 7U) != 0U) {
24*54fd6939SJiyong Park 		*ptr = (uint8_t)val;
25*54fd6939SJiyong Park 		ptr++;
26*54fd6939SJiyong Park 		if (--count == 0U) {
27*54fd6939SJiyong Park 			return dst;
28*54fd6939SJiyong Park 		}
29*54fd6939SJiyong Park 	}
30*54fd6939SJiyong Park 
31*54fd6939SJiyong Park 	/* Duplicate the fill byte to the rest of the 64-bit word. */
32*54fd6939SJiyong Park 	fill |= fill << 8;
33*54fd6939SJiyong Park 	fill |= fill << 16;
34*54fd6939SJiyong Park 	fill |= fill << 32;
35*54fd6939SJiyong Park 
36*54fd6939SJiyong Park 	/* Use 64-bit writes for as long as possible. */
37*54fd6939SJiyong Park 	ptr64 = (uint64_t *)ptr;
38*54fd6939SJiyong Park 	for (; count >= 8U; count -= 8) {
39*54fd6939SJiyong Park 		*ptr64 = fill;
40*54fd6939SJiyong Park 		ptr64++;
41*54fd6939SJiyong Park 	}
42*54fd6939SJiyong Park 
43*54fd6939SJiyong Park 	/* Handle the remaining part byte-per-byte. */
44*54fd6939SJiyong Park 	ptr = (uint8_t *)ptr64;
45*54fd6939SJiyong Park 	while (count-- > 0U)  {
46*54fd6939SJiyong Park 		*ptr = (uint8_t)val;
47*54fd6939SJiyong Park 		ptr++;
48*54fd6939SJiyong Park 	}
49*54fd6939SJiyong Park 
50*54fd6939SJiyong Park 	return dst;
51*54fd6939SJiyong Park }
52