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 */
94

source code of linux/arch/loongarch/lib/xor_simd.c