xref: /linux/lib/raid/xor/loongarch/xor_simd.c (revision 440d6635b20037bc9ad46b20817d7b61cef0fc1b)
1*033bee3eSChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-or-later
2*033bee3eSChristoph Hellwig /*
3*033bee3eSChristoph Hellwig  * LoongArch SIMD XOR operations
4*033bee3eSChristoph Hellwig  *
5*033bee3eSChristoph Hellwig  * Copyright (C) 2023 WANG Xuerui <git@xen0n.name>
6*033bee3eSChristoph Hellwig  */
7*033bee3eSChristoph Hellwig 
8*033bee3eSChristoph Hellwig #include "xor_simd.h"
9*033bee3eSChristoph Hellwig 
10*033bee3eSChristoph Hellwig /*
11*033bee3eSChristoph Hellwig  * Process one cache line (64 bytes) per loop. This is assuming all future
12*033bee3eSChristoph Hellwig  * popular LoongArch cores are similar performance-characteristics-wise to the
13*033bee3eSChristoph Hellwig  * current models.
14*033bee3eSChristoph Hellwig  */
15*033bee3eSChristoph Hellwig #define LINE_WIDTH 64
16*033bee3eSChristoph Hellwig 
17*033bee3eSChristoph Hellwig #ifdef CONFIG_CPU_HAS_LSX
18*033bee3eSChristoph Hellwig 
19*033bee3eSChristoph Hellwig #define LD(reg, base, offset)	\
20*033bee3eSChristoph Hellwig 	"vld $vr" #reg ", %[" #base "], " #offset "\n\t"
21*033bee3eSChristoph Hellwig #define ST(reg, base, offset)	\
22*033bee3eSChristoph Hellwig 	"vst $vr" #reg ", %[" #base "], " #offset "\n\t"
23*033bee3eSChristoph Hellwig #define XOR(dj, k)	"vxor.v $vr" #dj ", $vr" #dj ", $vr" #k "\n\t"
24*033bee3eSChristoph Hellwig 
25*033bee3eSChristoph Hellwig #define LD_INOUT_LINE(base)	\
26*033bee3eSChristoph Hellwig 	LD(0, base, 0)		\
27*033bee3eSChristoph Hellwig 	LD(1, base, 16)		\
28*033bee3eSChristoph Hellwig 	LD(2, base, 32)		\
29*033bee3eSChristoph Hellwig 	LD(3, base, 48)
30*033bee3eSChristoph Hellwig 
31*033bee3eSChristoph Hellwig #define LD_AND_XOR_LINE(base)	\
32*033bee3eSChristoph Hellwig 	LD(4, base, 0)		\
33*033bee3eSChristoph Hellwig 	LD(5, base, 16)		\
34*033bee3eSChristoph Hellwig 	LD(6, base, 32)		\
35*033bee3eSChristoph Hellwig 	LD(7, base, 48)		\
36*033bee3eSChristoph Hellwig 	XOR(0, 4)		\
37*033bee3eSChristoph Hellwig 	XOR(1, 5)		\
38*033bee3eSChristoph Hellwig 	XOR(2, 6)		\
39*033bee3eSChristoph Hellwig 	XOR(3, 7)
40*033bee3eSChristoph Hellwig 
41*033bee3eSChristoph Hellwig #define ST_LINE(base)		\
42*033bee3eSChristoph Hellwig 	ST(0, base, 0)		\
43*033bee3eSChristoph Hellwig 	ST(1, base, 16)		\
44*033bee3eSChristoph Hellwig 	ST(2, base, 32)		\
45*033bee3eSChristoph Hellwig 	ST(3, base, 48)
46*033bee3eSChristoph Hellwig 
47*033bee3eSChristoph Hellwig #define XOR_FUNC_NAME(nr) __xor_lsx_##nr
48*033bee3eSChristoph Hellwig #include "xor_template.c"
49*033bee3eSChristoph Hellwig 
50*033bee3eSChristoph Hellwig #undef LD
51*033bee3eSChristoph Hellwig #undef ST
52*033bee3eSChristoph Hellwig #undef XOR
53*033bee3eSChristoph Hellwig #undef LD_INOUT_LINE
54*033bee3eSChristoph Hellwig #undef LD_AND_XOR_LINE
55*033bee3eSChristoph Hellwig #undef ST_LINE
56*033bee3eSChristoph Hellwig #undef XOR_FUNC_NAME
57*033bee3eSChristoph Hellwig 
58*033bee3eSChristoph Hellwig #endif /* CONFIG_CPU_HAS_LSX */
59*033bee3eSChristoph Hellwig 
60*033bee3eSChristoph Hellwig #ifdef CONFIG_CPU_HAS_LASX
61*033bee3eSChristoph Hellwig 
62*033bee3eSChristoph Hellwig #define LD(reg, base, offset)	\
63*033bee3eSChristoph Hellwig 	"xvld $xr" #reg ", %[" #base "], " #offset "\n\t"
64*033bee3eSChristoph Hellwig #define ST(reg, base, offset)	\
65*033bee3eSChristoph Hellwig 	"xvst $xr" #reg ", %[" #base "], " #offset "\n\t"
66*033bee3eSChristoph Hellwig #define XOR(dj, k)	"xvxor.v $xr" #dj ", $xr" #dj ", $xr" #k "\n\t"
67*033bee3eSChristoph Hellwig 
68*033bee3eSChristoph Hellwig #define LD_INOUT_LINE(base)	\
69*033bee3eSChristoph Hellwig 	LD(0, base, 0)		\
70*033bee3eSChristoph Hellwig 	LD(1, base, 32)
71*033bee3eSChristoph Hellwig 
72*033bee3eSChristoph Hellwig #define LD_AND_XOR_LINE(base)	\
73*033bee3eSChristoph Hellwig 	LD(2, base, 0)		\
74*033bee3eSChristoph Hellwig 	LD(3, base, 32)		\
75*033bee3eSChristoph Hellwig 	XOR(0, 2)		\
76*033bee3eSChristoph Hellwig 	XOR(1, 3)
77*033bee3eSChristoph Hellwig 
78*033bee3eSChristoph Hellwig #define ST_LINE(base)		\
79*033bee3eSChristoph Hellwig 	ST(0, base, 0)		\
80*033bee3eSChristoph Hellwig 	ST(1, base, 32)
81*033bee3eSChristoph Hellwig 
82*033bee3eSChristoph Hellwig #define XOR_FUNC_NAME(nr) __xor_lasx_##nr
83*033bee3eSChristoph Hellwig #include "xor_template.c"
84*033bee3eSChristoph Hellwig 
85*033bee3eSChristoph Hellwig #undef LD
86*033bee3eSChristoph Hellwig #undef ST
87*033bee3eSChristoph Hellwig #undef XOR
88*033bee3eSChristoph Hellwig #undef LD_INOUT_LINE
89*033bee3eSChristoph Hellwig #undef LD_AND_XOR_LINE
90*033bee3eSChristoph Hellwig #undef ST_LINE
91*033bee3eSChristoph Hellwig #undef XOR_FUNC_NAME
92*033bee3eSChristoph Hellwig 
93*033bee3eSChristoph Hellwig #endif /* CONFIG_CPU_HAS_LASX */
94