Greg Ungerer | d10ed2f | 2011-03-28 16:48:00 +1000 | [diff] [blame] | 1 | /* |
| 2 | * This file is subject to the terms and conditions of the GNU General Public |
| 3 | * License. See the file COPYING in the main directory of this archive |
| 4 | * for more details. |
| 5 | */ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | |
Greg Ungerer | d10ed2f | 2011-03-28 16:48:00 +1000 | [diff] [blame] | 7 | #include <linux/module.h> |
| 8 | #include <linux/string.h> |
| 9 | |
| 10 | void *memset(void *s, int c, size_t count) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 | { |
Greg Ungerer | d10ed2f | 2011-03-28 16:48:00 +1000 | [diff] [blame] | 12 | void *xs = s; |
| 13 | size_t temp; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 14 | |
Greg Ungerer | d10ed2f | 2011-03-28 16:48:00 +1000 | [diff] [blame] | 15 | if (!count) |
| 16 | return xs; |
| 17 | c &= 0xff; |
| 18 | c |= c << 8; |
| 19 | c |= c << 16; |
| 20 | if ((long)s & 1) { |
| 21 | char *cs = s; |
| 22 | *cs++ = c; |
| 23 | s = cs; |
| 24 | count--; |
| 25 | } |
| 26 | if (count > 2 && (long)s & 2) { |
| 27 | short *ss = s; |
| 28 | *ss++ = c; |
| 29 | s = ss; |
| 30 | count -= 2; |
| 31 | } |
| 32 | temp = count >> 2; |
| 33 | if (temp) { |
| 34 | long *ls = s; |
Greg Ungerer | 734c3ce | 2011-06-02 16:07:33 +1000 | [diff] [blame] | 35 | #if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE) |
| 36 | for (; temp; temp--) |
| 37 | *ls++ = c; |
| 38 | #else |
Greg Ungerer | d10ed2f | 2011-03-28 16:48:00 +1000 | [diff] [blame] | 39 | size_t temp1; |
| 40 | asm volatile ( |
| 41 | " movel %1,%2\n" |
| 42 | " andw #7,%2\n" |
| 43 | " lsrl #3,%1\n" |
| 44 | " negw %2\n" |
| 45 | " jmp %%pc@(2f,%2:w:2)\n" |
| 46 | "1: movel %3,%0@+\n" |
| 47 | " movel %3,%0@+\n" |
| 48 | " movel %3,%0@+\n" |
| 49 | " movel %3,%0@+\n" |
| 50 | " movel %3,%0@+\n" |
| 51 | " movel %3,%0@+\n" |
| 52 | " movel %3,%0@+\n" |
| 53 | " movel %3,%0@+\n" |
| 54 | "2: dbra %1,1b\n" |
| 55 | " clrw %1\n" |
| 56 | " subql #1,%1\n" |
| 57 | " jpl 1b" |
| 58 | : "=a" (ls), "=d" (temp), "=&d" (temp1) |
| 59 | : "d" (c), "0" (ls), "1" (temp)); |
Greg Ungerer | d10ed2f | 2011-03-28 16:48:00 +1000 | [diff] [blame] | 60 | #endif |
| 61 | s = ls; |
| 62 | } |
| 63 | if (count & 2) { |
| 64 | short *ss = s; |
| 65 | *ss++ = c; |
| 66 | s = ss; |
| 67 | } |
| 68 | if (count & 1) { |
| 69 | char *cs = s; |
| 70 | *cs = c; |
| 71 | } |
| 72 | return xs; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 | } |
Greg Ungerer | d10ed2f | 2011-03-28 16:48:00 +1000 | [diff] [blame] | 74 | EXPORT_SYMBOL(memset); |