| // SPDX-License-Identifier: GPL-2.0-or-later |
| /* |
| * LoongArch SIMD XOR operations |
| * |
| * Copyright (C) 2023 WANG Xuerui <git@xen0n.name> |
| */ |
| |
| #include "xor_simd.h" |
| |
| /* |
| * Process one cache line (64 bytes) per loop. This is assuming all future |
| * popular LoongArch cores are similar performance-characteristics-wise to the |
| * current models. |
| */ |
| #define LINE_WIDTH 64 |
| |
| #ifdef CONFIG_CPU_HAS_LSX |
| |
| #define LD(reg, base, offset) \ |
| "vld $vr" #reg ", %[" #base "], " #offset "\n\t" |
| #define ST(reg, base, offset) \ |
| "vst $vr" #reg ", %[" #base "], " #offset "\n\t" |
| #define XOR(dj, k) "vxor.v $vr" #dj ", $vr" #dj ", $vr" #k "\n\t" |
| |
| #define LD_INOUT_LINE(base) \ |
| LD(0, base, 0) \ |
| LD(1, base, 16) \ |
| LD(2, base, 32) \ |
| LD(3, base, 48) |
| |
| #define LD_AND_XOR_LINE(base) \ |
| LD(4, base, 0) \ |
| LD(5, base, 16) \ |
| LD(6, base, 32) \ |
| LD(7, base, 48) \ |
| XOR(0, 4) \ |
| XOR(1, 5) \ |
| XOR(2, 6) \ |
| XOR(3, 7) |
| |
| #define ST_LINE(base) \ |
| ST(0, base, 0) \ |
| ST(1, base, 16) \ |
| ST(2, base, 32) \ |
| ST(3, base, 48) |
| |
| #define XOR_FUNC_NAME(nr) __xor_lsx_##nr |
| #include "xor_template.c" |
| |
| #undef LD |
| #undef ST |
| #undef XOR |
| #undef LD_INOUT_LINE |
| #undef LD_AND_XOR_LINE |
| #undef ST_LINE |
| #undef XOR_FUNC_NAME |
| |
| #endif /* CONFIG_CPU_HAS_LSX */ |
| |
| #ifdef CONFIG_CPU_HAS_LASX |
| |
| #define LD(reg, base, offset) \ |
| "xvld $xr" #reg ", %[" #base "], " #offset "\n\t" |
| #define ST(reg, base, offset) \ |
| "xvst $xr" #reg ", %[" #base "], " #offset "\n\t" |
| #define XOR(dj, k) "xvxor.v $xr" #dj ", $xr" #dj ", $xr" #k "\n\t" |
| |
| #define LD_INOUT_LINE(base) \ |
| LD(0, base, 0) \ |
| LD(1, base, 32) |
| |
| #define LD_AND_XOR_LINE(base) \ |
| LD(2, base, 0) \ |
| LD(3, base, 32) \ |
| XOR(0, 2) \ |
| XOR(1, 3) |
| |
| #define ST_LINE(base) \ |
| ST(0, base, 0) \ |
| ST(1, base, 32) |
| |
| #define XOR_FUNC_NAME(nr) __xor_lasx_##nr |
| #include "xor_template.c" |
| |
| #undef LD |
| #undef ST |
| #undef XOR |
| #undef LD_INOUT_LINE |
| #undef LD_AND_XOR_LINE |
| #undef ST_LINE |
| #undef XOR_FUNC_NAME |
| |
| #endif /* CONFIG_CPU_HAS_LASX */ |