void *memset(void *optr, int ival, unsigned long size) { unsigned long val = ival; void *ptr = optr; if (__builtin_expect (size == 0, 0)) return optr; if (__builtin_expect (val != 0, 0)) { val = val & 0xff; val |= val << 8; val |= val << 16; val |= val << 32; } if (__builtin_expect ((unsigned long)ptr & 1, 0)) { *(char *)ptr = val; ptr += 1; size -= 1; } if (__builtin_expect ((unsigned long)ptr & 2, 0)) { if (size < 2) goto tail_1; *(short *)ptr = val; ptr += 2; size -= 2; } if (__builtin_expect ((unsigned long)ptr & 4, 0)) { if (size < 4) goto tail_3; *(int *)ptr = val; ptr += 4; size -= 4; } while (size >= 8) { *(long *)ptr = val; ptr += 8; size -= 8; } if (size >= 4) { *(int *)ptr = val; ptr += 4; size -= 4; } tail_3: if (size >= 2) { *(short *)ptr = val; ptr += 2; size -= 2; } tail_1: if (size > 0) { *(char *)ptr = val; ptr += 1; size -= 1; } return optr; }