memstr.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2005 Sergey Bondari
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * - Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer.
00011  * - Redistributions in binary form must reproduce the above copyright
00012  *   notice, this list of conditions and the following disclaimer in the
00013  *   documentation and/or other materials provided with the distribution.
00014  * - The name of the author may not be used to endorse or promote products
00015  *   derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00028 
00035 #ifndef __ia32_MEMSTR_H__
00036 #define __ia32_MEMSTR_H__
00037 
00050 static inline void * memcpy(void * dst, const void * src, size_t cnt)
00051 {
00052         __native d0, d1, d2;
00053 
00054         __asm__ __volatile__(
00055                 /* copy all full dwords */
00056                 "rep movsl\n\t"
00057                 /* load count again */
00058                 "movl %4, %%ecx\n\t"
00059                 /* ecx = ecx mod 4 */
00060                 "andl $3, %%ecx\n\t"
00061                 /* are there last <=3 bytes? */
00062                 "jz 1f\n\t"
00063                 /* copy last <=3 bytes */
00064                 "rep movsb\n\t"
00065                 /* exit from asm block */
00066                 "1:\n"
00067                 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
00068                 : "0" ((__native) (cnt / 4)), "g" ((__native) cnt), "1" ((__native) dst), "2" ((__native) src)
00069                 : "memory");
00070 
00071         return dst;
00072 }
00073 
00074 
00086 static inline int memcmp(const void * src, const void * dst, size_t cnt)
00087 {
00088         __u32 d0, d1, d2;
00089         int ret;
00090         
00091         __asm__ (
00092                 "repe cmpsb\n\t"
00093                 "je 1f\n\t"
00094                 "movl %3, %0\n\t"
00095                 "addl $1, %0\n\t"
00096                 "1:\n"
00097                 : "=a" (ret), "=%S" (d0), "=&D" (d1), "=&c" (d2)
00098                 : "0" (0), "1" ((__native) src), "2" ((__native) dst), "3" ((__native) cnt)
00099         );
00100         
00101         return ret;
00102 }
00103 
00113 static inline void memsetw(__address dst, size_t cnt, __u16 x)
00114 {
00115         __u32 d0, d1;
00116         
00117         __asm__ __volatile__ (
00118                 "rep stosw\n\t"
00119                 : "=&D" (d0), "=&c" (d1), "=a" (x)
00120                 : "0" (dst), "1" (cnt), "2" (x)
00121                 : "memory"
00122         );
00123 
00124 }
00125 
00135 static inline void memsetb(__address dst, size_t cnt, __u8 x)
00136 {
00137         __u32 d0, d1;
00138         
00139         __asm__ __volatile__ (
00140                 "rep stosb\n\t"
00141                 : "=&D" (d0), "=&c" (d1), "=a" (x)
00142                 : "0" (dst), "1" (cnt), "2" (x)
00143                 : "memory"
00144         );
00145 
00146 }
00147 
00148 #endif
00149 

Generated on Sun Jun 18 16:38:51 2006 for HelenOS Kernel (ia32) by  doxygen 1.4.6