VirtualBox

Changeset 194 in vbox


Ignore:
Timestamp:
Jan 19, 2007 9:56:57 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
17670
Message:

memchr.

Location:
trunk/src/VBox/Runtime
Files:
1 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile

    r131 r194  
    442442        misc/setjmp.asm \
    443443        \
     444        string/memchr.asm \
     445        string/memchr_alias.c \
    444446        string/memcpy.asm \
    445447        string/memcpy_alias.c \
     
    512514RuntimeR0Drv_TEMPLATE   = VBOXR0DRV
    513515RuntimeR0Drv_SDKS.win   = W2K3DDK WINPSDKINCS
    514 RuntimeR0Drv_DEFS       = IN_RT_R0 RT_WITH_VBOX
     516RuntimeR0Drv_DEFS       = IN_RT_R0 RT_WITH_VBOX RT_WITHOUT_NOCRT_WRAPPERS
    515517RuntimeR0Drv_DEFS.win   = IN_SUP_R0
    516518RuntimeR0Drv_DEFS.linux = MODULE KBUILD_MODNAME=KBUILD_STR\(vboxdrv\) KBUILD_BASENAME=KBUILD_STR\(vboxdrv\) IN_SUP_R0 # why is IN_SUP_R0 here? because!
     
    558560RuntimeR0Drv_SOURCES.darwin = \
    559561        RTErrConvertFromErrno.cpp \
     562        string/memchr.asm \
    560563        r0drv/initterm-r0drv.cpp \
    561564        r0drv/memobj-r0drv.cpp \
  • trunk/src/VBox/Runtime/string/memchr.asm

    r79 r194  
    11; $Id$
    22;; @file
    3 ; InnoTek Portable Runtime - No-CRT memset - AMD64 & X86.
     3; InnoTek Portable Runtime - No-CRT memchr - AMD64 & X86.
    44;
    55
     
    2323
    2424;;
    25 ; @param    pvDst   gcc: rdi  msc: ecx  x86:[esp+4]
     25; @param    pv      gcc: rdi  msc: ecx  x86:[esp+4]
    2626; @param    ch      gcc: esi  msc: edx  x86:[esp+8]
    2727; @param    cb      gcc: rdx  msc: r8   x86:[esp+0ch]
    28 BEGINPROC RT_NOCRT(memset)
     28BEGINPROC RT_NOCRT(memchr)
    2929        cld
    3030%ifdef __AMD64__
    3131 %ifdef ASM_CALL64_MSC
    32         int3
    33   %error "Port me"
     32        or      r8, r8
     33        jz      .not_found_early
     34
     35        mov     r9, rdi                 ; save rdi
     36        mov     eax, edx
     37        mov     rdi, rcx
     38        mov     rcx, r8
    3439 %else
    35         movzx   eax, sil
    36         cmp     rdx, 32
    37         jb      .dobytes
     40        mov     rcx, rdx
     41        jrcxz   .not_found_early
    3842
    39         ; eax = (al << 24) | (al << 16) | (al << 8) | al;
    40         ; rdx = (eax << 32) | eax
    41         movzx   esi, sil
    42         mov     rax, qword 0101010101010101h
    43         imul    rax, rsi
    44 
    45         ; todo: alignment.
    46 
    47         mov     rcx, rdx
    48         shr     rcx, 3
    49         rep stosq
    50 
    51         and     rdx, 7
    52 .dobytes:
    53         mov     rcx, rdx
    54         rep stosb
     43        mov     eax, esi
    5544 %endif
    5645
    5746%else
    58         push    edi
     47        mov     ecx, [esp + 0ch]
     48        jecxz   .not_found_early
     49        mov     edx, edi                ; save edi
     50        mov     eax, [esp + 8]
     51        mov     edi, [esp + 4]
     52%endif
    5953
    60         mov     ecx, [esp + 0ch + 4]
    61         movzx   eax, byte [esp + 08h + 4]
    62         mov     edi, [esp + 04h + 4]
    63         cmp     ecx, 12
    64         jb      .dobytes
     54        ; do the search
     55        repne   scasb
     56        jne     .not_found
    6557
    66         ; eax = (al << 24) | (al << 16) | (al << 8) | al;
    67         mov     ah, al
    68         mov     edx, eax
    69         shr     edx, 16
    70         or      eax, edx
    71 
    72         mov     edx, ecx
    73         shr     ecx, 2
    74         rep stosd
    75 
    76         and     edx, 3
    77         mov     ecx, edx
    78 .dobytes:
    79         rep stosb
    80 
    81         pop     edi
     58        ; found it
     59        lea     xAX, [xDI - 1]
     60%ifdef ASM_CALL64_MSC
     61        mov     rdi, r9
     62%endif
     63%ifdef __X86__
     64        mov     edi, edx
    8265%endif
    8366        ret
    84 ENDPROC RT_NOCRT(memset)
    8567
     68.not_found:
     69%ifdef ASM_CALL64_MSC
     70        mov     rdi, r9
     71%endif
     72%ifdef __X86__
     73        mov     edi, edx
     74%endif
     75.not_found_early:
     76        xor     eax, eax
     77        ret
     78ENDPROC RT_NOCRT(memchr)
     79
  • trunk/src/VBox/Runtime/string/memchr_alias.c

    r79 r194  
    11/* $Id: $ */
    22/** @file
    3  * InnoTek Portable Runtime - No-CRT memset() alias for gcc.
     3 * InnoTek Portable Runtime - No-CRT memchr() alias for gcc.
    44 */
    55
     
    2525*******************************************************************************/
    2626#include <iprt/nocrt/string.h>
    27 #undef memset
     27#undef memchr
    2828
    2929#if defined(__DARWIN__) || defined(__WIN__)
    3030# ifndef __MINGW32__
    31 #  pragma weak memset
     31#  pragma weak memchr
    3232# endif
    3333
    3434/* No alias support here (yet in the ming case). */
    35 extern void *(memset)(void *pvDst, int ch, size_t cb)
     35extern void *(memchr)(const void *pv, int ch, size_t cb)
    3636{
    37     return RT_NOCRT(memset)(pvDst, ch, cb);
     37    return RT_NOCRT(memchr)(pv, ch, cb);
    3838}
    3939
    4040#elif __GNUC__ >= 4
    4141/* create a weak alias. */
    42 __asm__(".weak memset\t\n"
    43         " .set memset," RT_NOCRT_STR(memset) "\t\n");
     42__asm__(".weak memchr\t\n"
     43        " .set memchr," RT_NOCRT_STR(memchr) "\t\n");
    4444#else
    4545/* create a weak alias. */
    46 extern __typeof(RT_NOCRT(memset)) memset __attribute__((weak, alias(RT_NOCRT_STR(memset))));
     46extern __typeof(RT_NOCRT(memchr)) memchr __attribute__((weak, alias(RT_NOCRT_STR(memchr))));
    4747#endif
    4848
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette