1*e34cb67cStb/* $OpenBSD: strcpy.S,v 1.10 2017/11/28 06:55:49 tb Exp $ */ 2df930be7Sderaadt/* 3df930be7Sderaadt * Written by J.T. Conklin <jtc@netbsd.org>. 4df930be7Sderaadt * Public domain. 5df930be7Sderaadt */ 6df930be7Sderaadt 7df930be7Sderaadt#include <machine/asm.h> 8df930be7Sderaadt 9a177c125Sderaadt#if defined(APIWARN) 10a177c125Sderaadt#APP 1153e644ecSkettenis .section .gnu.warning.strcpy 12*e34cb67cStb .ascii "strcpy() is almost always misused, please use strlcpy()" 13a177c125Sderaadt#NO_APP 14a177c125Sderaadt#endif 15a177c125Sderaadt 16df930be7Sderaadt/* 17df930be7Sderaadt * NOTE: I've unrolled the loop eight times: large enough to make a 18df930be7Sderaadt * significant difference, and small enough not to totally trash the 19df930be7Sderaadt * cache. 20df930be7Sderaadt */ 21df930be7Sderaadt 22df930be7SderaadtENTRY(strcpy) 23df930be7Sderaadt movl 4(%esp),%ecx /* dst address */ 24df930be7Sderaadt movl 8(%esp),%edx /* src address */ 25df930be7Sderaadt pushl %ecx /* push dst address */ 26df930be7Sderaadt 27df930be7Sderaadt .align 2,0x90 28df930be7SderaadtL1: movb (%edx),%al /* unroll loop, but not too much */ 29df930be7Sderaadt movb %al,(%ecx) 30df930be7Sderaadt testb %al,%al 31df930be7Sderaadt jz L2 32df930be7Sderaadt movb 1(%edx),%al 33df930be7Sderaadt movb %al,1(%ecx) 34df930be7Sderaadt testb %al,%al 35df930be7Sderaadt jz L2 36df930be7Sderaadt movb 2(%edx),%al 37df930be7Sderaadt movb %al,2(%ecx) 38df930be7Sderaadt testb %al,%al 39df930be7Sderaadt jz L2 40df930be7Sderaadt movb 3(%edx),%al 41df930be7Sderaadt movb %al,3(%ecx) 42df930be7Sderaadt testb %al,%al 43df930be7Sderaadt jz L2 44df930be7Sderaadt movb 4(%edx),%al 45df930be7Sderaadt movb %al,4(%ecx) 46df930be7Sderaadt testb %al,%al 47df930be7Sderaadt jz L2 48df930be7Sderaadt movb 5(%edx),%al 49df930be7Sderaadt movb %al,5(%ecx) 50df930be7Sderaadt testb %al,%al 51df930be7Sderaadt jz L2 52df930be7Sderaadt movb 6(%edx),%al 53df930be7Sderaadt movb %al,6(%ecx) 54df930be7Sderaadt testb %al,%al 55df930be7Sderaadt jz L2 56df930be7Sderaadt movb 7(%edx),%al 57df930be7Sderaadt movb %al,7(%ecx) 58df930be7Sderaadt addl $8,%edx 59df930be7Sderaadt addl $8,%ecx 60df930be7Sderaadt testb %al,%al 61df930be7Sderaadt jnz L1 62df930be7SderaadtL2: popl %eax /* pop dst address */ 63df930be7Sderaadt ret 649b9d2a55SguentherEND(strcpy) 65