Blame view

arch/m68k/lib/memset.c 1.29 KB
d10ed2f53   Greg Ungerer   m68k: remove dupl...
1
2
3
4
5
  /*
   * 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.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6

d10ed2f53   Greg Ungerer   m68k: remove dupl...
7
8
9
10
  #include <linux/module.h>
  #include <linux/string.h>
  
  void *memset(void *s, int c, size_t count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
  {
d10ed2f53   Greg Ungerer   m68k: remove dupl...
12
13
  	void *xs = s;
  	size_t temp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14

d10ed2f53   Greg Ungerer   m68k: remove dupl...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  	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;
734c3ce3b   Greg Ungerer   m68k: use kernel ...
35
36
37
38
  #if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)
  		for (; temp; temp--)
  			*ls++ = c;
  #else
d10ed2f53   Greg Ungerer   m68k: remove dupl...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  		size_t temp1;
  		asm volatile (
  			"	movel %1,%2
  "
  			"	andw  #7,%2
  "
  			"	lsrl  #3,%1
  "
  			"	negw  %2
  "
  			"	jmp   %%pc@(2f,%2:w:2)
  "
  			"1:	movel %3,%0@+
  "
  			"	movel %3,%0@+
  "
  			"	movel %3,%0@+
  "
  			"	movel %3,%0@+
  "
  			"	movel %3,%0@+
  "
  			"	movel %3,%0@+
  "
  			"	movel %3,%0@+
  "
  			"	movel %3,%0@+
  "
  			"2:	dbra  %1,1b
  "
  			"	clrw  %1
  "
  			"	subql #1,%1
  "
  			"	jpl   1b"
  			: "=a" (ls), "=d" (temp), "=&d" (temp1)
  			: "d" (c), "0" (ls), "1" (temp));
d10ed2f53   Greg Ungerer   m68k: remove dupl...
76
77
78
79
80
81
82
83
84
85
86
87
88
  #endif
  		s = ls;
  	}
  	if (count & 2) {
  		short *ss = s;
  		*ss++ = c;
  		s = ss;
  	}
  	if (count & 1) {
  		char *cs = s;
  		*cs = c;
  	}
  	return xs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
  }
d10ed2f53   Greg Ungerer   m68k: remove dupl...
90
  EXPORT_SYMBOL(memset);