1/* 2 * Copyright (C) 2023 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28/* 29 * Copyright (c) 2023 SiFive, Inc. 30 * All rights reserved. 31 * 32 * Redistribution and use in source and binary forms, with or without 33 * modification, are permitted provided that the following conditions 34 * are met: 35 * 1. Redistributions of source code must retain the above copyright 36 * notice, this list of conditions and the following disclaimer. 37 * 2. Redistributions in binary form must reproduce the above copyright 38 * notice, this list of conditions and the following disclaimer in the 39 * documentation and/or other materials provided with the distribution. 40 * 3. The name of the company may not be used to endorse or promote 41 * products derived from this software without specific prior written 42 * permission. 43 * 44 * THIS SOFTWARE IS PROVIDED BY SIFIVE INC ``AS IS'' AND ANY EXPRESS OR IMPLIED 45 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 46 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 47 * IN NO EVENT SHALL SIFIVE INC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 48 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 49 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 50 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 51 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 52 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 53 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 */ 55 56#include <private/bionic_asm.h> 57 58#define pDst a0 59#define pSrc a1 60#define iLength a2 61#define pDstPtr a3 62 63#define iVL a4 64#define iCurrentVL a5 65#define iActiveElemPos a6 66 67#define ELEM_LMUL_SETTING m1 68#define vMask1 v0 69#define vMask2 v1 70#define ZERO_FILL_ELEM_LMUL_SETTING m8 71#define vStr1 v8 72#define vStr2 v16 73 74ENTRY(strncpy_v) 75 76 mv pDstPtr, pDst 77 78 // copy pSrc to pDstPtr 79L(strcpy_loop): 80 vsetvli iVL, iLength, e8, ELEM_LMUL_SETTING, ta, ma 81 vle8ff.v vStr1, (pSrc) 82 vmseq.vx vMask2, vStr1, zero 83 csrr iCurrentVL, vl 84 vfirst.m iActiveElemPos, vMask2 85 vmsif.m vMask1, vMask2 86 add pSrc, pSrc, iCurrentVL 87 sub iLength, iLength, iCurrentVL 88 vse8.v vStr1, (pDstPtr), vMask1.t 89 add pDstPtr, pDstPtr, iCurrentVL 90 bgez iActiveElemPos, L(fill_zero) 91 bnez iLength, L(strcpy_loop) 92 ret 93 94 # fill the tail zero. 95L(fill_zero): 96 sub iVL, iCurrentVL, iActiveElemPos 97 add iLength, iLength, iVL 98 bnez iLength, 1f 99 ret 1001: 101 sub pDstPtr, pDstPtr, iVL 102 vsetvli zero, iLength, e8, ZERO_FILL_ELEM_LMUL_SETTING, ta, ma 103 vmv.v.x vStr2, zero 104 105L(fill_zero_loop): 106 vsetvli iVL, iLength, e8, ZERO_FILL_ELEM_LMUL_SETTING, ta, ma 107 vse8.v vStr2, (pDstPtr) 108 sub iLength, iLength, iVL 109 add pDstPtr, pDstPtr, iVL 110 bnez iLength, L(fill_zero_loop) 111 112 ret 113 114END(strncpy_v) 115