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