xref: /linux/arch/loongarch/lib/xor_simd_glue.c (revision 03c11eb3b16dc0058589751dfd91f254be2be613)
1*75ded18aSWANG Xuerui // SPDX-License-Identifier: GPL-2.0-or-later
2*75ded18aSWANG Xuerui /*
3*75ded18aSWANG Xuerui  * LoongArch SIMD XOR operations
4*75ded18aSWANG Xuerui  *
5*75ded18aSWANG Xuerui  * Copyright (C) 2023 WANG Xuerui <git@xen0n.name>
6*75ded18aSWANG Xuerui  */
7*75ded18aSWANG Xuerui 
8*75ded18aSWANG Xuerui #include <linux/export.h>
9*75ded18aSWANG Xuerui #include <linux/sched.h>
10*75ded18aSWANG Xuerui #include <asm/fpu.h>
11*75ded18aSWANG Xuerui #include <asm/xor_simd.h>
12*75ded18aSWANG Xuerui #include "xor_simd.h"
13*75ded18aSWANG Xuerui 
14*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_2(flavor)							\
15*75ded18aSWANG Xuerui void xor_##flavor##_2(unsigned long bytes, unsigned long * __restrict p1,	\
16*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p2)			\
17*75ded18aSWANG Xuerui {										\
18*75ded18aSWANG Xuerui 	kernel_fpu_begin();							\
19*75ded18aSWANG Xuerui 	__xor_##flavor##_2(bytes, p1, p2);					\
20*75ded18aSWANG Xuerui 	kernel_fpu_end();							\
21*75ded18aSWANG Xuerui }										\
22*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_2)
23*75ded18aSWANG Xuerui 
24*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_3(flavor)							\
25*75ded18aSWANG Xuerui void xor_##flavor##_3(unsigned long bytes, unsigned long * __restrict p1,	\
26*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p2,			\
27*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p3)			\
28*75ded18aSWANG Xuerui {										\
29*75ded18aSWANG Xuerui 	kernel_fpu_begin();							\
30*75ded18aSWANG Xuerui 	__xor_##flavor##_3(bytes, p1, p2, p3);					\
31*75ded18aSWANG Xuerui 	kernel_fpu_end();							\
32*75ded18aSWANG Xuerui }										\
33*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_3)
34*75ded18aSWANG Xuerui 
35*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_4(flavor)							\
36*75ded18aSWANG Xuerui void xor_##flavor##_4(unsigned long bytes, unsigned long * __restrict p1,	\
37*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p2,			\
38*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p3,			\
39*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p4)			\
40*75ded18aSWANG Xuerui {										\
41*75ded18aSWANG Xuerui 	kernel_fpu_begin();							\
42*75ded18aSWANG Xuerui 	__xor_##flavor##_4(bytes, p1, p2, p3, p4);				\
43*75ded18aSWANG Xuerui 	kernel_fpu_end();							\
44*75ded18aSWANG Xuerui }										\
45*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_4)
46*75ded18aSWANG Xuerui 
47*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_5(flavor)							\
48*75ded18aSWANG Xuerui void xor_##flavor##_5(unsigned long bytes, unsigned long * __restrict p1,	\
49*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p2,			\
50*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p3,			\
51*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p4,			\
52*75ded18aSWANG Xuerui 		      const unsigned long * __restrict p5)			\
53*75ded18aSWANG Xuerui {										\
54*75ded18aSWANG Xuerui 	kernel_fpu_begin();							\
55*75ded18aSWANG Xuerui 	__xor_##flavor##_5(bytes, p1, p2, p3, p4, p5);				\
56*75ded18aSWANG Xuerui 	kernel_fpu_end();							\
57*75ded18aSWANG Xuerui }										\
58*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_5)
59*75ded18aSWANG Xuerui 
60*75ded18aSWANG Xuerui #define MAKE_XOR_GLUES(flavor)		\
61*75ded18aSWANG Xuerui 	MAKE_XOR_GLUE_2(flavor);	\
62*75ded18aSWANG Xuerui 	MAKE_XOR_GLUE_3(flavor);	\
63*75ded18aSWANG Xuerui 	MAKE_XOR_GLUE_4(flavor);	\
64*75ded18aSWANG Xuerui 	MAKE_XOR_GLUE_5(flavor)
65*75ded18aSWANG Xuerui 
66*75ded18aSWANG Xuerui #ifdef CONFIG_CPU_HAS_LSX
67*75ded18aSWANG Xuerui MAKE_XOR_GLUES(lsx);
68*75ded18aSWANG Xuerui #endif
69*75ded18aSWANG Xuerui 
70*75ded18aSWANG Xuerui #ifdef CONFIG_CPU_HAS_LASX
71*75ded18aSWANG Xuerui MAKE_XOR_GLUES(lasx);
72*75ded18aSWANG Xuerui #endif
73