1*75ded18aSWANG Xuerui // SPDX-License-Identifier: GPL-2.0-or-later 2*75ded18aSWANG Xuerui /* 3*75ded18aSWANG Xuerui * LoongArch SIMD XOR operations 4*75ded18aSWANG Xuerui * 5*75ded18aSWANG Xuerui * Copyright (C) 2023 WANG Xuerui <git@xen0n.name> 6*75ded18aSWANG Xuerui */ 7*75ded18aSWANG Xuerui 8*75ded18aSWANG Xuerui #include <linux/export.h> 9*75ded18aSWANG Xuerui #include <linux/sched.h> 10*75ded18aSWANG Xuerui #include <asm/fpu.h> 11*75ded18aSWANG Xuerui #include <asm/xor_simd.h> 12*75ded18aSWANG Xuerui #include "xor_simd.h" 13*75ded18aSWANG Xuerui 14*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_2(flavor) \ 15*75ded18aSWANG Xuerui void xor_##flavor##_2(unsigned long bytes, unsigned long * __restrict p1, \ 16*75ded18aSWANG Xuerui const unsigned long * __restrict p2) \ 17*75ded18aSWANG Xuerui { \ 18*75ded18aSWANG Xuerui kernel_fpu_begin(); \ 19*75ded18aSWANG Xuerui __xor_##flavor##_2(bytes, p1, p2); \ 20*75ded18aSWANG Xuerui kernel_fpu_end(); \ 21*75ded18aSWANG Xuerui } \ 22*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_2) 23*75ded18aSWANG Xuerui 24*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_3(flavor) \ 25*75ded18aSWANG Xuerui void xor_##flavor##_3(unsigned long bytes, unsigned long * __restrict p1, \ 26*75ded18aSWANG Xuerui const unsigned long * __restrict p2, \ 27*75ded18aSWANG Xuerui const unsigned long * __restrict p3) \ 28*75ded18aSWANG Xuerui { \ 29*75ded18aSWANG Xuerui kernel_fpu_begin(); \ 30*75ded18aSWANG Xuerui __xor_##flavor##_3(bytes, p1, p2, p3); \ 31*75ded18aSWANG Xuerui kernel_fpu_end(); \ 32*75ded18aSWANG Xuerui } \ 33*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_3) 34*75ded18aSWANG Xuerui 35*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_4(flavor) \ 36*75ded18aSWANG Xuerui void xor_##flavor##_4(unsigned long bytes, unsigned long * __restrict p1, \ 37*75ded18aSWANG Xuerui const unsigned long * __restrict p2, \ 38*75ded18aSWANG Xuerui const unsigned long * __restrict p3, \ 39*75ded18aSWANG Xuerui const unsigned long * __restrict p4) \ 40*75ded18aSWANG Xuerui { \ 41*75ded18aSWANG Xuerui kernel_fpu_begin(); \ 42*75ded18aSWANG Xuerui __xor_##flavor##_4(bytes, p1, p2, p3, p4); \ 43*75ded18aSWANG Xuerui kernel_fpu_end(); \ 44*75ded18aSWANG Xuerui } \ 45*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_4) 46*75ded18aSWANG Xuerui 47*75ded18aSWANG Xuerui #define MAKE_XOR_GLUE_5(flavor) \ 48*75ded18aSWANG Xuerui void xor_##flavor##_5(unsigned long bytes, unsigned long * __restrict p1, \ 49*75ded18aSWANG Xuerui const unsigned long * __restrict p2, \ 50*75ded18aSWANG Xuerui const unsigned long * __restrict p3, \ 51*75ded18aSWANG Xuerui const unsigned long * __restrict p4, \ 52*75ded18aSWANG Xuerui const unsigned long * __restrict p5) \ 53*75ded18aSWANG Xuerui { \ 54*75ded18aSWANG Xuerui kernel_fpu_begin(); \ 55*75ded18aSWANG Xuerui __xor_##flavor##_5(bytes, p1, p2, p3, p4, p5); \ 56*75ded18aSWANG Xuerui kernel_fpu_end(); \ 57*75ded18aSWANG Xuerui } \ 58*75ded18aSWANG Xuerui EXPORT_SYMBOL_GPL(xor_##flavor##_5) 59*75ded18aSWANG Xuerui 60*75ded18aSWANG Xuerui #define MAKE_XOR_GLUES(flavor) \ 61*75ded18aSWANG Xuerui MAKE_XOR_GLUE_2(flavor); \ 62*75ded18aSWANG Xuerui MAKE_XOR_GLUE_3(flavor); \ 63*75ded18aSWANG Xuerui MAKE_XOR_GLUE_4(flavor); \ 64*75ded18aSWANG Xuerui MAKE_XOR_GLUE_5(flavor) 65*75ded18aSWANG Xuerui 66*75ded18aSWANG Xuerui #ifdef CONFIG_CPU_HAS_LSX 67*75ded18aSWANG Xuerui MAKE_XOR_GLUES(lsx); 68*75ded18aSWANG Xuerui #endif 69*75ded18aSWANG Xuerui 70*75ded18aSWANG Xuerui #ifdef CONFIG_CPU_HAS_LASX 71*75ded18aSWANG Xuerui MAKE_XOR_GLUES(lasx); 72*75ded18aSWANG Xuerui #endif 73