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