Changeset 7185 in vbox for trunk/src/VBox/Runtime
- Timestamp:
- Feb 27, 2008 6:34:30 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 28485
- Location:
- trunk/src/VBox/Runtime/common/string
- Files:
-
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/string/memmove.asm
r7183 r7185 1 1 ; $Id$ 2 2 ;; @file 3 ; innotek Portable Runtime - No-CRT mem cpy- AMD64 & X86.3 ; innotek Portable Runtime - No-CRT memmove - AMD64 & X86. 4 4 ; 5 5 6 6 ; 7 ; Copyright (C) 2006-200 7innotek GmbH7 ; Copyright (C) 2006-2008 innotek GmbH 8 8 ; 9 9 ; This file is part of VirtualBox Open Source Edition (OSE), as … … 33 33 ; @param pvSrc gcc: rsi msc: rdx x86:[esp+8] 34 34 ; @param cb gcc: rdx msc: r8 x86:[esp+0ch] 35 BEGINPROC RT_NOCRT(memcpy) 36 cld 37 38 ; Do the bulk of the work. 35 BEGINPROC RT_NOCRT(memmove) 36 ; Prolog. 39 37 %ifdef RT_ARCH_AMD64 40 38 %ifdef ASM_CALL64_MSC … … 49 47 %endif 50 48 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 51 71 shr rcx, 3 52 72 rep movsq 53 73 %else 54 push edi55 push esi56 57 mov ecx, [esp + 0ch + 8]58 mov edi, [esp + 04h + 8]59 mov esi, [esp + 08h + 8]60 mov edx, ecx61 mov eax, edi ; save the return value62 74 shr ecx, 2 63 75 rep movsd … … 67 79 %ifdef RT_ARCH_AMD64 68 80 test dl, 4 69 jz . dont_move_dword81 jz .forward_dont_move_dword 70 82 movsd 71 83 %endif 72 . dont_move_dword:84 .forward_dont_move_dword: 73 85 test dl, 2 74 jz . dont_move_word86 jz .forward_dont_move_word 75 87 movsw 76 . dont_move_word:88 .forward_dont_move_word: 77 89 test dl, 1 78 jz . dont_move_byte90 jz .forward_dont_move_byte 79 91 movsb 80 . dont_move_byte:92 .forward_dont_move_byte: 81 93 94 ; 95 ; The epilog. 96 ; 97 .epilog: 82 98 %ifdef RT_ARCH_AMD64 83 99 %ifdef ASM_CALL64_MSC … … 90 106 %endif 91 107 ret 92 ENDPROC RT_NOCRT(memcpy)93 108 109 110 ; 111 ; Copy backward. 112 ; 113 ALIGNCODE(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 144 ENDPROC RT_NOCRT(memmove) 145 -
trunk/src/VBox/Runtime/common/string/memmove_alias.c
r7183 r7185 1 1 /* $Id$ */ 2 2 /** @file 3 * innotek Portable Runtime - No-CRT mem cpy() alias for gcc.3 * innotek Portable Runtime - No-CRT memmove() alias for gcc. 4 4 */ 5 5 6 6 /* 7 * Copyright (C) 2006-200 7innotek GmbH7 * Copyright (C) 2006-2008 innotek GmbH 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 30 30 *******************************************************************************/ 31 31 #include <iprt/nocrt/string.h> 32 #undef mem cpy32 #undef memmove 33 33 34 34 #if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS) 35 35 # ifndef __MINGW32__ 36 # pragma weak mem cpy36 # pragma weak memmove 37 37 # endif 38 38 39 39 /* No alias support here (yet in the ming case). */ 40 extern void *(mem cpy)(void *pvDst, const void *pvSrc, size_t cb)40 extern void *(memmove)(void *pvDst, const void *pvSrc, size_t cb) 41 41 { 42 return RT_NOCRT(mem cpy)(pvDst, pvSrc, cb);42 return RT_NOCRT(memmove)(pvDst, pvSrc, cb); 43 43 } 44 44 45 45 #elif __GNUC__ >= 4 46 46 /* create a weak alias. */ 47 __asm__(".weak mem cpy\t\n"48 " .set mem cpy," RT_NOCRT_STR(memcpy) "\t\n");47 __asm__(".weak memmove\t\n" 48 " .set memmove," RT_NOCRT_STR(memmove) "\t\n"); 49 49 #else 50 50 /* create a weak alias. */ 51 extern __typeof(RT_NOCRT(mem cpy)) memcpy __attribute__((weak, alias(RT_NOCRT_STR(memcpy))));51 extern __typeof(RT_NOCRT(memmove)) memmove __attribute__((weak, alias(RT_NOCRT_STR(memmove)))); 52 52 #endif 53 53
Note:
See TracChangeset
for help on using the changeset viewer.