blob: f133f2839b43c3df4797baaa87a657811e880327 [file] [log] [blame]
Yun Hsiang40a82d02023-05-26 10:10:40 +08001/*
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
Elliott Hughesbc192cf2023-08-04 15:08:38 -070056#include <private/bionic_asm.h>
Yun Hsiang40a82d02023-05-26 10:10:40 +080057
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
Elliott Hughesaefe9992023-11-08 12:04:41 -080074ENTRY(strncpy_v)
Yun Hsiang40a82d02023-05-26 10:10:40 +080075
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
Elliott Hughesaefe9992023-11-08 12:04:41 -0800114END(strncpy_v)