xref: /reactos/sdk/lib/ucrt/string/amd64/strncpy.s (revision 94eb4751)
1*94eb4751STimo Kreuzer#include <asm.inc>
2*94eb4751STimo Kreuzer#include <ksamd64.inc>
3*94eb4751STimo Kreuzer.code64
4*94eb4751STimo Kreuzer#if 0
54fec953eSTimo Kreuzer        page    ,132
64fec953eSTimo Kreuzer        title   strncpy - copy at most n characters of string
74fec953eSTimo Kreuzer;***
84fec953eSTimo Kreuzer;strncpy.asm - copy at most n characters of string
94fec953eSTimo Kreuzer;
104fec953eSTimo Kreuzer;       Copyright (c) Microsoft Corporation. All rights reserved.
114fec953eSTimo Kreuzer;
124fec953eSTimo Kreuzer;Purpose:
134fec953eSTimo Kreuzer;       defines strncpy() - copy at most n characters of string
144fec953eSTimo Kreuzer;
154fec953eSTimo Kreuzer;*******************************************************************************
164fec953eSTimo Kreuzer; Look at strncat.asm for this file
174fec953eSTimo Kreuzerinclude ksamd64.inc
184fec953eSTimo Kreuzer        subttl  "strncpy"
19*94eb4751STimo Kreuzer#endif
204fec953eSTimo Kreuzer
21*94eb4751STimo KreuzerLEAF_ENTRY_ARG3 strncpy, _TEXT, dst_ptr_byte, src_ptr_byte, count_dword
22*94eb4751STimo Kreuzer//OPTION PROLOGUE:NONE, EPILOGUE:NONE
234fec953eSTimo Kreuzer
24*94eb4751STimo Kreuzer// align the SOURCE so we never page fault
25*94eb4751STimo Kreuzer// dest pointer alignment not important
264fec953eSTimo Kreuzer
274fec953eSTimo Kreuzer    mov     r11, rcx
284fec953eSTimo Kreuzer    or      r8, r8
294fec953eSTimo Kreuzer    jz      strncpy_exit
30*94eb4751STimo Kreuzer    sub     rcx, rdx // combine pointers
314fec953eSTimo Kreuzer    test    dl, 7
324fec953eSTimo Kreuzer    jz      qword_loop_entrance
334fec953eSTimo Kreuzer
344fec953eSTimo Kreuzercopy_head_loop_begin:
354fec953eSTimo Kreuzer    mov     al, [rdx]
364fec953eSTimo Kreuzer    test    al, al
374fec953eSTimo Kreuzer    mov     [rdx+rcx], al
384fec953eSTimo Kreuzer    jz      filler
394fec953eSTimo Kreuzer    inc     rdx
404fec953eSTimo Kreuzer    dec     r8
414fec953eSTimo Kreuzer    jz      strncpy_exit
424fec953eSTimo Kreuzer    test    dl, 7
434fec953eSTimo Kreuzer    jnz     copy_head_loop_begin
444fec953eSTimo Kreuzer    jmp     qword_loop_entrance
454fec953eSTimo Kreuzer
464fec953eSTimo Kreuzerstrncpy_exit:
474fec953eSTimo Kreuzer    mov     rax, r11
484fec953eSTimo Kreuzer    ret
494fec953eSTimo Kreuzer
504fec953eSTimo Kreuzerqword_loop_begin:
514fec953eSTimo Kreuzer    mov     [rdx+rcx], rax
524fec953eSTimo Kreuzer    add     rdx, 8
534fec953eSTimo Kreuzerqword_loop_entrance:
544fec953eSTimo Kreuzer    mov     rax, [rdx]
554fec953eSTimo Kreuzer    sub     r8,  8
564fec953eSTimo Kreuzer    jbe     qword_loop_end
57*94eb4751STimo Kreuzer    mov     r9, HEX(7efefefefefefeff)
584fec953eSTimo Kreuzer    add     r9, rax
594fec953eSTimo Kreuzer    mov     r10, rax
604fec953eSTimo Kreuzer    xor     r10, -1
614fec953eSTimo Kreuzer    xor     r10, r9
62*94eb4751STimo Kreuzer    mov     r9, HEX(8101010101010100)
634fec953eSTimo Kreuzer    test    r10, r9
644fec953eSTimo Kreuzer    jz      qword_loop_begin
654fec953eSTimo Kreuzer
664fec953eSTimo Kreuzerqword_loop_end:
674fec953eSTimo Kreuzer    add     r8, 8
684fec953eSTimo Kreuzer    jz      strncpy_exit_2
694fec953eSTimo Kreuzer
704fec953eSTimo Kreuzer    test    al, al
714fec953eSTimo Kreuzer    mov     [rdx+rcx], al
724fec953eSTimo Kreuzer    jz      filler
734fec953eSTimo Kreuzer    inc     rdx
744fec953eSTimo Kreuzer    dec     r8
754fec953eSTimo Kreuzer    jz      strncpy_exit_2
764fec953eSTimo Kreuzer    test    ah, ah
774fec953eSTimo Kreuzer    mov     [rdx+rcx], ah
784fec953eSTimo Kreuzer    jz      filler
794fec953eSTimo Kreuzer    inc     rdx
804fec953eSTimo Kreuzer    dec     r8
814fec953eSTimo Kreuzer    jz      strncpy_exit_2
824fec953eSTimo Kreuzer    shr     rax, 16
834fec953eSTimo Kreuzer    test    al, al
844fec953eSTimo Kreuzer    mov     [rdx+rcx], al
854fec953eSTimo Kreuzer    jz      filler
864fec953eSTimo Kreuzer    inc     rdx
874fec953eSTimo Kreuzer    dec     r8
884fec953eSTimo Kreuzer    jz      strncpy_exit_2
894fec953eSTimo Kreuzer    test    ah, ah
904fec953eSTimo Kreuzer    mov     [rdx+rcx], ah
914fec953eSTimo Kreuzer    jz      filler
924fec953eSTimo Kreuzer    inc     rdx
934fec953eSTimo Kreuzer    dec     r8
944fec953eSTimo Kreuzer    jz      strncpy_exit_2
954fec953eSTimo Kreuzer    shr     rax, 16
964fec953eSTimo Kreuzer    test    al, al
974fec953eSTimo Kreuzer    mov     [rdx+rcx], al
984fec953eSTimo Kreuzer    jz      filler
994fec953eSTimo Kreuzer    inc     rdx
1004fec953eSTimo Kreuzer    dec     r8
1014fec953eSTimo Kreuzer    jz      strncpy_exit_2
1024fec953eSTimo Kreuzer    test    ah, ah
1034fec953eSTimo Kreuzer    mov     [rdx+rcx], ah
1044fec953eSTimo Kreuzer    jz      filler
1054fec953eSTimo Kreuzer    inc     rdx
1064fec953eSTimo Kreuzer    dec     r8
1074fec953eSTimo Kreuzer    jz      strncpy_exit_2
1084fec953eSTimo Kreuzer    shr     eax, 16
1094fec953eSTimo Kreuzer    test    al, al
1104fec953eSTimo Kreuzer    mov     [rdx+rcx], al
1114fec953eSTimo Kreuzer    jz      filler
1124fec953eSTimo Kreuzer    inc     rdx
1134fec953eSTimo Kreuzer    dec     r8
1144fec953eSTimo Kreuzer    jz      strncpy_exit_2
1154fec953eSTimo Kreuzer    test    ah, ah
1164fec953eSTimo Kreuzer    mov     [rdx+rcx], ah
1174fec953eSTimo Kreuzer    jz      filler
1184fec953eSTimo Kreuzer    inc     rdx
1194fec953eSTimo Kreuzer    dec     r8
1204fec953eSTimo Kreuzer    jnz     qword_loop_entrance
1214fec953eSTimo Kreuzer
1224fec953eSTimo Kreuzerstrncpy_exit_2:
1234fec953eSTimo Kreuzer    mov     rax, r11
1244fec953eSTimo Kreuzer    ret
1254fec953eSTimo Kreuzer
126*94eb4751STimo Kreuzer//this is really just memset
1274fec953eSTimo Kreuzerfiller:
1284fec953eSTimo Kreuzer    add     rcx, rdx
1294fec953eSTimo Kreuzer    xor     rdx, rdx
1304fec953eSTimo Kreuzer    cmp     r8, 16
131*94eb4751STimo Kreuzer    jb      tail // a quickie
1324fec953eSTimo Kreuzeraligner1:
1334fec953eSTimo Kreuzer    test    cl, 7
1344fec953eSTimo Kreuzer    jz      aligned
1354fec953eSTimo Kreuzer    inc     rcx
1364fec953eSTimo Kreuzer    mov     [rcx], dl
1374fec953eSTimo Kreuzer    dec     r8
1384fec953eSTimo Kreuzer    jmp     aligner1
1394fec953eSTimo Kreuzeraligned:
1404fec953eSTimo Kreuzer    sub     r8, 32
1414fec953eSTimo Kreuzer    jb      tail_8_enter
1424fec953eSTimo Kreuzerloop32:
1434fec953eSTimo Kreuzer    mov     [rcx], rdx
1444fec953eSTimo Kreuzer    mov     [rcx+8], rdx
1454fec953eSTimo Kreuzer    mov     [rcx+16], rdx
1464fec953eSTimo Kreuzer    mov     [rcx+24], rdx
1474fec953eSTimo Kreuzer    add     rcx, 32
1484fec953eSTimo Kreuzer    sub     r8, 32
1494fec953eSTimo Kreuzer    jae     loop32
1504fec953eSTimo Kreuzer
1514fec953eSTimo Kreuzertail_8_enter:
152*94eb4751STimo Kreuzer    add     r8, 32   // get back the value
1534fec953eSTimo Kreuzertail_8_begin:
1544fec953eSTimo Kreuzer    sub     r8, 8
1554fec953eSTimo Kreuzer    jb      tail_enter
1564fec953eSTimo Kreuzer    mov     [rcx], rdx
1574fec953eSTimo Kreuzer    add     rcx, 8
1584fec953eSTimo Kreuzer    jmp     tail_8_begin
1594fec953eSTimo Kreuzer
1604fec953eSTimo Kreuzertail_enter:
161*94eb4751STimo Kreuzer    add     r8, 8   // get back the value
1624fec953eSTimo Kreuzertail:
1634fec953eSTimo Kreuzer    sub     r8, 1
1644fec953eSTimo Kreuzer    jb      tail_finish
1654fec953eSTimo Kreuzer    mov     [rcx], dl
1664fec953eSTimo Kreuzer    inc     rcx
1674fec953eSTimo Kreuzer    jmp     tail
1684fec953eSTimo Kreuzertail_finish:
1694fec953eSTimo Kreuzer    mov     rax, r11
1704fec953eSTimo Kreuzer    ret
1714fec953eSTimo Kreuzer
1724fec953eSTimo KreuzerLEAF_END strncpy, _TEXT
1734fec953eSTimo Kreuzer
1744fec953eSTimo Kreuzer    end
175