linux/arch/parisc/lib/memset.c
<<
>>
Prefs
   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)
  25typedef unsigned long op_t;
  26
  27void *
  28memset (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