diff options
author | eopXD <yueh.ting.chen@gmail.com> | 2021-11-28 16:13:54 +0800 |
---|---|---|
committer | eopXD <yueh.ting.chen@gmail.com> | 2021-11-28 16:14:01 +0800 |
commit | d177f05b7bd01f25a16e8cc0712fa551bdaeb954 (patch) | |
tree | a51cd7fae50884c0c24c51386cda720bd26ce017 /riscv/decode.h | |
parent | ab7521de6a76be7fc57665998679a7f6ecfafcb9 (diff) | |
download | spike-d177f05b7bd01f25a16e8cc0712fa551bdaeb954.zip spike-d177f05b7bd01f25a16e8cc0712fa551bdaeb954.tar.gz spike-d177f05b7bd01f25a16e8cc0712fa551bdaeb954.tar.bz2 |
Have nclip_{wv/wx/wi} use different macros
This allows them to share PARAM macro with narrowing right-shift instructions.
Rename VV_NSHIFT_PARAMS -> VV_NARROW_PARAMS so nclip, nsra, nsrl can share it.
(Same goes to VX_NSHIFT_PARAMS and VI_NSHIFT_PARAMS)
Diffstat (limited to 'riscv/decode.h')
-rw-r--r-- | riscv/decode.h | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/riscv/decode.h b/riscv/decode.h index e709bb4..3487ec6 100644 --- a/riscv/decode.h +++ b/riscv/decode.h @@ -769,19 +769,19 @@ static inline bool is_aligned(const unsigned val, const unsigned pos) auto &vd = P.VU.elt<type_sew_t<x>::type>(rd_num, i, true); \ auto vs2 = P.VU.elt<type_sew_t<x>::type>(rs2_num, i - offset); -#define VI_NSHIFT_PARAMS(sew1, sew2) \ +#define VI_NARROW_PARAMS(sew1, sew2) \ auto &vd = P.VU.elt<type_usew_t<sew1>::type>(rd_num, i, true); \ auto vs2_u = P.VU.elt<type_usew_t<sew2>::type>(rs2_num, i); \ auto vs2 = P.VU.elt<type_sew_t<sew2>::type>(rs2_num, i); \ auto zimm5 = (type_usew_t<sew1>::type)insn.v_zimm5(); -#define VX_NSHIFT_PARAMS(sew1, sew2) \ +#define VX_NARROW_PARAMS(sew1, sew2) \ auto &vd = P.VU.elt<type_usew_t<sew1>::type>(rd_num, i, true); \ auto vs2_u = P.VU.elt<type_usew_t<sew2>::type>(rs2_num, i); \ auto vs2 = P.VU.elt<type_sew_t<sew2>::type>(rs2_num, i); \ auto rs1 = (type_sew_t<sew1>::type)RS1; -#define VV_NSHIFT_PARAMS(sew1, sew2) \ +#define VV_NARROW_PARAMS(sew1, sew2) \ auto &vd = P.VU.elt<type_usew_t<sew1>::type>(rd_num, i, true); \ auto vs2_u = P.VU.elt<type_usew_t<sew2>::type>(rs2_num, i); \ auto vs2 = P.VU.elt<type_sew_t<sew2>::type>(rs2_num, i); \ @@ -1114,39 +1114,46 @@ static inline bool is_aligned(const unsigned val, const unsigned pos) // narrow operation loop #define VI_VV_LOOP_NARROW(BODY) \ -VI_NARROW_CHECK_COMMON; \ -VI_LOOP_BASE \ -if (sew == e8){ \ - VI_NARROW_SHIFT(e8, e16) \ - BODY; \ -}else if(sew == e16){ \ - VI_NARROW_SHIFT(e16, e32) \ - BODY; \ -}else if(sew == e32){ \ - VI_NARROW_SHIFT(e32, e64) \ - BODY; \ -} \ -VI_LOOP_END - -#define VI_NARROW_SHIFT(sew1, sew2) \ - type_usew_t<sew1>::type &vd = P.VU.elt<type_usew_t<sew1>::type>(rd_num, i, true); \ - type_usew_t<sew2>::type vs2_u = P.VU.elt<type_usew_t<sew2>::type>(rs2_num, i); \ - type_usew_t<sew1>::type zimm5 = (type_usew_t<sew1>::type)insn.v_zimm5(); \ - type_sew_t<sew2>::type vs2 = P.VU.elt<type_sew_t<sew2>::type>(rs2_num, i); \ - type_sew_t<sew1>::type vs1 = P.VU.elt<type_sew_t<sew1>::type>(rs1_num, i); \ - type_sew_t<sew1>::type rs1 = (type_sew_t<sew1>::type)RS1; - -#define VI_VVXI_LOOP_NARROW(BODY, is_vs1) \ - VI_CHECK_SDS(is_vs1); \ + VI_CHECK_SDS(true); \ VI_LOOP_BASE \ if (sew == e8){ \ - VI_NARROW_SHIFT(e8, e16) \ + VV_NARROW_PARAMS(e8, e16) \ BODY; \ - } else if (sew == e16) { \ - VI_NARROW_SHIFT(e16, e32) \ + }else if(sew == e16){ \ + VV_NARROW_PARAMS(e16, e32) \ BODY; \ - } else if (sew == e32) { \ - VI_NARROW_SHIFT(e32, e64) \ + }else if(sew == e32){ \ + VV_NARROW_PARAMS(e32, e64) \ + BODY; \ + } \ + VI_LOOP_END + +#define VI_VX_LOOP_NARROW(BODY) \ + VI_CHECK_SDS(false); \ + VI_LOOP_BASE \ + if (sew == e8){ \ + VX_NARROW_PARAMS(e8, e16) \ + BODY; \ + }else if(sew == e16){ \ + VX_NARROW_PARAMS(e16, e32) \ + BODY; \ + }else if(sew == e32){ \ + VX_NARROW_PARAMS(e32, e64) \ + BODY; \ + } \ + VI_LOOP_END + +#define VI_VI_LOOP_NARROW(BODY) \ + VI_CHECK_SDS(false); \ + VI_LOOP_BASE \ + if (sew == e8){ \ + VI_NARROW_PARAMS(e8, e16) \ + BODY; \ + }else if(sew == e16){ \ + VI_NARROW_PARAMS(e16, e32) \ + BODY; \ + }else if(sew == e32){ \ + VI_NARROW_PARAMS(e32, e64) \ BODY; \ } \ VI_LOOP_END @@ -1155,13 +1162,13 @@ VI_LOOP_END VI_CHECK_SDS(false); \ VI_LOOP_NSHIFT_BASE \ if (sew == e8){ \ - VI_NSHIFT_PARAMS(e8, e16) \ + VI_NARROW_PARAMS(e8, e16) \ BODY; \ } else if (sew == e16) { \ - VI_NSHIFT_PARAMS(e16, e32) \ + VI_NARROW_PARAMS(e16, e32) \ BODY; \ } else if (sew == e32) { \ - VI_NSHIFT_PARAMS(e32, e64) \ + VI_NARROW_PARAMS(e32, e64) \ BODY; \ } \ VI_LOOP_END @@ -1170,13 +1177,13 @@ VI_LOOP_END VI_CHECK_SDS(false); \ VI_LOOP_NSHIFT_BASE \ if (sew == e8){ \ - VX_NSHIFT_PARAMS(e8, e16) \ + VX_NARROW_PARAMS(e8, e16) \ BODY; \ } else if (sew == e16) { \ - VX_NSHIFT_PARAMS(e16, e32) \ + VX_NARROW_PARAMS(e16, e32) \ BODY; \ } else if (sew == e32) { \ - VX_NSHIFT_PARAMS(e32, e64) \ + VX_NARROW_PARAMS(e32, e64) \ BODY; \ } \ VI_LOOP_END @@ -1185,13 +1192,13 @@ VI_LOOP_END VI_CHECK_SDS(true); \ VI_LOOP_NSHIFT_BASE \ if (sew == e8){ \ - VV_NSHIFT_PARAMS(e8, e16) \ + VV_NARROW_PARAMS(e8, e16) \ BODY; \ } else if (sew == e16) { \ - VV_NSHIFT_PARAMS(e16, e32) \ + VV_NARROW_PARAMS(e16, e32) \ BODY; \ } else if (sew == e32) { \ - VV_NSHIFT_PARAMS(e32, e64) \ + VV_NARROW_PARAMS(e32, e64) \ BODY; \ } \ VI_LOOP_END |