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