mirror of
https://github.com/reactos/reactos.git
synced 2025-05-22 18:45:00 +00:00
174 lines
3.5 KiB
ArmAsm
174 lines
3.5 KiB
ArmAsm
#include <asm.inc>
|
|
#include <ksamd64.inc>
|
|
.code64
|
|
#if 0
|
|
page ,132
|
|
title strncpy - copy at most n characters of string
|
|
;***
|
|
;strncpy.asm - copy at most n characters of string
|
|
;
|
|
; Copyright (c) Microsoft Corporation. All rights reserved.
|
|
;
|
|
;Purpose:
|
|
; defines strncpy() - copy at most n characters of string
|
|
;
|
|
;*******************************************************************************
|
|
; Look at strncat.asm for this file
|
|
include ksamd64.inc
|
|
subttl "strncpy"
|
|
#endif
|
|
|
|
LEAF_ENTRY_ARG3 strncpy, _TEXT, dst_ptr_byte, src_ptr_byte, count_dword
|
|
//OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
|
|
|
// align the SOURCE so we never page fault
|
|
// dest pointer alignment not important
|
|
|
|
mov r11, rcx
|
|
or r8, r8
|
|
jz strncpy_exit
|
|
sub rcx, rdx // combine pointers
|
|
test dl, 7
|
|
jz qword_loop_entrance
|
|
|
|
copy_head_loop_begin:
|
|
mov al, [rdx]
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit
|
|
test dl, 7
|
|
jnz copy_head_loop_begin
|
|
jmp qword_loop_entrance
|
|
|
|
strncpy_exit:
|
|
mov rax, r11
|
|
ret
|
|
|
|
qword_loop_begin:
|
|
mov [rdx+rcx], rax
|
|
add rdx, 8
|
|
qword_loop_entrance:
|
|
mov rax, [rdx]
|
|
sub r8, 8
|
|
jbe qword_loop_end
|
|
mov r9, HEX(7efefefefefefeff)
|
|
add r9, rax
|
|
mov r10, rax
|
|
xor r10, -1
|
|
xor r10, r9
|
|
mov r9, HEX(8101010101010100)
|
|
test r10, r9
|
|
jz qword_loop_begin
|
|
|
|
qword_loop_end:
|
|
add r8, 8
|
|
jz strncpy_exit_2
|
|
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
shr rax, 16
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
shr rax, 16
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
shr eax, 16
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jnz qword_loop_entrance
|
|
|
|
strncpy_exit_2:
|
|
mov rax, r11
|
|
ret
|
|
|
|
//this is really just memset
|
|
filler:
|
|
add rcx, rdx
|
|
xor rdx, rdx
|
|
cmp r8, 16
|
|
jb tail // a quickie
|
|
aligner1:
|
|
test cl, 7
|
|
jz aligned
|
|
inc rcx
|
|
mov [rcx], dl
|
|
dec r8
|
|
jmp aligner1
|
|
aligned:
|
|
sub r8, 32
|
|
jb tail_8_enter
|
|
loop32:
|
|
mov [rcx], rdx
|
|
mov [rcx+8], rdx
|
|
mov [rcx+16], rdx
|
|
mov [rcx+24], rdx
|
|
add rcx, 32
|
|
sub r8, 32
|
|
jae loop32
|
|
|
|
tail_8_enter:
|
|
add r8, 32 // get back the value
|
|
tail_8_begin:
|
|
sub r8, 8
|
|
jb tail_enter
|
|
mov [rcx], rdx
|
|
add rcx, 8
|
|
jmp tail_8_begin
|
|
|
|
tail_enter:
|
|
add r8, 8 // get back the value
|
|
tail:
|
|
sub r8, 1
|
|
jb tail_finish
|
|
mov [rcx], dl
|
|
inc rcx
|
|
jmp tail
|
|
tail_finish:
|
|
mov rax, r11
|
|
ret
|
|
|
|
LEAF_END strncpy, _TEXT
|
|
|
|
end
|