summaryrefslogtreecommitdiff
path: root/arch/m68k/lib/memset.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-05-24 11:50:27 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2011-05-24 11:50:27 -0700
commit9f22aae04631ec90eeab804b024de3c658dae406 (patch)
treea96393e19eff70ef7d5c50496abfea335301a44c /arch/m68k/lib/memset.c
parent988c7f2d6d5622c2407bcad49c0349fbad6489a7 (diff)
parent531d2895917566ab0d82faa0696d0576569f1053 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu: (22 commits) m68knommu: Use generic show_interrupts() coldfire_qspi compile fix m68k: merge the mmu and non-mmu versions of sys_m68k.c m68knommu: use asm-generic/bitops/ext2-atomic.h m68knommu: Remove obsolete #include <linux/sys.h> m68k: merge mmu and non-mmu versions of asm-offsets.c m68k: merge non-mmu and mmu versions of m68k_ksyms.c m68knommu: remove un-needed exporting of COLDFIRE symbols m68knommu: move EXPORT of kernel_thread to function definition m68knommu: move EXPORT of local checksumming functions to definitions m68knommu: move EXPORT of dump_fpu to function definition m68knommu: clean up mm/init_no.c m68k: merge the mmu and non-mmu mm/Makefile m68k: mv kmap_mm.c to kmap.c m68knommu: remove stubs for __ioremap() and iounmap() m68knommu: remove unused kernel_set_cachemode() m68k: let Makefile sort out compiling mmu and non-mmu lib/checksum.c m68k: remove duplicate memcpy() implementation m68k: remove duplicate memset() implementation m68k: remove duplicate memmove() implementation ...
Diffstat (limited to 'arch/m68k/lib/memset.c')
-rw-r--r--arch/m68k/lib/memset.c114
1 files changed, 71 insertions, 43 deletions
diff --git a/arch/m68k/lib/memset.c b/arch/m68k/lib/memset.c
index 1389bf455633..f649e6a2e644 100644
--- a/arch/m68k/lib/memset.c
+++ b/arch/m68k/lib/memset.c
@@ -1,47 +1,75 @@
-#include <linux/types.h>
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of this archive
+ * for more details.
+ */
-void * memset(void * s, int c, size_t count)
+#include <linux/module.h>
+#include <linux/string.h>
+
+void *memset(void *s, int c, size_t count)
{
- void *xs = s;
- size_t temp;
+ void *xs = s;
+ size_t temp;
- if (!count)
- return xs;
- c &= 0xff;
- c |= c << 8;
- c |= c << 16;
- if ((long) s & 1)
- {
- char *cs = s;
- *cs++ = c;
- s = cs;
- count--;
- }
- if (count > 2 && (long) s & 2)
- {
- short *ss = s;
- *ss++ = c;
- s = ss;
- count -= 2;
- }
- temp = count >> 2;
- if (temp)
- {
- long *ls = s;
- for (; temp; temp--)
- *ls++ = c;
- s = ls;
- }
- if (count & 2)
- {
- short *ss = s;
- *ss++ = c;
- s = ss;
- }
- if (count & 1)
- {
- char *cs = s;
- *cs = c;
- }
- return xs;
+ if (!count)
+ return xs;
+ c &= 0xff;
+ c |= c << 8;
+ c |= c << 16;
+ if ((long)s & 1) {
+ char *cs = s;
+ *cs++ = c;
+ s = cs;
+ count--;
+ }
+ if (count > 2 && (long)s & 2) {
+ short *ss = s;
+ *ss++ = c;
+ s = ss;
+ count -= 2;
+ }
+ temp = count >> 2;
+ if (temp) {
+ long *ls = s;
+#if defined(__mc68020__) || defined(__mc68030__) || \
+ defined(__mc68040__) || defined(__mc68060__) || defined(__mcpu32__)
+ size_t temp1;
+ asm volatile (
+ " movel %1,%2\n"
+ " andw #7,%2\n"
+ " lsrl #3,%1\n"
+ " negw %2\n"
+ " jmp %%pc@(2f,%2:w:2)\n"
+ "1: movel %3,%0@+\n"
+ " movel %3,%0@+\n"
+ " movel %3,%0@+\n"
+ " movel %3,%0@+\n"
+ " movel %3,%0@+\n"
+ " movel %3,%0@+\n"
+ " movel %3,%0@+\n"
+ " movel %3,%0@+\n"
+ "2: dbra %1,1b\n"
+ " clrw %1\n"
+ " subql #1,%1\n"
+ " jpl 1b"
+ : "=a" (ls), "=d" (temp), "=&d" (temp1)
+ : "d" (c), "0" (ls), "1" (temp));
+#else
+ for (; temp; temp--)
+ *ls++ = c;
+#endif
+ s = ls;
+ }
+ if (count & 2) {
+ short *ss = s;
+ *ss++ = c;
+ s = ss;
+ }
+ if (count & 1) {
+ char *cs = s;
+ *cs = c;
+ }
+ return xs;
}
+EXPORT_SYMBOL(memset);