X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Flibc%2Fstring_asm.s;h=a15a405adc1e00212cad14a7c1b9ba2355714310;hb=22dd4db1a4ff756f76bdd87062c2252fe3091228;hp=7bb6f40bebe20bc76ddeb1b6d4f1853ba13b71ea;hpb=5a961b914da78d534e8e2dc6bfb5103114dbff54;p=bootcensus diff --git a/src/libc/string_asm.s b/src/libc/string_asm.s index 7bb6f40..a15a405 100644 --- a/src/libc/string_asm.s +++ b/src/libc/string_asm.s @@ -22,6 +22,7 @@ memset: push %edi mov 8(%ebp), %edi + push %edi mov 12(%ebp), %al mov %al, %ah mov %ax, %cx @@ -32,25 +33,29 @@ memset: cmp $0, %ecx jz msdone + # write 1, 2, or 3 times until we reache a 32bit-aligned dest address mov %edi, %edx and $3, %edx + jz msmain jmp *mspre_tab(,%edx,4) mspre_tab: .long msmain, mspre1, mspre2, mspre3 -mspre1: stosb +mspre3: stosb dec %ecx mspre2: stosb dec %ecx -mspre3: stosb +mspre1: stosb dec %ecx jz msdone + # edi is 32bit-aligned here, write ecx>>2 32bit values msmain: push %ecx shr $2, %ecx rep stosl pop %ecx + # write any trailing bytes and $3, %ecx jmp *mspost_tab(,%ecx,4) @@ -60,6 +65,7 @@ mspost2:stosb mspost1:stosb msdone: + pop %eax pop %edi pop %ebp ret @@ -74,6 +80,7 @@ memset16: push %edi mov 8(%ebp), %edi + push %edi mov 12(%ebp), %ax shl $16, %eax mov 12(%ebp), %ax @@ -84,6 +91,7 @@ memset16: mov %edi, %edx and $3, %edx + jz ms16main jmp *ms16pre_tab(,%edx,4) ms16pre_tab: .long ms16main, ms16pre1, ms16pre2, ms16pre3 @@ -125,7 +133,7 @@ ms16main: jz ms16done stosw ms16done: - + pop %eax pop %edi pop %ebp ret @@ -145,27 +153,12 @@ memcpy: cmp $0, %ecx jz mcdone - mov %edi, %edx - and $3, %edx - jmp *mcpre_tab(,%edx,4) - -mcpre_tab: .long mcmain, mcpre1, mcpre2, mcpre3 -mcpre1: movsw - dec %ecx -mcpre2: movsw - dec %ecx -mcpre3: movsw - dec %ecx - jz mcdone - -mcmain: - push %ecx + mov %ecx, %edx shr $2, %ecx rep movsl - pop %ecx - and $3, %ecx - jmp *mcpost_tab(,%ecx,4) + and $3, %edx + jmp *mcpost_tab(,%edx,4) mcpost_tab: .long mcdone, mcpost1, mcpost2, mcpost3 mcpost3:movsb