OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libc/] [string/] [memset.c] - Blame information for rev 57

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 39 lampret
/*
2
FUNCTION
3
        <<memset>>---set an area of memory
4
 
5
INDEX
6
        memset
7
 
8
ANSI_SYNOPSIS
9
        #include <string.h>
10
        void *memset(const void *<[dst]>, int <[c]>, size_t <[length]>);
11
 
12
TRAD_SYNOPSIS
13
        #include <string.h>
14
        void *memset(<[dst]>, <[c]>, <[length]>)
15
        void *<[dst]>;
16
        int <[c]>;
17
        size_t <[length]>;
18
 
19
DESCRIPTION
20
        This function converts the argument <[c]> into an unsigned
21
        char and fills the first <[length]> characters of the array
22
        pointed to by <[dst]> to the value.
23
 
24
RETURNS
25
        <<memset>> returns the value of <[m]>.
26
 
27
PORTABILITY
28
<<memset>> is ANSI C.
29
 
30
    <<memset>> requires no supporting OS subroutines.
31
 
32
QUICKREF
33
        memset ansi pure
34
*/
35
 
36
#include <string.h>
37
 
38
#define LBLOCKSIZE (sizeof(long))
39
#define UNALIGNED(X)   ((long)X & (LBLOCKSIZE - 1))
40
#define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE)
41
 
42
_PTR
43
_DEFUN (memset, (m, c, n),
44
        _PTR m _AND
45
        int c _AND
46
        size_t n)
47
{
48 56 joel
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
49 39 lampret
  char *s = (char *) m;
50
 
51
  while (n-- != 0)
52
    {
53
      *s++ = (char) c;
54
    }
55
 
56
  return m;
57
#else
58
  char *s = (char *) m;
59
  int count, i;
60
  unsigned long buffer;
61
  unsigned long *aligned_addr;
62
  unsigned char *unaligned_addr;
63
 
64 56 joel
  if (!TOO_SMALL (n) && !UNALIGNED (m))
65 39 lampret
    {
66 56 joel
      /* If we get this far, we know that n is large and m is word-aligned. */
67
 
68
      aligned_addr = (unsigned long*)m;
69
 
70
      /* Store C into each char sized location in BUFFER so that
71
         we can set large blocks quickly.  */
72
      c &= 0xff;
73
      if (LBLOCKSIZE == 4)
74 39 lampret
        {
75 56 joel
          buffer = (c << 8) | c;
76
          buffer |= (buffer << 16);
77 39 lampret
        }
78 56 joel
      else
79
        {
80
          buffer = 0;
81
          for (i = 0; i < LBLOCKSIZE; i++)
82
            buffer = (buffer << 8) | c;
83
        }
84 39 lampret
 
85 56 joel
      while (n >= LBLOCKSIZE*4)
86
        {
87
          *aligned_addr++ = buffer;
88
          *aligned_addr++ = buffer;
89
          *aligned_addr++ = buffer;
90
          *aligned_addr++ = buffer;
91
          n -= 4*LBLOCKSIZE;
92
        }
93 39 lampret
 
94 56 joel
      while (n >= LBLOCKSIZE)
95
        {
96
          *aligned_addr++ = buffer;
97
          n -= LBLOCKSIZE;
98
        }
99
      /* Pick up the remainder with a bytewise loop.  */
100
      s = (char*)aligned_addr;
101 39 lampret
    }
102
 
103 56 joel
  while (n--)
104 39 lampret
    {
105 56 joel
      *s++ = (char)c;
106 39 lampret
    }
107
 
108
  return m;
109
#endif /* not PREFER_SIZE_OVER_SPEED */
110
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.