1 /* Copyright (C) 1991-2022 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <https://www.gnu.org/licenses/>. */ 17 18 #include <string.h> 19 #include <memcopy.h> 20 21 #ifndef MEMSET 22 # define MEMSET memset 23 #endif 24 25 void * 26 inhibit_loop_to_libcall MEMSET(void * dstpp,int c,size_t len)27MEMSET (void *dstpp, int c, size_t len) 28 { 29 long int dstp = (long int) dstpp; 30 31 if (len >= 8) 32 { 33 size_t xlen; 34 op_t cccc; 35 36 cccc = (unsigned char) c; 37 cccc |= cccc << 8; 38 cccc |= cccc << 16; 39 if (OPSIZ > 4) 40 /* Do the shift in two steps to avoid warning if long has 32 bits. */ 41 cccc |= (cccc << 16) << 16; 42 43 /* There are at least some bytes to set. 44 No need to test for LEN == 0 in this alignment loop. */ 45 while (dstp % OPSIZ != 0) 46 { 47 ((byte *) dstp)[0] = c; 48 dstp += 1; 49 len -= 1; 50 } 51 52 /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */ 53 xlen = len / (OPSIZ * 8); 54 while (xlen > 0) 55 { 56 ((op_t *) dstp)[0] = cccc; 57 ((op_t *) dstp)[1] = cccc; 58 ((op_t *) dstp)[2] = cccc; 59 ((op_t *) dstp)[3] = cccc; 60 ((op_t *) dstp)[4] = cccc; 61 ((op_t *) dstp)[5] = cccc; 62 ((op_t *) dstp)[6] = cccc; 63 ((op_t *) dstp)[7] = cccc; 64 dstp += 8 * OPSIZ; 65 xlen -= 1; 66 } 67 len %= OPSIZ * 8; 68 69 /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */ 70 xlen = len / OPSIZ; 71 while (xlen > 0) 72 { 73 ((op_t *) dstp)[0] = cccc; 74 dstp += OPSIZ; 75 xlen -= 1; 76 } 77 len %= OPSIZ; 78 } 79 80 /* Write the last few bytes. */ 81 while (len > 0) 82 { 83 ((byte *) dstp)[0] = c; 84 dstp += 1; 85 len -= 1; 86 } 87 88 return dstpp; 89 } 90 libc_hidden_builtin_def (MEMSET) 91