root/lib/libkern/arch/i386/memset.S

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. memset

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

/* [<][>][^][v][top][bottom][index][help] */