1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- /*
- * Simple string operations using longword operations.
- * The ones in newlib-nano are bytewise...
- */
- #include "fw.h"
- void * __hot memset(void *s, int c, size_t n)
- {
- xptr_t q;
- uint32_t cc;
- if (unlikely(!n))
- return s;
- cc = (uint8_t)c;
- cc = cc | (cc << 16);
- cc = cc | (cc << 8);
- q.b = s;
- if (unlikely(q.a & 1)) {
- *q.b++ = cc;
- n--;
- }
- if (likely(n >= 2)) {
- if (unlikely(q.a & 2)) {
- *q.w++ = cc;
- n -= 2;
- }
- while (n >= 4*8) {
- q.l[0] = cc;
- q.l[1] = cc;
- q.l[2] = cc;
- q.l[3] = cc;
- q.l[4] = cc;
- q.l[5] = cc;
- q.l[6] = cc;
- q.l[7] = cc;
- q.l += 8;
- n -= 32;
- }
- while (n >= 4) {
- *q.l++ = cc;
- n -= 4;
- }
- if (unlikely(n & 2))
- *q.w++ = c;
- }
- if (unlikely(n & 1))
- *q.b++ = c;
- return s;
- }
|