Path: blob/main/lib/libc/powerpc64/string/strncpy_arch_2_05.S
39530 views
/*-1* Copyright (c) 2018 Instituto de Pesquisas Eldorado2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12* 3. Neither the name of the author nor the names of its contributors may13* be used to endorse or promote products derived from this software14*15* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND16* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE17* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE18* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE19* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL20* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS21* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)22* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT23* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY24* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF25* SUCH DAMAGE.26*/2728#include <machine/asm.h>29ENTRY(__strncpy_arch_2_05)30stdu %r1,-40(%r1)31mflr %r032std %r0,16(%r1)33std %r3,32(%r1)3435xor %r6,%r6,%r6 /* fixed 0 reg */3637/* align loop */38addi %r3,%r3,-139.Lalign_loop:40/* len? */41cmpdi %r5,042beq .Lexit43/* aligned? */44andi. %r0,%r4,745beq .Ldw_copy46/* copy */47lbz %r7,0(%r4)48stbu %r7,1(%r3)49addi %r4,%r4,150addi %r5,%r5,-151/* zero? */52cmpdi %r7,053beq .Lzero54b .Lalign_loop5556/* dword copy loop */57.Ldw_copy:58/* prepare src and dst to use load/store and update */59addi %r3,%r3,-760addi %r4,%r4,-861.Ldw_copy_loop:62cmpdi %r5,863blt .Lbyte_copy6465ldu %r0,8(%r4)66/* check for 0 */67cmpb %r7,%r0,%r668cmpdi %r7,069bne .Lbyte_copy_and_zero70/* copy to dst */71stdu %r0,8(%r3)72addi %r5,%r5,-873b .Ldw_copy_loop7475/* Copy remaining src bytes, zero-out buffer76* Note: r5 will be >= 877*/78.Lbyte_copy_and_zero:79addi %r3,%r3,780addi %r4,%r4,-181.Lbyte_copy_and_zero_loop:82lbzu %r7,1(%r4)83stbu %r7,1(%r3)84addi %r5,%r5,-185cmpdi %r7,086beq .Lzero87b .Lbyte_copy_and_zero_loop8889/* zero-out remaining dst bytes */90.Lzero:91addi %r3,%r3,192li %r4,093/* r5 has len already */94bl memset95nop96b .Lexit9798/* copy remaining (< 8) bytes */99.Lbyte_copy:100cmpdi %r5,0101beq .Lexit102addi %r3,%r3,7103addi %r4,%r4,7104mtctr %r5105.Lbyte_copy_loop:106lbzu %r7,1(%r4)107stbu %r7,1(%r3)108cmpdi %r7,0109/* 0 found: zero out remaining bytes */110beq .Lbyte_copy_zero111bdnz .Lbyte_copy_loop112b .Lexit113.Lbyte_copy_zero_loop:114stbu %r6,1(%r3)115.Lbyte_copy_zero:116bdnz .Lbyte_copy_zero_loop117118.Lexit:119/* epilogue */120ld %r3,32(%r1)121ld %r0,16(%r1)122mtlr %r0123addi %r1,%r1,40124blr125126END(__strncpy_arch_2_05)127128.section .note.GNU-stack,"",%progbits129130131