GNU Linux-libre 6.9.1-gnu
[releases.git] / arch / riscv / lib / xor.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (C) 2021 SiFive
4  */
5 #include <linux/linkage.h>
6 #include <linux/export.h>
7 #include <asm/asm.h>
8
9 SYM_FUNC_START(xor_regs_2_)
10         vsetvli a3, a0, e8, m8, ta, ma
11         vle8.v v0, (a1)
12         vle8.v v8, (a2)
13         sub a0, a0, a3
14         vxor.vv v16, v0, v8
15         add a2, a2, a3
16         vse8.v v16, (a1)
17         add a1, a1, a3
18         bnez a0, xor_regs_2_
19         ret
20 SYM_FUNC_END(xor_regs_2_)
21 EXPORT_SYMBOL(xor_regs_2_)
22
23 SYM_FUNC_START(xor_regs_3_)
24         vsetvli a4, a0, e8, m8, ta, ma
25         vle8.v v0, (a1)
26         vle8.v v8, (a2)
27         sub a0, a0, a4
28         vxor.vv v0, v0, v8
29         vle8.v v16, (a3)
30         add a2, a2, a4
31         vxor.vv v16, v0, v16
32         add a3, a3, a4
33         vse8.v v16, (a1)
34         add a1, a1, a4
35         bnez a0, xor_regs_3_
36         ret
37 SYM_FUNC_END(xor_regs_3_)
38 EXPORT_SYMBOL(xor_regs_3_)
39
40 SYM_FUNC_START(xor_regs_4_)
41         vsetvli a5, a0, e8, m8, ta, ma
42         vle8.v v0, (a1)
43         vle8.v v8, (a2)
44         sub a0, a0, a5
45         vxor.vv v0, v0, v8
46         vle8.v v16, (a3)
47         add a2, a2, a5
48         vxor.vv v0, v0, v16
49         vle8.v v24, (a4)
50         add a3, a3, a5
51         vxor.vv v16, v0, v24
52         add a4, a4, a5
53         vse8.v v16, (a1)
54         add a1, a1, a5
55         bnez a0, xor_regs_4_
56         ret
57 SYM_FUNC_END(xor_regs_4_)
58 EXPORT_SYMBOL(xor_regs_4_)
59
60 SYM_FUNC_START(xor_regs_5_)
61         vsetvli a6, a0, e8, m8, ta, ma
62         vle8.v v0, (a1)
63         vle8.v v8, (a2)
64         sub a0, a0, a6
65         vxor.vv v0, v0, v8
66         vle8.v v16, (a3)
67         add a2, a2, a6
68         vxor.vv v0, v0, v16
69         vle8.v v24, (a4)
70         add a3, a3, a6
71         vxor.vv v0, v0, v24
72         vle8.v v8, (a5)
73         add a4, a4, a6
74         vxor.vv v16, v0, v8
75         add a5, a5, a6
76         vse8.v v16, (a1)
77         add a1, a1, a6
78         bnez a0, xor_regs_5_
79         ret
80 SYM_FUNC_END(xor_regs_5_)
81 EXPORT_SYMBOL(xor_regs_5_)