diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-01-21 22:43:02 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-01-21 22:43:02 +0000 |
commit | 0310f16005a1e98c441221bc0f0f7586d0b19763 (patch) | |
tree | c695e2baa4da1bc7fb9381568863e903020335e3 /firmware/common/memset.c | |
parent | 948f0b849785b3e727be6584470d1bb32238ec6a (diff) | |
download | rockbox-0310f16005a1e98c441221bc0f0f7586d0b19763.tar.gz rockbox-0310f16005a1e98c441221bc0f0f7586d0b19763.zip |
Revived C implementations of memcpy() and memset() for platforms without asm optimized versions (gmini), replacing the intermediate strings.c. Moved the asm optimized versions 'out of the way' for the implicit 'make' rules by renaming them to *_a.S (for assembler/alternative).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5628 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/common/memset.c')
-rw-r--r-- | firmware/common/memset.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/firmware/common/memset.c b/firmware/common/memset.c new file mode 100644 index 0000000000..c370191cda --- /dev/null +++ b/firmware/common/memset.c | |||
@@ -0,0 +1,109 @@ | |||
1 | /* | ||
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 | #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) | ||
49 | 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 | unsigned int i; | ||
60 | unsigned long buffer; | ||
61 | unsigned long *aligned_addr; | ||
62 | |||
63 | if (!TOO_SMALL (n) && !UNALIGNED (m)) | ||
64 | { | ||
65 | /* If we get this far, we know that n is large and m is word-aligned. */ | ||
66 | |||
67 | aligned_addr = (unsigned long*)m; | ||
68 | |||
69 | /* Store C into each char sized location in BUFFER so that | ||
70 | we can set large blocks quickly. */ | ||
71 | c &= 0xff; | ||
72 | if (LBLOCKSIZE == 4) | ||
73 | { | ||
74 | buffer = (c << 8) | c; | ||
75 | buffer |= (buffer << 16); | ||
76 | } | ||
77 | else | ||
78 | { | ||
79 | buffer = 0; | ||
80 | for (i = 0; i < LBLOCKSIZE; i++) | ||
81 | buffer = (buffer << 8) | c; | ||
82 | } | ||
83 | |||
84 | while (n >= LBLOCKSIZE*4) | ||
85 | { | ||
86 | *aligned_addr++ = buffer; | ||
87 | *aligned_addr++ = buffer; | ||
88 | *aligned_addr++ = buffer; | ||
89 | *aligned_addr++ = buffer; | ||
90 | n -= 4*LBLOCKSIZE; | ||
91 | } | ||
92 | |||
93 | while (n >= LBLOCKSIZE) | ||
94 | { | ||
95 | *aligned_addr++ = buffer; | ||
96 | n -= LBLOCKSIZE; | ||
97 | } | ||
98 | /* Pick up the remainder with a bytewise loop. */ | ||
99 | s = (char*)aligned_addr; | ||
100 | } | ||
101 | |||
102 | while (n--) | ||
103 | { | ||
104 | *s++ = (char)c; | ||
105 | } | ||
106 | |||
107 | return m; | ||
108 | #endif /* not PREFER_SIZE_OVER_SPEED */ | ||
109 | } | ||