Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static inline void *memsetq(void *ptr, ullong uval, size_t qwords)
- {
- size_t n;
- ullong *uptr = (ullong *)ptr;
- for (n = 0; n < qwords; n++) {
- *(uptr + n) = uval;
- }
- return ptr;
- }
- void *memset(void *ptr, int val, size_t bytes)
- {
- uchar *uptr = (uchar *)ptr;
- const size_t qwords = bytes/QWORD_SIZE;
- // get rid of everything after the first byte
- val = val & 0xFF;
- // deal with bytes before start of the first qword
- while (((ullong)uptr % QWORD_ALIGN) > 0 && bytes--) {
- *uptr++ = (uchar)val;
- }
- // move qword by qword
- if (qwords) {
- const ullong uval = ((ullong)val << 56) | ((ullong)val << 48)
- | ((ullong)val << 40) | ((ullong)val << 32)
- | ((ullong)val << 24) | ((ullong)val << 16)
- | ((ullong)val << 8) | ((ullong)val);
- memsetq(uptr, uval, qwords);
- uptr += qwords * QWORD_SIZE;
- bytes %= QWORD_SIZE;
- }
- // deal with what's left
- while (bytes--) {
- *uptr++ = (uchar)val;
- }
- return ptr;
- }
- //
- // Set "bytes"-many bytes starting from ptr to 0
- //
- void *memzero(void *ptr, size_t bytes)
- {
- return memset(ptr, 0, bytes);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement