aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave.Wen <dave.wen@sifive.com>2020-05-20 18:24:30 -0700
committerDave.Wen <dave.wen@sifive.com>2020-05-20 18:25:00 -0700
commit4c97d0803ed02b793d07ab853f34ee0e0c29e8a2 (patch)
tree122a7451318d2179b296f20796c8d54f2777273d
parent4bb17aa37063f0e805cdb8ad410a709c34f6af33 (diff)
downloadspike-4c97d0803ed02b793d07ab853f34ee0e0c29e8a2.zip
spike-4c97d0803ed02b793d07ab853f34ee0e0c29e8a2.tar.gz
spike-4c97d0803ed02b793d07ab853f34ee0e0c29e8a2.tar.bz2
wip: v[z|s]ext
-rw-r--r--riscv/decode.h53
1 files changed, 47 insertions, 6 deletions
diff --git a/riscv/decode.h b/riscv/decode.h
index e031537..d6cfa35 100644
--- a/riscv/decode.h
+++ b/riscv/decode.h
@@ -17,6 +17,7 @@
#include "softfloat_types.h"
#include "specialize.h"
#include <cinttypes>
+#include <deque>
typedef int64_t sreg_t;
typedef uint64_t reg_t;
@@ -1742,13 +1743,14 @@ for (reg_t i = 0; i < P.VU.vlmax && P.VU.vl != 0; ++i) { \
// vector: sign/unsiged extension
#define VI_VV_EXT(div, type) \
+ require_vm; \
reg_t from = P.VU.vsew / div; \
require(from >= e8 && from <= e64); \
- const reg_t mew = insn.v_mew(); \
- const reg_t width = insn.v_width(); \
- VI_EEW(mew, width); \
+ reg_t pat = (((P.VU.vsew >> 3) << 4) | from >> 3); \
+ std::deque<type##8_t> origin; \
VI_GENERAL_LOOP_BASE \
- switch (((P.VU.vsew >> 3) << 4)| from) { \
+ fprintf(stderr, "%d, %d\n", P.VU.vsew, from);\
+ switch (pat) { \
case 0x21: \
P.VU.elt<type##16_t>(rd_num, i, true) = P.VU.elt<type##8_t>(rs2_num, i); \
break; \
@@ -1756,7 +1758,7 @@ for (reg_t i = 0; i < P.VU.vlmax && P.VU.vl != 0; ++i) { \
P.VU.elt<type##32_t>(rd_num, i, true) = P.VU.elt<type##8_t>(rs2_num, i); \
break; \
case 0x81: \
- P.VU.elt<type##64_t>(rd_num, i, true) = P.VU.elt<type##8_t>(rs2_num, i); \
+ origin.push_back(P.VU.elt<type##8_t>(rs2_num, i)); \
break; \
case 0x42: \
P.VU.elt<type##32_t>(rd_num, i, true) = P.VU.elt<type##16_t>(rs2_num, i); \
@@ -1767,10 +1769,49 @@ for (reg_t i = 0; i < P.VU.vlmax && P.VU.vl != 0; ++i) { \
case 0x84: \
P.VU.elt<type##64_t>(rd_num, i, true) = P.VU.elt<type##32_t>(rs2_num, i); \
break; \
+ case 0x88: \
+ P.VU.elt<type##64_t>(rd_num, i, true) = P.VU.elt<type##32_t>(rs2_num, i); \
+ break; \
default: \
break; \
} \
- VI_LOOP_END
+ VI_LOOP_END \
+ for (reg_t i=P.VU.vstart; i<vl; ++i){\
+ VI_MASK_VARS \
+ if (insn.v_vm() == 0) { \
+ bool skip = ((P.VU.elt<uint64_t>(0, midx) >> mpos) & 0x1) == 0; \
+ if (skip) {\
+ origin.pop_front();\
+ continue; \
+ }\
+ } \
+ switch (pat) { \
+ case 0x21: \
+ P.VU.elt<type##16_t>(rd_num, i, true) = P.VU.elt<type##8_t>(rs2_num, i); \
+ break; \
+ case 0x41: \
+ P.VU.elt<type##32_t>(rd_num, i, true) = P.VU.elt<type##8_t>(rs2_num, i); \
+ break; \
+ case 0x81: \
+ P.VU.elt<type##64_t>(rd_num, i, true) = origin.front(); \
+ origin.pop_front();\
+ break; \
+ case 0x42: \
+ P.VU.elt<type##32_t>(rd_num, i, true) = P.VU.elt<type##16_t>(rs2_num, i); \
+ break; \
+ case 0x82: \
+ P.VU.elt<type##64_t>(rd_num, i, true) = P.VU.elt<type##16_t>(rs2_num, i); \
+ break; \
+ case 0x84: \
+ P.VU.elt<type##64_t>(rd_num, i, true) = P.VU.elt<type##32_t>(rs2_num, i); \
+ break; \
+ case 0x88: \
+ P.VU.elt<type##64_t>(rd_num, i, true) = P.VU.elt<type##32_t>(rs2_num, i); \
+ break; \
+ default: \
+ break; \
+ } \
+ }
//
// vector: vfp helper