diff options
author | Richard Henderson <rth@twiddle.net> | 2011-04-06 16:02:23 -0700 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2011-04-10 10:25:15 -0700 |
commit | 0ea286dc681fe3690fc4bb8007144190e03b8d51 (patch) | |
tree | 8f6462f8d6e270a7766e05392b7bee05caf0c28b /memset.c | |
parent | e00c70db6ec09b5015ba5602a781d282134d3fcd (diff) | |
download | qemu-palcode-0ea286dc681fe3690fc4bb8007144190e03b8d51.zip qemu-palcode-0ea286dc681fe3690fc4bb8007144190e03b8d51.tar.gz qemu-palcode-0ea286dc681fe3690fc4bb8007144190e03b8d51.tar.bz2 |
TEMP: finished through init_page_tables
Diffstat (limited to 'memset.c')
-rw-r--r-- | memset.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/memset.c b/memset.c new file mode 100644 index 0000000..5f93dc3 --- /dev/null +++ b/memset.c @@ -0,0 +1,73 @@ +void *memset(void *optr, int ival, unsigned long size) +{ + unsigned long val = ival; + void *ptr = optr; + + if (__builtin_expect (size == 0, 0)) + return; + + 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; +} |