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 Parkvoid *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