/* loongarch_lsx_init.c - LSX optimized filter functions * * Copyright (c) 2021 Loongson Technology Corporation Limited * All rights reserved. * Contributed by Jin Bo * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer * and license in png.h */ #include "../pngpriv.h" #ifdef PNG_READ_SUPPORTED #if PNG_LOONGARCH_LSX_IMPLEMENTATION == 1 #include #define LA_HWCAP_LSX (1<<4) static int png_has_lsx(void) { int flags = 0; int flag = (int)getauxval(AT_HWCAP); if (flag & LA_HWCAP_LSX) return 1; return 0; } void png_init_filter_functions_lsx(png_structp pp, unsigned int bpp) { /* IMPORTANT: any new external functions used here must be declared using * PNG_INTERNAL_FUNCTION in ../pngpriv.h. This is required so that the * 'prefix' option to configure works: * * ./configure --with-libpng-prefix=foobar_ * * Verify you have got this right by running the above command, doing a build * and examining pngprefix.h; it must contain a #define for every external * function you add. (Notice that this happens automatically for the * initialization function.) */ if (png_has_lsx()) { pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_lsx; if (bpp == 3) { pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_lsx; pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_lsx; pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = png_read_filter_row_paeth3_lsx; } else if (bpp == 4) { pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_lsx; pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_lsx; pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = png_read_filter_row_paeth4_lsx; } } } #endif /* PNG_LOONGARCH_LSX_IMPLEMENTATION == 1 */ #endif /* PNG_READ_SUPPORTED */