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