1 /* Copyright (C) 1991, 1997 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, write to the Free 16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17 02111-1307 USA. */ 18 19 /* Slight modifications for pa-risc linux - Paul Bame <bame@debian.org> */ 20 21 #include <linux/types.h> 22 #include <asm/string.h> 23 24 #define OPSIZ (BITS_PER_LONG/8) 25 typedef unsigned long op_t; 26 27 void * 28 memset (void *dstpp, int sc, size_t len) 29 { 30 unsigned int c = sc; 31 long int dstp = (long int) dstpp; 32 33 if (len >= 8) 34 { 35 size_t xlen; 36 op_t cccc; 37 38 cccc = (unsigned char) c; 39 cccc |= cccc << 8; 40 cccc |= cccc << 16; 41 if (OPSIZ > 4) 42 /* Do the shift in two steps to avoid warning if long has 32 bits. */ 43 cccc |= (cccc << 16) << 16; 44 45 /* There are at least some bytes to set. 46 No need to test for LEN == 0 in this alignment loop. */ 47 while (dstp % OPSIZ != 0) 48 { 49 ((unsigned char *) dstp)[0] = c; 50 dstp += 1; 51 len -= 1; 52 } 53 54 /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */ 55 xlen = len / (OPSIZ * 8); 56 while (xlen > 0) 57 { 58 ((op_t *) dstp)[0] = cccc; 59 ((op_t *) dstp)[1] = cccc; 60 ((op_t *) dstp)[2] = cccc; 61 ((op_t *) dstp)[3] = cccc; 62 ((op_t *) dstp)[4] = cccc; 63 ((op_t *) dstp)[5] = cccc; 64 ((op_t *) dstp)[6] = cccc; 65 ((op_t *) dstp)[7] = cccc; 66 dstp += 8 * OPSIZ; 67 xlen -= 1; 68 } 69 len %= OPSIZ * 8; 70 71 /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */ 72 xlen = len / OPSIZ; 73 while (xlen > 0) 74 { 75 ((op_t *) dstp)[0] = cccc; 76 dstp += OPSIZ; 77 xlen -= 1; 78 } 79 len %= OPSIZ; 80 } 81 82 /* Write the last few bytes. */ 83 while (len > 0) 84 { 85 ((unsigned char *) dstp)[0] = c; 86 dstp += 1; 87 len -= 1; 88 } 89 90 return dstpp; 91 } 92