#include"nn_function_vec.h" #if defined CONFIG_CPU_WL82 && defined CONFIG_ASR_ALGORITHM //========================================================================= // matrix_vector_real_xs8_ys8_zs32 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = sum(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_matrix_ys8_xs8(long *zptr, long *yptr, long *xptr, short len, short loop, short x_inc, short y_inc, short z_inc, char q) //void matrix_vector_real_xs8_ys8_zs32(long *zptr, long*yptr, long*xptr,short len, short loop,short x_inc,short y_inc,short z_inc,char q) { long config = VECZ_S32 | VECY_S8 | VECX_S8 | VEC_ACC | VEC_REAL_MUL_MODE; hwvec_exec(xptr, yptr, zptr, x_inc, y_inc, z_inc, len, loop, q, config, 0); } //========================================================================= // vector_real_zs32_matrix_ys32_xs16 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = sum(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_matrix_ys32_xs16(long *zptr, long *yptr, long *xptr, short len, short loop, short x_inc, short y_inc, short z_inc, char q) //void matrix_vector_real_xs8_ys8_zs32(long *zptr, long*yptr, long*xptr,short len, short loop,short x_inc,short y_inc,short z_inc,char q) { long config = VECZ_S32 | VECY_S32 | VECX_S16 | VEC_ACC | VEC_REAL_MUL_MODE; hwvec_exec(xptr, yptr, zptr, x_inc, y_inc, z_inc, len, loop, q, config, 0); } //========================================================================= // vector_real_zs32_matrix_ys32_xs8 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = sum(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_matrix_ys32_xs8(long *zptr, long *yptr, long *xptr, short len, short loop, short x_inc, short y_inc, short z_inc, char q) //void matrix_vector_real_xs8_ys8_zs32(long *zptr, long*yptr, long*xptr,short len, short loop,short x_inc,short y_inc,short z_inc,char q) { long config = VECZ_S32 | VECY_S32 | VECX_S8 | VEC_ACC | VEC_REAL_MUL_MODE; hwvec_exec(xptr, yptr, zptr, x_inc, y_inc, z_inc, len, loop, q, config, 0); } //========================================================================= // vector_real_zs32_ys32_add_xs32 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated( y[n] + x[n] ) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys32_add_xs32(void *zptr, void *yptr, void *xptr, short len) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_real_add(zptr, yptr, xptr, len, config); } //========================================================================= // vector_real_zs32_ys32_add_xs16 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated( y[n] + x[n] ) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys32_add_xs16(void *zptr, void *yptr, void *xptr, short len) { long config = VECZ_S32 | VECY_S32 | VECX_S16; vector_real_add(zptr, yptr, xptr, len, config); } void vector_real_zs32_ys8_add_dot_product_xs8(void *zptr, void *yptr, void *xptr, short len) { long config = VECZ_S32 | VECY_S8 | VECX_S8; vector_real_add_dot_product(zptr, yptr, xptr, len, config); } //========================================================================= // vector_real_zs32_ys32_sub_xs32 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated( y[n] - x[n] ) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys32_sub_xs32(void *zptr, void *yptr, void *xptr, short len) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_real_sub(zptr, yptr, xptr, len, config); } //========================================================================= // vector_real_zs32_ys32_mul_xs32 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys32_mul_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S32 | VEC_CPY_REAL_OR_VEC; vector_real_mul(zptr, yptr, xptr, len, q, config); } //========================================================================= // vector_real_zs32_ys16_mul_xs16 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys16_mul_xs16(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S16 | VECX_S16 | VEC_CPY_REAL_OR_VEC; vector_real_mul(zptr, yptr, xptr, len, q, config); } //========================================================================= // vector_real_zs32_ys32_mul_xs16 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys32_mul_xs16(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S16 | VEC_CPY_REAL_OR_VEC; vector_real_mul(zptr, yptr, xptr, len, q, config); } //========================================================================= // vector_real_zs32_ys32_mul_xs8 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys32_mul_xs8(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S8 | VEC_CPY_REAL_OR_VEC; vector_real_mul(zptr, yptr, xptr, len, q, config); } //========================================================================= // vector_real_zs32_ys8_mul_xs8 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[3:2] : y_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // y_dw >= z_dw > x_dw // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = saturated(y[n] * x[n] / 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_ys8_mul_xs8(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S8 | VECX_S8 | VEC_CPY_REAL_OR_VEC; vector_real_mul(zptr, yptr, xptr, len, q, config); } void vector_real_zs32_ys32_dot_product_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config; config = VECZ_S32 | VECY_S32 | VECX_S32; vector_real_dot_product(zptr, yptr, xptr, len, q, config); } void vector_real_zs32_ys16_dot_product_xs16(void *zptr, void *yptr, void *xptr, short len, char q) { long config; config = VECZ_S32 | VECY_S16 | VECX_S16; vector_real_dot_product(zptr, yptr, xptr, len, q, config); } //add void vector_real_zs32_ys8_dot_product_xs8(void *zptr, void *yptr, void *xptr, short len, char q) { long config; config = VECZ_S32 | VECY_S8 | VECX_S8; vector_real_dot_product(zptr, yptr, xptr, len, q, config); } void vector_complex_zs32_ys32_add_xs32(void *zptr, void *yptr, void *xptr, short len) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_complex_add(zptr, yptr, xptr, len, config); } void vector_complex_zs32_ys32_sub_xs32(void *zptr, void *yptr, void *xptr, short len) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_complex_sub(zptr, yptr, xptr, len, config); } ///=============================================================== /// complex mul z = y .* x / 2^q ///=============================================================== void vector_complex_zs32_ys8_mul_xs8(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S8 | VECX_S8; vector_complex_mul(zptr, yptr, xptr, len, q, config); } void vector_complex_zs32_ys32_mul_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_complex_mul(zptr, yptr, xptr, len, q, config); } void vector_complex_zs32_ys32_mul_conj_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S32 | VECX_CONJ; vector_complex_mul(zptr, yptr, xptr, len, q, config); } void vector_complex_zs64_ys32_mul_conj_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S64 | VECY_S32 | VECX_S32 | VECX_CONJ; vector_complex_mul(zptr, yptr, xptr, len, q, config); } /////=============================================================== /// complex mac z = z + y*x /2^q /////=============================================================== void vector_complex_zs32_ys32_mac_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_complex_mac32(zptr, yptr, xptr, len, q, config); } ///=============================================================== /// complex mac z = z + y*conj(x)/2^q ///=============================================================== void vector_complex_zs32_ys32_mac_conj_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S32 | VECX_CONJ; vector_complex_mac32(zptr, yptr, xptr, len, q, config); } void vector_complex_zs32_ys32_msc_xs32(void *zptr, void *yptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_complex_msc32(zptr, yptr, xptr, len, q, config); } #endif void vector_real_zs32_x32_qdtsum(long *zptr, long *xptr, short len, char q) { long config = VECZ_S32 | VECX_S32; vector_real_qdtsum(zptr, xptr, len, q, config); } ///=============================================================== /// real mac z =max( x, const) / 2^Q; ///=============================================================== void vector_real_zs32_x32_max_scale(long *zptr, long *xptr, short len, char q, long const_dat) { long config = VECZ_S32 | VECX_S32; vector_real_max(zptr, xptr, len, q, config, const_dat); } void vector_real_zs64_x64_max_scale(long long *xptr, long long max_const, long len) { long long buf64; unsigned long cnt; for (cnt = 0; cnt < len; cnt++) { buf64 = *xptr; if (buf64 < max_const) { *xptr = max_const ; } xptr++; } } ///=============================================================== /// real mac z =min( x, const) / 2^Q; ///=============================================================== void vector_real_zs32_x32_min_scale(long *zptr, long *xptr, short len, char q, long const_dat) { long config = VECZ_S32 | VECX_S32; vector_real_min(zptr, xptr, len, q, config, const_dat); } void vector_real_zs64_x64_min_scale(long long *xptr, long long min_const, long len) { long long buf64; unsigned long cnt; for (cnt = 0; cnt < len; cnt++) { buf64 = *xptr; if (buf64 >= min_const) { *xptr = min_const ; } xptr++; } } ///=============================================================== /// z= z*lamda + (( (1<> q /// z =x + ((z- x)*lamda ) >> q ///=============================================================== void vector_real_smooth_zs64_xs64(long long *zptr, long long *xptr, unsigned long len, char q, long lamda) { long long buf64; unsigned long cnt; for (cnt = 0; cnt < len; cnt++) { buf64 = *xptr++; buf64 = (buf64 + ((*zptr - buf64) * lamda)) >> q; *zptr++ = buf64 ; } } void vector_real_smooth_zs32_xs32(long *zptr, long *xptr, unsigned long len, char q, long lamda) { long config; config = VECZ_S32 | VECY_S32 | VECX_S32; vector_real_zs32_ys32_sub_xs32(zptr, zptr, xptr, len); vector_real_mac_const(zptr, zptr, xptr, len, q, lamda, config); } void vector_complex_smooth_zs32_xs32(long *zptr, long *xptr, unsigned long len, char q, long lamda) { long config; config = VECZ_S32 | VECY_S32 | VECX_S32; vector_real_zs32_ys32_sub_xs32(zptr, zptr, xptr, len * 2); vector_real_mac_const(zptr, zptr, xptr, len * 2, q, lamda, config); } //vector_real_scale_s32 //========================================================================= // vector_real_scale_s32 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = (x[n] * const_dat/ 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_scale_s32(void *zptr, void *xptr, short len, char q, long const_dat) { long config = VECZ_S32 | VECY_S32 | VECX_S32; vector_real_mul_const(zptr, xptr, len, q, const_dat, config); } //========================================================================= // vector_real_zs32_sum_xs32 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // z_dw >= x_dw // -32 < Q < 32 // *zptr, *xptr: s32/s16/s8 // z[n] = sum(x[n]) / 2^q // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_sum_xs32(void *zptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECX_S32; vector_real_sum(zptr, xptr, len, q, config); } //========================================================================= // vector_real_zs32_sum_dot_product_xs32 // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 1: s16 0:s8 // z_dw >= x_dw // -32 < Q < 32 // *zptr, *xptr: s32/s16/s8 // z = sum(x[n]) / 2^q // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //========================================================================= void vector_real_zs32_sum_dot_product_xs32(void *zptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECX_S32; vector_real_sum_dot_product(zptr, xptr, len, q, config); } //========================================================================= // vector_real_zs8_x32_mul_const // dw bit[1:0] : x_dw 2: s32 1: s16 0:s8 // dw bit[5:6] : z_dw 2: s32 // -32 < Q < 32 // *zptr, *yptr, *xptr: s32/s16/s8 // z[n] = (x[n] * const_dat/ 2^q) // 0 <= n < len // z, y, x buf size must be(32bit x n), z_buf can be y_buf or x_buf //== void vector_real_zs8_x32_mul_const(void *zptr, void *xptr, short len, char q, long const_dat) { long config = VECZ_S8 | VECX_S32; vector_real_mul_const(zptr, xptr, len, q, const_dat, config); } //add void vector_real_zs32_x32_mul_const(void *zptr, void *xptr, short len, char q, long const_dat) { long config = VECZ_S32 | VECX_S32; vector_real_mul_const(zptr, xptr, len, q, const_dat, config); } //add void vector_real_zs32_ys32_mac_xs32(void *zptr, void *xptr, short len, char q, long const_dat) { long config; config = VECZ_S32 | VECY_S32 | VECX_S32; vector_real_mac_const(zptr, xptr, zptr, len, q, const_dat, config); } /////=============================================================== ///// complex quadratic z= x^2 / 2^q /////=============================================================== // void vector_complex_zs64_qdt_xs32(void *zptr, void *xptr, short len, char q) { long config = VECZ_S64 | VECX_S32; vector_complex_qdt(zptr, xptr, len, q, config); } void vector_complex_zs32_qdt_xs32(void *zptr, void *xptr, short len, char q) { long config = VECZ_S32 | VECX_S32; vector_complex_qdt(zptr, xptr, len, q, config); } //暂时不用该函数 //===================================== // z[0] = (x[0]^2 + x[1]^2)^0.5 // z[1] = (x[2]^2 + x[3]^2)^0.5 //... // z[n] = (x[2*n]^2 + x[2*n+1]^2)^0.5 // result effective precision : 22bit //===================================== void complex_abs_s32(unsigned long *zptr, long *xptr, unsigned long len) { unsigned long cnt; long long d64; long long s64; long tmp; unsigned char sel; long inv_b = 20376027; for (cnt = 0; cnt < len ; cnt ++) { tmp = *xptr++; s64 = ((long long) * xptr++ << 32) | (long long)((tmp) & 0xffffffff); sel = (0x01 << 2) | (3); __asm__ volatile("%0 = copex(%1) (%2)" : "=r"(d64) : "r"(s64), "i"(sel)); tmp = d64 >> 32; d64 = (long long)tmp * inv_b; __asm__ volatile("%0 = %1>>>25(round)" : "=r"(tmp) : "r"(d64)); //*zptr++ = d64 >>25; *zptr++ = tmp;//d64 >>25; } }