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