blob: 01e72b154f79a9dae61bdc7e7e20c813c1800d8d [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 iResult a0
59
60#define pStr1 a0
61#define pStr2 a1
62
63#define iVL a2
64#define iTemp1 a3
65#define iTemp2 a4
66#define iLMUL1 a5
67#define iLMUL2 a6
68#define iLMUL4 a7
69
70#define iLMUL t0
71
72#define vStr1 v0
73#define vStr2 v8
74#define vMask1 v16
75#define vMask2 v17
76
Elliott Hughesaefe9992023-11-08 12:04:41 -080077ENTRY(strcmp_v)
Yun Hsiang40a82d02023-05-26 10:10:40 +080078
79 # increase the lmul using the following sequences:
80 # 1/2, 1/2, 1, 2, 4, 4, 4, ...
81
82 # lmul=1/2
83 vsetvli iVL, zero, e8, mf2, ta, ma
84
85 vle8ff.v vStr1, (pStr1)
86 # check if vStr1[i] == 0
87 vmseq.vx vMask1, vStr1, zero
88
89 vle8ff.v vStr2, (pStr2)
90 # check if vStr1[i] != vStr2[i]
91 vmsne.vv vMask2, vStr1, vStr2
92
93 # find the index x for vStr1[x]==0
94 vfirst.m iTemp1, vMask1
95 # find the index x for vStr1[x]!=vStr2[x]
96 vfirst.m iTemp2, vMask2
97
98 bgez iTemp1, L(check1)
99 bgez iTemp2, L(check2)
100
101 # get the current vl updated by vle8ff.
102 csrr iVL, vl
103 add pStr1, pStr1, iVL
104 add pStr2, pStr2, iVL
105
106 vsetvli iVL, zero, e8, mf2, ta, ma
107 addi iLMUL1, zero, 1
108 addi iLMUL, zero, 1
109 j L(loop)
110L(m1):
111 vsetvli iVL, zero, e8, m1, ta, ma
112 addi iLMUL2, zero, 2
113 addi iLMUL, zero, 2
114 j L(loop)
115L(m2):
116 vsetvli iVL, zero, e8, m2, ta, ma
117 addi iLMUL4, zero, 4
118 addi iLMUL, zero, 4
119 j L(loop)
120L(m4):
121 vsetvli iVL, zero, e8, m4, ta, ma
122
123L(loop):
124 vle8ff.v vStr1, (pStr1)
125 vmseq.vx vMask1, vStr1, zero
126
127 vle8ff.v vStr2, (pStr2)
128 vmsne.vv vMask2, vStr1, vStr2
129
130 vfirst.m iTemp1, vMask1
131 vfirst.m iTemp2, vMask2
132
133 bgez iTemp1, L(check1)
134 bgez iTemp2, L(check2)
135
136 csrr iVL, vl
137 add pStr1, pStr1, iVL
138 add pStr2, pStr2, iVL
139
140 beq iLMUL, iLMUL1, L(m1)
141 beq iLMUL, iLMUL2, L(m2)
142 beq iLMUL, iLMUL4, L(m4)
143 j L(loop)
144
145 // iTemp1>=0
146L(check1):
147 bltz iTemp2, 1f
148 blt iTemp2, iTemp1, L(check2)
1491:
150 // iTemp2<0
151 // iTemp2>=0 && iTemp1<iTemp2
152 add pStr1, pStr1, iTemp1
153 add pStr2, pStr2, iTemp1
154 lbu iTemp1, 0(pStr1)
155 lbu iTemp2, 0(pStr2)
156 sub iResult, iTemp1, iTemp2
157 ret
158
159 // iTemp1<0
160 // iTemp2>=0
161L(check2):
162 add pStr1, pStr1, iTemp2
163 add pStr2, pStr2, iTemp2
164 lbu iTemp1, 0(pStr1)
165 lbu iTemp2, 0(pStr2)
166 sub iResult, iTemp1, iTemp2
167 ret
168
Elliott Hughesaefe9992023-11-08 12:04:41 -0800169END(strcmp_v)