⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sl1_basic_op.h

📁 定点除法器程序
💻 H
📖 第 1 页 / 共 5 页
字号:
 *  \return variable(INT32)  *  \note extrb L_var1, pos, width */#define _sl1_extract(L_var1, pos, width) \  SL1_extract(L_var1, pos, width)/*! \def _sl1_extractu(U_var1, pos, width) *  \brief a macro that unsigned extract bits from source GPR to destination GPR <br>           rd = zero_ext(GPR[L_var1][pos:pos-width+1]) *  \param U_var1 source variable(UINT32) *  \param pos unsigned immediate *  \param width unsigned immediate *  \return variable(UINT32) *  \note extrbu U_var1, pos, width */#define _sl1_extractu(U_var1, pos, width) \  SL1_extract_unsigned(U_var1, pos, width)/*! \def _sl1_l_bitr(L_var1, uimm5, mode) *  \brief a macro that To bit operation to a bit of GPR *  \param L_var1 source variable(INT32) *  \param uimm5 unsigned 5 bit immediate *  \param mode see BitMode *  \return variable(INT32) *  \note c3.bitr rd, rs1 imm5, mode */#define _sl1_l_bitr(L_var1, uimm5, mode) \  SL1_L_bitr(L_var1, uimm5, mode)/*! \def _sl1_l_bitr(L_var1, uimm5) *  \brief a macro that do a reverse bits operation of a GPR *  \param L_var1 source variable(INT32) *  \param uimm5 unsigned 5 bit immediate *  \return variable(INT32) *  \note c3.revb rd, rs1, imm5 */#define _sl1_l_revb(L_var1, uimm5) \  SL1_L_revb(L_var1, uimm5)/*! \def _sl1_l_dshl_v_i(L_var1, uimm5_hi, uimm5_lo) *  \brief a macro that do a 16bits dual shift left    *  \param L_var1 source variable to be shift left *  \param uimm5_hi shift high 16 bit of L_var1 left by uimm5_hi *  \param uimm5_lo shift low 16 bit of L_var1 left by uimm5_lo *  \return variable(INT32) *  \note c3.dshll.i rd, L_var1, imm5_hi, imm5_lo */#define _sl1_l_dshl_v_i(L_var1, uimm5_hi, uimm5_lo) \  SL1_dshl_i(L_var1, uimm5_hi, uimm5_lo)/*! \def _sl1_l_dshr_v_i(L_var1, uimm5_hi, uimm5_lo) *  \brief a macro that do a 16bits dual shift right *  \param L_var1 source variable to be shift right *  \param uimm5_hi shift high 16 bit of L_var1 right by uimm5_hi *  \param uimm5_lo shift low 16 bit of L_var1 right by uimm5_lo *  \return variable(INT32) *  \note c3.dshrl.i rd, L_var1, imm5_hi, imm5_lo */#define _sl1_l_dshr_v_i(L_var1, uimm5_hi, uimm5_lo) \  SL1_dshr_i(L_var1, uimm5_hi, uimm5_lo)/*! \def  _sl1_l_mac_v_i(L_acc, var1, imm10, acc_mode) *  \brief a macro that do multiply an immediate and add to accumulator *  \param L_acc variable(INT32), prefer to acquire acc register *  \param var1 variable(INT16) *  \param imm10 signed 10 bit immediate integer *  \param acc_mode see ACC_MODE *  \return variable(INT32) *  \note if L_acc acquired an acc register <br>            c3.mac.i L_acc, acm, rs1, imm10 <br>          else <br>            c3.mvts acc, L_acc, 0  <br>            c3.mac.i acc, acm, rs1, imm10 <br>            c3.mvfs L_acc, acc, 0  <br> */#define _sl1_l_mac_v_i(L_acc, var1, imm10, acc_mode) \  SL1_L_maci(L_acc, acc_mode, var1, imm10)/*! \def _sl1_l_macn_v_i(L_acc, var1, imm10, acc_mode)  *  \brief a macro that do multiply an immediate and sub by accumulator  *  \param L_acc variable(INT32), prefer to acquire acc register *  \param var1 variable(INT16) *  \param imm10 signed 10 bit immediate integer *  \param acc_mode see ACC_MODE *  \return variable(INT32) *  \note if L_acc acquired an acc register <br>            c3.macn.i L_acc, acm, rs1, imm10 <br>          else <br>            c3.mvts acc, L_acc, 0  <br>            c3.macn.i acc, acm, rs1, imm10 <br>            c3.mvfs L_acc, acc, 0  <br> */#define _sl1_l_macn_v_i(L_acc, var1, imm10, acc_mode) \  SL1_L_macni(sum, var1, imm10, acc_mode)/*! \def _sl1_l_mult_shr_v_i(var1, imm10, acc_mode, shr)  *  \brief a macro that do multiply an immediate with different mode and shift right *  \param var1 variable(INT16) *  \param imm10 signed 10 bit immediate integer *  \param acc_mode see ACC_MODE *  \param shr shift the multiply result right by shr *  \return variable(INT32) *  \note   c3.mvts acc, 0, 0  <br>            c3.mula.i acc, var1, imm10, mode <br>            c3.mvfs L_acc, acc, shr <br> */#define _sl1_l_mult_shr_v_i(var1, imm10, acc_mode, shr) \  SL1_L_mula_shr_i(0, var1, imm10, acc_mode, shr)/*! \def  _sl1_l_mult_i_v (L_acc, var1, imm10, acc_mode) *  \brief a macro that do multiply an immediate with different mode  *  \param L_acc variable acquired acc register before *  \param var1 variable(INT16) *  \param imm10 signed 10 bit immediate integer *  \param acc_mode see ACC_MODE *  \return variable(INT32) *  \note if L_acc acquired an acc register <br>    	    c3.mula.i  L_acc, var1,  imm10, mode <br>          else <br>            c3.mvts acc, L_acc, 0  <br>            c3.mula.i acc, var1, imm10, mode <br>            c3.mvfs L_acc, acc, 0 <br> */#define _sl1_l_mult_i_v (L_acc, var1, imm10, acc_mode) \  SL1_L_mula_shr_i(L_acc, var1, imm10, acc_mode, 0)/*! \def _sl1_l_saadd_p(L_p1, am1, L_p2, am2) *  \brief a macro that add signed 32 bits integers loaded from address registers with saturation arithmetic *  \param L_p1 (INT32 *)  *  \param am1 address register mode of L_p1, see AR_MODE *  \param L_p2 (INT32 *) *  \param am2 address register mode of L_p2, see AR_MODE *  \return variable(INT32) *  \note if L_p1 and L_p2 acquired address registers <br>             c3.saadd.a rd, as1, am1, as2, am2, bsel <br>          else <br>            c3.mvts ar1, L_p1, 0 <br>            c3.mvts ar2, L_p2, 0 <br>            c3.saadd.a rd, ar1, am1, ar2, am2, bsel <br>            c3.mvfs L_p1, ar1, 0            c3.mvfs L_p2, ar2, 0 */#define _sl1_l_saadd_p(L_p1, am1, L_p2, am2) \  SL1_L_saadd_p(L_p1, am2, L_p2, am2, 0)/*! \def _sl1_l_sasub_p(L_p1, ar1_mode, L_p2, ar2_mode) *  \brief a macro that substract two signed 32 bits integers loaded from address registers with saturation arithmetic *  \param L_p1 (INT32 *) *  \param ar1_mode address register mode of L_p1, see AR_MODE *  \param L_p2 (INT32 *) *  \param ar2_mode address register mode of L_p2, see AR_MODE *  \return variable(INT32) *  \note if L_p1 and L_p2 acquired address registers <br>            c3.sasub.a rd, as1, am1, as2, am2, bsel <br>          else <br>            c3.mvts ar1, L_p1, 0 <br>            c3.mvts ar2, L_p2, 0 <br>            c3.sasub.a rd, ar1, am1, ar2, am2, bsel <br>            c3.mvfs L_p1, ar1, 0            c3.mvfs L_p2, ar2, 0 */#define _sl1_l_sasub_p(L_p1, ar1_mode, L_p2, ar2_mode) \  SL1_L_sasub_p(L_p1, ar1_mode, L_p2, ar2_mode, 0)/*! \def  _sl1_l_shl_add(L_acc, var1, imm4, acc_mode) *  \brief a macro that shift var1 by imm4 and add the result to an accumulator *  \param L_acc variable prefer to acquire an acc register *  \param var1 variable(INT16) *  \param imm4 unsigned 4 bit integer *  \param acc_mode see ACC_MODE *  \return variable(INT32) *  \note if L_acc acquired an acc register <br>            c3.saddha L_acc, acm, rs1, imm4, 1 <br>          else <br>            c3.mvts acc, L_acc, 0 <br>            c3.saddha acc, acm, rs1, imm4, 1 <br>             c3.mvfs L_acc, acc, 0 <br> */#define _sl1_l_shl_add(L_acc, var1, imm4, acc_mode) \  SL1_L_shl_add(L_acc, acc_mode, var1, imm4, 0)/*! \def  _sl1_l_shl_sub(L_acc, var1, imm4, acc_mode) *  \brief a macro that shift var1 by imm4 and sub to an accumulator *  \param L_acc variable prefer to acquire an acc register *  \param var1 variable(INT16) *  \param imm4 unsigned 4 bit integer *  \param acc_mode see ACC_MODE *  \return variable(INT32) *  \note see _sl1_l_shl_add */#define _sl1_l_shl_sub(L_acc, var1, imm4, acc_mode) \  SL1_L_shl_add(L_acc, acc_mode, var1, imm4, 1)/*! \def  _sl1_l_shl_add_p(L_acc, p1, am1, imm4, acc_mode)   *  \brief a macro that shift the value loaded from p1 by imm4 and add the result to an accumulator *  \param L_acc variable prefer to acquire an acc register *  \param p1 variable prefer to acquire an address register *  \param am1 see AR_MODE *  \param imm4 unsigned 4 bit integer *  \param acc_mode see ACC_MODE *  \return variable(INT32) *  \note if L_acc acquired an acc register <br>             c3.saddha.a L_acc, acm, as1, am1, imm4, 0, bsel <br>          else <br>            c3.mvts acc, L_acc, 0            c3.saddha.a acc, acm, as1, am1, imm4, 0, bsel <br>            c3.mvfs L_acc, acc, 0 */#define _sl1_l_shl_add_p(L_acc, p1, am1, imm4, acc_mode) \  SL1_L_shl_add_p(L_acc, acc_mode, p1, am1, imm4, 0, 0)/*! \def  _sl1_l_shl_sub_p(L_acc, p1, am1, imm4, acc_mode) *  \brief a macro that shift the value loaded from p1 by imm4 and sub to an accumulator *  \param L_acc variable prefer to acquire an acc register *  \param p1 variable prefer to acquire an address register *  \param am1 see AR_MODE *  \param imm4 unsigned 4 bit integer *  \param acc_mode see ACC_MODE *  \return variable(INT32) *  \note see _sl1_l_shl_add_p */#define _sl1_l_shl_sub_p(L_acc, p1, am1, imm4, acc_mode) \  SL1_L_shl_add_p(L_acc, acc_mode, p1, am1, imm4, 1, 0)#ifdef _INLINE/*! \fn INT16 _sl1_extract_hi (INT32 L_var1) *  \brief a function that extract high 16 bit of L_var1 *  \param L_var1 a INT32 variable *  \return high 16 bit of L_var1  */_STATIC _INLINE INT16 _sl1_extract_hi (INT32  L_var1){  Is_True(MIN_32 <= L_var1 <= MAX_32, ("var1 is out of range"));  INT16  var_out = (INT16 ) (L_var1 >> 16);  return (var_out);}/*! \fn INT16 _sl1_extract_lo (INT32 L_var1) *  \brief a function that extract low 16 bit of L_var1 *  \param L_var1 a INT32 variable *  \return low 16 bit of L_var1 */_STATIC _INLINE INT16  _sl1_extract_lo (INT32  L_var1){  Is_True(MIN_32 <= L_var1 <= MAX_32, ("L_var1 is out of range"));  return (INT16)L_var1;}/*! \fn INT16 _sl1_sadd (INT16 var1, INT16 var2) *  \brief a function that add two 16 bit variable, and produce a saturated 16 bit result *  \param var1 a INT16 variable *  \param var2 a INT16 variable *  \return saturated INT16 result */_STATIC _INLINE INT16  _sl1_sadd (INT16  var1, INT16  var2) {  Is_True(MIN_16 <= var1 <= MAX_16, ("var1 is out of range"));	  Is_True(MIN_16 <= var2 <= MAX_16, ("var2 is out of range"));  INT16  var_out;#ifdef NO_TARG_SL  INT32  L_temp;  L_temp = (INT32 ) var1 + var2;  L_temp  = ((L_temp > MAX_16) ? MAX_16 : L_temp);  var_out = ((L_temp < MIN_16) ? MIN_16 : L_temp);  #else    var_out = _sl1_sadd_shl(var1,var2, 0);#endif   return var_out;}/*! \fn INT16  _sl1_ssub (INT16  var1, INT16  var2) *  \brief a function that subtract var2 from var1, and produce a saturated 16 bit result *  \param var1 a INT16 variable *  \param var2 a INT16 variable *  \return saturated INT16 result */_STATIC _INLINE INT16  _sl1_ssub (INT16  var1, INT16  var2){  Is_True(MIN_16 <= var1 <= MAX_16, ("var1 is out of range"));  Is_True(MIN_16 <= var2 <= MAX_16, ("var2 is out of range"));  INT16  var_out;#ifdef NO_TARG_SL  INT32  L_diff;  L_diff = (INT32 ) var1 - var2;  L_diff = ((L_diff > MAX_16) ? MAX_16: L_diff);  var_out = ((L_diff < MIN_16) ? MIN_16: L_diff);#else  var_out = _sl1_ssub_shl(var1,var2, 0);#endif  return var_out;}/*! \fn INT16 _sl1_sabs (INT16  var1)  *  \brief a function that create a saturated 16 bit absolute value *  \param var1 a INT16 variable *  \return a saturated INT16 absolute value  */_STATIC _INLINE INT16 _sl1_sabs (INT16 var1){  Is_True(MIN_16 <= var1 <= MAX_16, ("var1 is out of range"));  INT16  var_out = (var1 > 0) ?  var1 : (-var1);  var_out = (var_out < 0) ? MAX_16 : var_out;  return(var_out);}        /*! \fn INT16 _sl1_snegate (INT16 var1) *  \brief a function that negate the 16 bit variable, and saturate the result in the case of "var1==MIN_16" *  \param var1 a INT16 variable *  \return a saturated INT16 negative value */_STATIC _INLINE INT16  _sl1_snegate (INT16  var1){  Is_True(MIN_16 <= var1 <= MAX_16, ("var1 is out of range"));  INT16  var_out;  var_out = (var1 == MIN_16) ? MAX_16 : (-var1);  return(var_out);}/*! \fn INT16 _sl1_sshl(INT16  var1, INT16  var2) *  \brief a function that shift var1 left by var2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -