| Index: fusl/src/string/i386/memset.s
|
| diff --git a/fusl/src/string/i386/memset.s b/fusl/src/string/i386/memset.s
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d00422c4ac15d90f133fabdc79d231702c228f6f
|
| --- /dev/null
|
| +++ b/fusl/src/string/i386/memset.s
|
| @@ -0,0 +1,76 @@
|
| +.global memset
|
| +.type memset,@function
|
| +memset:
|
| + mov 12(%esp),%ecx
|
| + cmp $62,%ecx
|
| + ja 2f
|
| +
|
| + mov 8(%esp),%dl
|
| + mov 4(%esp),%eax
|
| + test %ecx,%ecx
|
| + jz 1f
|
| +
|
| + mov %dl,%dh
|
| +
|
| + mov %dl,(%eax)
|
| + mov %dl,-1(%eax,%ecx)
|
| + cmp $2,%ecx
|
| + jbe 1f
|
| +
|
| + mov %dx,1(%eax)
|
| + mov %dx,(-1-2)(%eax,%ecx)
|
| + cmp $6,%ecx
|
| + jbe 1f
|
| +
|
| + shl $16,%edx
|
| + mov 8(%esp),%dl
|
| + mov 8(%esp),%dh
|
| +
|
| + mov %edx,(1+2)(%eax)
|
| + mov %edx,(-1-2-4)(%eax,%ecx)
|
| + cmp $14,%ecx
|
| + jbe 1f
|
| +
|
| + mov %edx,(1+2+4)(%eax)
|
| + mov %edx,(1+2+4+4)(%eax)
|
| + mov %edx,(-1-2-4-8)(%eax,%ecx)
|
| + mov %edx,(-1-2-4-4)(%eax,%ecx)
|
| + cmp $30,%ecx
|
| + jbe 1f
|
| +
|
| + mov %edx,(1+2+4+8)(%eax)
|
| + mov %edx,(1+2+4+8+4)(%eax)
|
| + mov %edx,(1+2+4+8+8)(%eax)
|
| + mov %edx,(1+2+4+8+12)(%eax)
|
| + mov %edx,(-1-2-4-8-16)(%eax,%ecx)
|
| + mov %edx,(-1-2-4-8-12)(%eax,%ecx)
|
| + mov %edx,(-1-2-4-8-8)(%eax,%ecx)
|
| + mov %edx,(-1-2-4-8-4)(%eax,%ecx)
|
| +
|
| +1: ret
|
| +
|
| +2: movzbl 8(%esp),%eax
|
| + mov %edi,12(%esp)
|
| + imul $0x1010101,%eax
|
| + mov 4(%esp),%edi
|
| + test $15,%edi
|
| + mov %eax,-4(%edi,%ecx)
|
| + jnz 2f
|
| +
|
| +1: shr $2, %ecx
|
| + rep
|
| + stosl
|
| + mov 4(%esp),%eax
|
| + mov 12(%esp),%edi
|
| + ret
|
| +
|
| +2: xor %edx,%edx
|
| + sub %edi,%edx
|
| + and $15,%edx
|
| + mov %eax,(%edi)
|
| + mov %eax,4(%edi)
|
| + mov %eax,8(%edi)
|
| + mov %eax,12(%edi)
|
| + sub %edx,%ecx
|
| + add %edx,%edi
|
| + jmp 1b
|
|
|