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 |