VirtualBox

Changeset 7185 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Feb 27, 2008 6:34:30 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
28485
Message:

no-crt memmove implementation.

Location:
trunk/src/VBox/Runtime/common/string
Files:
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/string/memmove.asm

    r7183 r7185  
    11; $Id$
    22;; @file
    3 ; innotek Portable Runtime - No-CRT memcpy - AMD64 & X86.
     3; innotek Portable Runtime - No-CRT memmove - AMD64 & X86.
    44;
    55
    66;
    7 ; Copyright (C) 2006-2007 innotek GmbH
     7; Copyright (C) 2006-2008 innotek GmbH
    88;
    99; This file is part of VirtualBox Open Source Edition (OSE), as
     
    3333; @param    pvSrc   gcc: rsi  msc: rdx  x86:[esp+8]
    3434; @param    cb      gcc: rdx  msc: r8   x86:[esp+0ch]
    35 BEGINPROC RT_NOCRT(memcpy)
    36         cld
    37 
    38         ; Do the bulk of the work.
     35BEGINPROC RT_NOCRT(memmove)
     36        ; Prolog.
    3937%ifdef RT_ARCH_AMD64
    4038 %ifdef ASM_CALL64_MSC
     
    4947 %endif
    5048        mov     rax, rdi                ; save the return value
     49%else
     50        push    edi
     51        push    esi
     52        mov     edi, [esp + 04h + 8]
     53        mov     esi, [esp + 08h + 8]
     54        mov     ecx, [esp + 0ch + 8]
     55        mov     edx, ecx
     56        mov     eax, edi                ; save the return value
     57%endif
     58
     59        ;
     60        ; Decide which direction to perform the copy in.
     61        ;
     62        cmp     xDI, xSI
     63        jb      .forward
     64
     65        ;
     66        ; Copy forward.
     67        ;
     68.forward:
     69        cld
     70%ifdef RT_ARCH_AMD64
    5171        shr     rcx, 3
    5272        rep movsq
    5373%else
    54         push    edi
    55         push    esi
    56 
    57         mov     ecx, [esp + 0ch + 8]
    58         mov     edi, [esp + 04h + 8]
    59         mov     esi, [esp + 08h + 8]
    60         mov     edx, ecx
    61         mov     eax, edi                ; save the return value
    6274        shr     ecx, 2
    6375        rep movsd
     
    6779%ifdef RT_ARCH_AMD64
    6880        test    dl, 4
    69         jz      .dont_move_dword
     81        jz      .forward_dont_move_dword
    7082        movsd
    7183%endif
    72 .dont_move_dword:
     84.forward_dont_move_dword:
    7385        test    dl, 2
    74         jz      .dont_move_word
     86        jz      .forward_dont_move_word
    7587        movsw
    76 .dont_move_word:
     88.forward_dont_move_word:
    7789        test    dl, 1
    78         jz      .dont_move_byte
     90        jz      .forward_dont_move_byte
    7991        movsb
    80 .dont_move_byte:
     92.forward_dont_move_byte:
    8193
     94        ;
     95        ; The epilog.
     96        ;
     97.epilog:
    8298%ifdef RT_ARCH_AMD64
    8399 %ifdef ASM_CALL64_MSC
     
    90106%endif
    91107        ret
    92 ENDPROC RT_NOCRT(memcpy)
    93108
     109
     110        ;
     111        ; Copy backward.
     112        ;
     113ALIGNCODE(16)
     114.backward:
     115        std
     116        add     xDI, xCX
     117        add     xSI, xCX
     118%ifdef RT_ARCH_AMD64
     119        shr     rcx, 3
     120        rep movsq
     121%else
     122        shr     ecx, 2
     123        rep movsd
     124%endif
     125
     126        ; The remaining bytes.
     127%ifdef RT_ARCH_AMD64
     128        test    dl, 4
     129        jz      .backward_dont_move_dword
     130        movsd
     131%endif
     132.backward_dont_move_dword:
     133        test    dl, 2
     134        jz      .backward_dont_move_word
     135        movsw
     136.backward_dont_move_word:
     137        test    dl, 1
     138        jz      .backward_dont_move_byte
     139        movsb
     140.backward_dont_move_byte:
     141
     142        cld
     143        jmp .epilog
     144ENDPROC RT_NOCRT(memmove)
     145
  • trunk/src/VBox/Runtime/common/string/memmove_alias.c

    r7183 r7185  
    11/* $Id$ */
    22/** @file
    3  * innotek Portable Runtime - No-CRT memcpy() alias for gcc.
     3 * innotek Portable Runtime - No-CRT memmove() alias for gcc.
    44 */
    55
    66/*
    7  * Copyright (C) 2006-2007 innotek GmbH
     7 * Copyright (C) 2006-2008 innotek GmbH
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3030*******************************************************************************/
    3131#include <iprt/nocrt/string.h>
    32 #undef memcpy
     32#undef memmove
    3333
    3434#if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS)
    3535# ifndef __MINGW32__
    36 #  pragma weak memcpy
     36#  pragma weak memmove
    3737# endif
    3838
    3939/* No alias support here (yet in the ming case). */
    40 extern void *(memcpy)(void *pvDst, const void *pvSrc, size_t cb)
     40extern void *(memmove)(void *pvDst, const void *pvSrc, size_t cb)
    4141{
    42     return RT_NOCRT(memcpy)(pvDst, pvSrc, cb);
     42    return RT_NOCRT(memmove)(pvDst, pvSrc, cb);
    4343}
    4444
    4545#elif __GNUC__ >= 4
    4646/* create a weak alias. */
    47 __asm__(".weak memcpy\t\n"
    48         " .set memcpy," RT_NOCRT_STR(memcpy) "\t\n");
     47__asm__(".weak memmove\t\n"
     48        " .set memmove," RT_NOCRT_STR(memmove) "\t\n");
    4949#else
    5050/* create a weak alias. */
    51 extern __typeof(RT_NOCRT(memcpy)) memcpy __attribute__((weak, alias(RT_NOCRT_STR(memcpy))));
     51extern __typeof(RT_NOCRT(memmove)) memmove __attribute__((weak, alias(RT_NOCRT_STR(memmove))));
    5252#endif
    5353
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