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