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