xref: /linux/lib/raid/xor/riscv/xor.S (revision 440d6635b20037bc9ad46b20817d7b61cef0fc1b)
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
9SYM_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
20SYM_FUNC_END(xor_regs_2_)
21
22SYM_FUNC_START(xor_regs_3_)
23	vsetvli a4, a0, e8, m8, ta, ma
24	vle8.v v0, (a1)
25	vle8.v v8, (a2)
26	sub a0, a0, a4
27	vxor.vv v0, v0, v8
28	vle8.v v16, (a3)
29	add a2, a2, a4
30	vxor.vv v16, v0, v16
31	add a3, a3, a4
32	vse8.v v16, (a1)
33	add a1, a1, a4
34	bnez a0, xor_regs_3_
35	ret
36SYM_FUNC_END(xor_regs_3_)
37
38SYM_FUNC_START(xor_regs_4_)
39	vsetvli a5, a0, e8, m8, ta, ma
40	vle8.v v0, (a1)
41	vle8.v v8, (a2)
42	sub a0, a0, a5
43	vxor.vv v0, v0, v8
44	vle8.v v16, (a3)
45	add a2, a2, a5
46	vxor.vv v0, v0, v16
47	vle8.v v24, (a4)
48	add a3, a3, a5
49	vxor.vv v16, v0, v24
50	add a4, a4, a5
51	vse8.v v16, (a1)
52	add a1, a1, a5
53	bnez a0, xor_regs_4_
54	ret
55SYM_FUNC_END(xor_regs_4_)
56
57SYM_FUNC_START(xor_regs_5_)
58	vsetvli a6, a0, e8, m8, ta, ma
59	vle8.v v0, (a1)
60	vle8.v v8, (a2)
61	sub a0, a0, a6
62	vxor.vv v0, v0, v8
63	vle8.v v16, (a3)
64	add a2, a2, a6
65	vxor.vv v0, v0, v16
66	vle8.v v24, (a4)
67	add a3, a3, a6
68	vxor.vv v0, v0, v24
69	vle8.v v8, (a5)
70	add a4, a4, a6
71	vxor.vv v16, v0, v8
72	add a5, a5, a6
73	vse8.v v16, (a1)
74	add a1, a1, a6
75	bnez a0, xor_regs_5_
76	ret
77SYM_FUNC_END(xor_regs_5_)
78