897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; $Id$
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;; @file
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; IPRT - No-CRT strncpy - AMD64 & X86.
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; Copyright (C) 2006-2012 Oracle Corporation
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; available from http://www.virtualbox.org. This file is free software;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; you can redistribute it and/or modify it under the terms of the GNU
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; General Public License (GPL) as published by the Free Software
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; The contents of this file may alternatively be used under the terms
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; of the Common Development and Distribution License Version 1.0
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; VirtualBox OSE distribution, in which case the provisions of the
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; CDDL are applicable instead of those of the GPL.
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; You may elect to license modified versions of this file under the
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; terms and conditions of either the GPL or the CDDL or both.
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync%include "iprt/asmdefs.mac"
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsyncBEGINCODE
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync;;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; @param pszDst gcc: rdi msc: rcx x86:[esp+4]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; @param pszSrc gcc: rsi msc: rdx x86:[esp+8]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync; @param cbMax gcc: rdx msc: r8 x86:[esp+12]
f6e126865bd68a5743fbb9e620a77db2a1b1b861vboxsyncRT_NOCRT_BEGINPROC strncpy
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ; input
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync%ifdef RT_ARCH_AMD64
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %ifdef ASM_CALL64_MSC
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define pszDst rcx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define pszSrc rdx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define cbMax r8
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %else
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define pszDst rdi
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define pszSrc rsi
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define cbMax rdx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %endif
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov r9, pszDst
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync%else
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov ecx, [esp + 4]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov edx, [esp + 8]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync push ebx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov ebx, [esp + 12 + 4]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define pszDst ecx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define pszSrc edx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync %define cbMax ebx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync push pszDst
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync%endif
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ; The rolled out loop.
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync.next:
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync cmp cbMax, 4
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jb .simple_intro
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov al, [pszSrc]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov [pszDst], al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync test al, al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jz .done
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov al, [pszSrc + 1]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov [pszDst + 1], al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync test al, al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jz .done
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov al, [pszSrc + 2]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov [pszDst + 2], al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync test al, al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jz .done
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov al, [pszSrc + 3]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov [pszDst + 3], al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync test al, al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jz .done
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync add pszDst, 4
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync add pszSrc, 4
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync sub cbMax, 4
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jmp .next
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ; Char by char.
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ;
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync.simple_intro:
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync test cbMax, cbMax
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jz .done
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync.simple_next:
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov al, [pszSrc]
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov [pszDst], al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync test al, al
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jz .done
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync dec cbMax
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jz .done
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync inc pszSrc
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync inc pszDst
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync jmp .simple_next
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync.done:
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync%ifdef RT_ARCH_AMD64
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync mov rax, r9
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync%else
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync pop ebx
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync pop eax
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync%endif
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync ret
f6e126865bd68a5743fbb9e620a77db2a1b1b861vboxsyncENDPROC RT_NOCRT(strncpy)
897afdda769ec9fd3dbe35b57a3a041cfde0d6a7vboxsync