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