aboutsummaryrefslogtreecommitdiff
path: root/riscv/decode.h
diff options
context:
space:
mode:
authoreopXD <yueh.ting.chen@gmail.com>2021-11-28 16:13:54 +0800
committereopXD <yueh.ting.chen@gmail.com>2021-11-28 16:14:01 +0800
commitd177f05b7bd01f25a16e8cc0712fa551bdaeb954 (patch)
treea51cd7fae50884c0c24c51386cda720bd26ce017 /riscv/decode.h
parentab7521de6a76be7fc57665998679a7f6ecfafcb9 (diff)
downloadspike-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.h89
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