1*ea6088e7Sguenther/* $OpenBSD: memset.S,v 1.6 2017/11/29 05:13:57 guenther Exp $ */ 2df930be7Sderaadt/* 3df930be7Sderaadt * Written by J.T. Conklin <jtc@netbsd.org>. 4df930be7Sderaadt * Public domain. 5df930be7Sderaadt */ 6df930be7Sderaadt 7*ea6088e7Sguenther#include "DEFS.h" 8df930be7Sderaadt 9df930be7SderaadtENTRY(memset) 10df930be7Sderaadt pushl %edi 11df930be7Sderaadt pushl %ebx 12df930be7Sderaadt movl 12(%esp),%edi 13df930be7Sderaadt movzbl 16(%esp),%eax /* unsigned char, zero extend */ 14df930be7Sderaadt movl 20(%esp),%ecx 15df930be7Sderaadt pushl %edi /* push address of buffer */ 16df930be7Sderaadt 17df930be7Sderaadt cld /* set fill direction forward */ 18df930be7Sderaadt 19df930be7Sderaadt /* 20df930be7Sderaadt * if the string is too short, it's really not worth the overhead 21f70d55c3Skrw * of aligning to word boundaries, etc. So we jump to a plain 22df930be7Sderaadt * unaligned set. 23df930be7Sderaadt */ 24df930be7Sderaadt cmpl $0x0f,%ecx 25df930be7Sderaadt jle L1 26df930be7Sderaadt 27df930be7Sderaadt movb %al,%ah /* copy char to all bytes in word */ 28df930be7Sderaadt movl %eax,%edx 29df930be7Sderaadt sall $16,%eax 30df930be7Sderaadt orl %edx,%eax 31df930be7Sderaadt 32df930be7Sderaadt movl %edi,%edx /* compute misalignment */ 33df930be7Sderaadt negl %edx 34df930be7Sderaadt andl $3,%edx 35df930be7Sderaadt movl %ecx,%ebx 36df930be7Sderaadt subl %edx,%ebx 37df930be7Sderaadt 38df930be7Sderaadt movl %edx,%ecx /* set until word aligned */ 39df930be7Sderaadt rep 40df930be7Sderaadt stosb 41df930be7Sderaadt 42df930be7Sderaadt movl %ebx,%ecx 43df930be7Sderaadt shrl $2,%ecx /* set by words */ 44df930be7Sderaadt rep 45df930be7Sderaadt stosl 46df930be7Sderaadt 47df930be7Sderaadt movl %ebx,%ecx /* set remainder by bytes */ 48df930be7Sderaadt andl $3,%ecx 49df930be7SderaadtL1: rep 50df930be7Sderaadt stosb 51df930be7Sderaadt 52df930be7Sderaadt popl %eax /* pop address of buffer */ 53df930be7Sderaadt popl %ebx 54df930be7Sderaadt popl %edi 55df930be7Sderaadt ret 56*ea6088e7SguentherEND_BUILTIN(memset) 57