VirtualBox

Changeset 1174 in vbox for trunk/src/VBox/Runtime/string


Ignore:
Timestamp:
Mar 3, 2007 11:49:53 PM (18 years ago)
Author:
vboxsync
Message:

memcmp, strchr, strcmp.

Location:
trunk/src/VBox/Runtime/string
Files:
6 copied

Legend:

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

    r1060 r1174  
    11; $Id$
    22;; @file
    3 ; InnoTek Portable Runtime - No-CRT memcpy - AMD64 & X86.
     3; InnoTek Portable Runtime - No-CRT memcmp - AMD64 & X86.
    44;
    55
     
    2222%include "iprt/asmdefs.mac"
    2323
     24BEGINCODE
     25
    2426;;
    25 ; @param    pvDst   gcc: rdi  msc: rcx  x86:[esp+4]
    26 ; @param    pvSrc   gcc: rsi  msc: rdx  x86:[esp+8]
     27; @param    pv   gcc: rdi  msc: rcx  x86:[esp+4]
     28; @param    pv   gcc: rsi  msc: rdx  x86:[esp+8]
    2729; @param    cb      gcc: rdx  msc: r8   x86:[esp+0ch]
    28 BEGINPROC RT_NOCRT(memcpy)
     30BEGINPROC RT_NOCRT(memcmp)
    2931        cld
    3032
     
    4345        mov     rax, rdi                ; save the return value
    4446        shr     rcx, 3
    45         rep movsq
     47        repe cmpsq
     48        jne     .not_equal_qword
    4649%else
    4750        push    edi
     
    5255        mov     esi, [esp + 08h + 8]
    5356        mov     edx, ecx
    54         mov     eax, edi                ; save the return value
    55         shl     ecx, 2
    56         rep movsd
     57        xor     eax, eax
     58        jecxz   .done
     59        shr     ecx, 2
     60        repe cmpsd
     61        jne     .not_equal_dword
    5762%endif
    5863
     
    6065%ifdef __AMD64__
    6166        test    dl, 4
    62         jz      .dont_move_dword
    63         movsd
     67        jz      .dont_cmp_dword
     68        cmpsd
     69        jne     .not_equal_dword
    6470%endif
    65 .dont_move_dword:
     71.dont_cmp_dword:
    6672        test    dl, 2
    67         jz      .dont_move_word
    68         movsw
    69 .dont_move_word:
     73        jz      .dont_cmp_word
     74        cmpsw
     75        jne     .not_equal_word
     76.dont_cmp_word:
    7077        test    dl, 1
    71         jz      .dont_move_byte
    72         movsb
    73 .dont_move_byte:
     78        jz      .dont_cmp_byte
     79        cmpsb
     80        jne     .not_equal_byte
     81.dont_cmp_byte:
    7482
     83.done:
    7584%ifdef __AMD64__
    7685 %ifdef ASM_CALL64_MSC
     
    8392%endif
    8493        ret
    85 ENDPROC RT_NOCRT(memcpy)
    8694
     95;
     96; Mismatches.
     97;
     98%ifdef __AMD64__
     99.not_equal_qword:
     100    mov     ecx, 8
     101    sub     rsi, 8
     102    sub     rdi, 8
     103.not_equal_byte:
     104    repe cmpsb
     105    mov     al, [xDI-1]
     106    movzx   ecx, byte [xSI-1]
     107    sub     eax, ecx
     108    jmp     .done
     109%endif
     110
     111.not_equal_dword:
     112    mov     ecx, 4
     113    sub     xSI, 4
     114    sub     xDI, 4
     115    repe cmpsb
     116%ifdef __AMD64__
     117    jmp     .not_equal_byte
     118%else
     119.not_equal_byte:
     120    mov     al, [xDI-1]
     121    movzx   ecx, byte [xSI-1]
     122    sub     eax, ecx
     123    jmp     .done
     124%endif
     125
     126.not_equal_word:
     127    mov     ecx, 2
     128    sub     xSI, 2
     129    sub     xDI, 2
     130    repe cmpsb
     131    jmp     .not_equal_byte
     132ENDPROC RT_NOCRT(memcmp)
     133
  • trunk/src/VBox/Runtime/string/memcmp_alias.c

    r1060 r1174  
    1 /* $Id: memcpy.cpp 17216 2007-01-10 16:40:30Z bird $ */
     1/* $Id: memcmp.cpp 17216 2007-01-10 16:40:30Z bird $ */
    22/** @file
    3  * InnoTek Portable Runtime - No-CRT memcpy() alias for gcc.
     3 * InnoTek Portable Runtime - No-CRT memcmp() alias for gcc.
    44 */
    55
     
    2525*******************************************************************************/
    2626#include <iprt/nocrt/string.h>
    27 #undef memcpy
     27#undef memcmp
    2828
    2929#if defined(__DARWIN__) || defined(__WIN__)
    3030# ifndef __MINGW32__
    31 #  pragma weak memcpy
     31#  pragma weak memcmp
    3232# endif
    3333
    3434/* No alias support here (yet in the ming case). */
    35 extern void *(memcpy)(void *pvDst, const void *pvSrc, size_t cb)
     35extern int (memcmp)(const void *pv1, const void *pv2, size_t cb)
    3636{
    37     return RT_NOCRT(memcpy)(pvDst, pvSrc, cb);
     37    return RT_NOCRT(memcmp)(pv1, pv2, cb);
    3838}
    3939
    4040#elif __GNUC__ >= 4
    4141/* create a weak alias. */
    42 __asm__(".weak memcpy\t\n"
    43         " .set memcpy," RT_NOCRT_STR(memcpy) "\t\n");
     42__asm__(".weak memcmp\t\n"
     43        " .set memcmp," RT_NOCRT_STR(memcmp) "\t\n");
    4444#else
    4545/* create a weak alias. */
    46 extern __typeof(RT_NOCRT(memcpy)) memcpy __attribute__((weak, alias(RT_NOCRT_STR(memcpy))));
     46extern __typeof(RT_NOCRT(memcmp)) memcmp __attribute__((weak, alias(RT_NOCRT_STR(memcmp))));
    4747#endif
    4848
  • trunk/src/VBox/Runtime/string/strchr.asm

    r1060 r1174  
    11; $Id$
    22;; @file
    3 ; InnoTek Portable Runtime - No-CRT memchr - AMD64 & X86.
     3; InnoTek Portable Runtime - No-CRT strchr - AMD64 & X86.
    44;
    55
     
    2222%include "iprt/asmdefs.mac"
    2323
     24BEGINCODE
     25
    2426;;
    25 ; @param    pv      gcc: rdi  msc: ecx  x86:[esp+4]
     27; @param    psz     gcc: rdi  msc: rcx  x86:[esp+4]
    2628; @param    ch      gcc: esi  msc: edx  x86:[esp+8]
    27 ; @param    cb      gcc: rdx  msc: r8   x86:[esp+0ch]
    28 BEGINPROC RT_NOCRT(memchr)
     29BEGINPROC RT_NOCRT(strchr)
    2930        cld
     31
     32        ; check for ch == 0 and setup normal strchr.
    3033%ifdef __AMD64__
    3134 %ifdef ASM_CALL64_MSC
    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
     35        or      dl, dl
     36        jz near .strlen
     37        mov     r9, rsi                 ; save rsi
     38        mov     rsi, rcx
    3939 %else
    40         mov     rcx, rdx
    41         jrcxz   .not_found_early
    42 
    43         mov     eax, esi
     40        or      sil, sil
     41        jz near .strlen
     42        mov     edx, esi
     43        mov     rsi, rdi
    4444 %endif
    45 
    4645%else
    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]
     46        mov     edx, [esp + 8]
     47        or      dl, dl
     48        jz near .strlen
     49        mov     ecx, esi                ; save esi
     50        mov     esi, [esp + 4]
    5251%endif
    5352
    5453        ; do the search
    55         repne   scasb
    56         jne     .not_found
     54.next:
     55        lodsb
     56        cmp     al, dl
     57        je      .found
     58        test    al, al
     59        jz      .not_found
    5760
    58         ; found it
     61        lodsb
     62        cmp     al, dl
     63        je      .found
     64        test    al, al
     65        jz      .not_found
     66
     67        lodsb
     68        cmp     al, dl
     69        je      .found
     70        test    al, al
     71        jz      .not_found
     72
     73        lodsb
     74        cmp     al, dl
     75        je      .found
     76        test    al, al
     77        jz      .not_found
     78        jmp .next
     79
     80.found:
     81        lea     xAX, [xSI - 1]
     82%ifdef ASM_CALL64_MSC
     83        mov     rsi, r9
     84%endif
     85%ifdef __X86__
     86        mov     esi, ecx
     87%endif
     88        ret
     89
     90.not_found:
     91%ifdef ASM_CALL64_MSC
     92        mov     rsi, r9
     93%endif
     94%ifdef __X86__
     95        mov     esi, ecx
     96%endif
     97        xor     eax, eax
     98        ret
     99
     100;
     101; Special case: strchr(str, '\0');
     102;
     103align 16
     104.strlen:
     105%ifdef __AMD64__
     106 %ifdef ASM_CALL64_MSC
     107        mov     r9, rdi                 ; save rdi
     108        mov     rdi, rcx
     109 %endif
     110%else
     111        mov     edx, edi                ; save edi
     112        mov     edi, [esp + 4]
     113%endif
     114        mov     xCX, -1
     115        xor     eax, eax
     116        repne scasb
     117
    59118        lea     xAX, [xDI - 1]
    60119%ifdef ASM_CALL64_MSC
     
    65124%endif
    66125        ret
     126ENDPROC RT_NOCRT(strchr)
    67127
    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
    78 ENDPROC RT_NOCRT(memchr)
    79 
  • trunk/src/VBox/Runtime/string/strchr_alias.c

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

    r1060 r1174  
    11; $Id$
    22;; @file
    3 ; InnoTek Portable Runtime - No-CRT memcpy - AMD64 & X86.
     3; InnoTek Portable Runtime - No-CRT strcmp - AMD64 & X86.
    44;
    55
     
    2222%include "iprt/asmdefs.mac"
    2323
     24BEGINCODE
     25
    2426;;
    25 ; @param    pvDst   gcc: rdi  msc: rcx  x86:[esp+4]
    26 ; @param    pvSrc   gcc: rsi  msc: rdx  x86:[esp+8]
    27 ; @param    cb      gcc: rdx  msc: r8   x86:[esp+0ch]
    28 BEGINPROC RT_NOCRT(memcpy)
    29         cld
    30 
    31         ; Do the bulk of the work.
     27; @param    psz1   gcc: rdi  msc: rcx  x86:[esp+4]
     28; @param    psz2   gcc: rsi  msc: rdx  x86:[esp+8]
     29BEGINPROC RT_NOCRT(strcmp)
     30        ; input
    3231%ifdef __AMD64__
    3332 %ifdef ASM_CALL64_MSC
    34         mov     r10, rdi                ; save
    35         mov     r11, rsi                ; save
    36         mov     rdi, rcx
    37         mov     rsi, rdx
    38         mov     rcx, r8
    39         mov     rdx, r8
     33  %define psz1 rcx
     34  %define psz2 rdx
    4035 %else
    41         mov     rcx, rdx
     36  %define psz1 rdi
     37  %define psz2 rsi
    4238 %endif
    43         mov     rax, rdi                ; save the return value
    44         shr     rcx, 3
    45         rep movsq
    4639%else
    47         push    edi
    48         push    esi
    49 
    50         mov     ecx, [esp + 0ch + 8]
    51         mov     edi, [esp + 04h + 8]
    52         mov     esi, [esp + 08h + 8]
    53         mov     edx, ecx
    54         mov     eax, edi                ; save the return value
    55         shl     ecx, 2
    56         rep movsd
     40        mov     ecx, [esp + 4]
     41        mov     edx, [esp + 8]
     42  %define psz1 ecx
     43  %define psz2 edx
    5744%endif
    5845
    59         ; The remaining bytes.
    60 %ifdef __AMD64__
    61         test    dl, 4
    62         jz      .dont_move_dword
    63         movsd
    64 %endif
    65 .dont_move_dword:
    66         test    dl, 2
    67         jz      .dont_move_word
    68         movsw
    69 .dont_move_word:
    70         test    dl, 1
    71         jz      .dont_move_byte
    72         movsb
    73 .dont_move_byte:
     46        ;
     47        ; The loop.
     48        ;
     49.next:
     50        mov     al, [psz1]
     51        mov     ah, [psz2]
     52        cmp     al, ah
     53        jne     .not_equal
     54        test    al, al
     55        jz      .equal
    7456
    75 %ifdef __AMD64__
    76  %ifdef ASM_CALL64_MSC
    77         mov     rdi, r10
    78         mov     rsi, r11
    79  %endif
    80 %else
    81         pop     esi
    82         pop     edi
    83 %endif
     57        mov     al, [psz1 + 1]
     58        mov     ah, [psz2 + 1]
     59        cmp     al, ah
     60        jne     .not_equal
     61        test    al, al
     62        jz      .equal
     63        inc     psz1
     64        inc     psz2
     65
     66        mov     al, [psz1 + 2]
     67        mov     ah, [psz2 + 2]
     68        cmp     al, ah
     69        jne     .not_equal
     70        test    al, al
     71        jz      .equal
     72        inc     psz1
     73        inc     psz2
     74
     75        mov     al, [psz1 + 3]
     76        mov     ah, [psz2 + 3]
     77        cmp     al, ah
     78        jne     .not_equal
     79        test    al, al
     80        jz      .equal
     81
     82        add     psz1, 4
     83        add     psz2, 4
     84        jmp     .next
     85
     86.equal:
     87        xor     eax, eax
    8488        ret
    85 ENDPROC RT_NOCRT(memcpy)
    8689
     90.not_equal:
     91        movzx   ecx, ah
     92        and     eax, 0ffh
     93        sub     eax, ecx
     94        ret
     95ENDPROC RT_NOCRT(strcmp)
     96
  • trunk/src/VBox/Runtime/string/strcmp_alias.c

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

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