Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4973 | right-hear | 1 | /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ |
2 | #include |
||
3 | .file "memset.s" |
||
4 | .text |
||
5 | .align 4 |
||
6 | MK_C_SYM(memset) |
||
7 | pushl %ebp |
||
8 | movl %esp,%ebp |
||
9 | pushl %edi |
||
10 | movl 8(%ebp),%edi |
||
11 | movl 12(%ebp),%eax |
||
12 | movl 16(%ebp),%ecx |
||
13 | cld |
||
14 | |||
15 | # We will handle memsets of <= 15 bytes one byte at a time. |
||
16 | # This avoids some extra overhead for small memsets, and |
||
17 | # knowing we are setting > 15 bytes eliminates some annoying |
||
18 | # checks in the "long move" case. |
||
19 | cmpl $15,%ecx |
||
20 | jle L3 |
||
21 | |||
22 | # Otherwise, tile the byte value out into %eax. |
||
23 | # 0x41 -> 0x41414141, etc. |
||
24 | movb %al,%ah |
||
25 | movl %eax,%edx |
||
26 | sall $16,%eax |
||
27 | movw %dx,%ax |
||
28 | jmp L2 |
||
29 | |||
30 | # Handle any cruft necessary to get %edi long-aligned. |
||
31 | L1: stosb |
||
32 | decl %ecx |
||
33 | L2: testl $3,%edi |
||
34 | jnz L1 |
||
35 | |||
36 | # Now slam out all of the longs. |
||
37 | movl %ecx,%edx |
||
38 | shrl $2,%ecx |
||
39 | rep |
||
40 | stosl |
||
41 | |||
42 | # Finally, handle any trailing cruft. We know the high three bytes |
||
43 | # of %ecx must be zero, so just put the "slop count" in the low byte. |
||
44 | movb %dl,%cl |
||
45 | andb $3,%cl |
||
46 | L3: rep |
||
47 | stosb |
||
48 | popl %edi |
||
49 | movl 8(%ebp),%eax |
||
50 | leave |
||
51 | ret=> |