Browse Source

Simply parameters for floating-point instructions

pull/879/head
eopXD 4 years ago
parent
commit
278a7dd434
  1. 47
      riscv/decode.h
  2. 12
      riscv/insns/vfmerge_vfm.h

47
riscv/decode.h

@ -832,6 +832,20 @@ static inline bool is_aligned(const unsigned val, const unsigned pos)
auto vs1 = P.VU.elt<type_sew_t<x>::type>(rs1_num, i); \ auto vs1 = P.VU.elt<type_sew_t<x>::type>(rs1_num, i); \
auto &vd = P.VU.elt<type_sew_t<x>::type>(rd_num, i, true); auto &vd = P.VU.elt<type_sew_t<x>::type>(rd_num, i, true);
#define VFP_V_PARAMS(width) \
float##width##_t &vd = P.VU.elt<float##width##_t>(rd_num, i, true); \
float##width##_t vs2 = P.VU.elt<float##width##_t>(rs2_num, i);
#define VFP_VV_PARAMS(width) \
float##width##_t &vd = P.VU.elt<float##width##_t>(rd_num, i, true); \
float##width##_t vs1 = P.VU.elt<float##width##_t>(rs1_num, i); \
float##width##_t vs2 = P.VU.elt<float##width##_t>(rs2_num, i);
#define VFP_VF_PARAMS(width) \
float##width##_t &vd = P.VU.elt<float##width##_t>(rd_num, i, true); \
float##width##_t rs1 = f##width(READ_FREG(rs1_num)); \
float##width##_t vs2 = P.VU.elt<float##width##_t>(rs2_num, i);
// //
// vector: integer and masking operation loop // vector: integer and masking operation loop
// //
@ -1962,25 +1976,19 @@ reg_t index[P.VU.vlmax]; \
VI_VFP_LOOP_BASE \ VI_VFP_LOOP_BASE \
switch(P.VU.vsew) { \ switch(P.VU.vsew) { \
case e16: {\ case e16: {\
float16_t &vd = P.VU.elt<float16_t>(rd_num, i, true); \ VFP_VV_PARAMS(16); \
float16_t vs1 = P.VU.elt<float16_t>(rs1_num, i); \
float16_t vs2 = P.VU.elt<float16_t>(rs2_num, i); \
BODY16; \ BODY16; \
set_fp_exceptions; \ set_fp_exceptions; \
break; \ break; \
}\ }\
case e32: {\ case e32: {\
float32_t &vd = P.VU.elt<float32_t>(rd_num, i, true); \ VFP_VV_PARAMS(32); \
float32_t vs1 = P.VU.elt<float32_t>(rs1_num, i); \
float32_t vs2 = P.VU.elt<float32_t>(rs2_num, i); \
BODY32; \ BODY32; \
set_fp_exceptions; \ set_fp_exceptions; \
break; \ break; \
}\ }\
case e64: {\ case e64: {\
float64_t &vd = P.VU.elt<float64_t>(rd_num, i, true); \ VFP_VV_PARAMS(64); \
float64_t vs1 = P.VU.elt<float64_t>(rs1_num, i); \
float64_t vs2 = P.VU.elt<float64_t>(rs2_num, i); \
BODY64; \ BODY64; \
set_fp_exceptions; \ set_fp_exceptions; \
break; \ break; \
@ -1997,20 +2005,17 @@ reg_t index[P.VU.vlmax]; \
VI_VFP_LOOP_BASE \ VI_VFP_LOOP_BASE \
switch(P.VU.vsew) { \ switch(P.VU.vsew) { \
case e16: {\ case e16: {\
float16_t &vd = P.VU.elt<float16_t>(rd_num, i, true); \ VFP_V_PARAMS(16); \
float16_t vs2 = P.VU.elt<float16_t>(rs2_num, i); \
BODY16; \ BODY16; \
break; \ break; \
}\ }\
case e32: {\ case e32: {\
float32_t &vd = P.VU.elt<float32_t>(rd_num, i, true); \ VFP_V_PARAMS(32); \
float32_t vs2 = P.VU.elt<float32_t>(rs2_num, i); \
BODY32; \ BODY32; \
break; \ break; \
}\ }\
case e64: {\ case e64: {\
float64_t &vd = P.VU.elt<float64_t>(rd_num, i, true); \ VFP_V_PARAMS(64); \
float64_t vs2 = P.VU.elt<float64_t>(rs2_num, i); \
BODY64; \ BODY64; \
break; \ break; \
}\ }\
@ -2090,25 +2095,19 @@ reg_t index[P.VU.vlmax]; \
VI_VFP_LOOP_BASE \ VI_VFP_LOOP_BASE \
switch(P.VU.vsew) { \ switch(P.VU.vsew) { \
case e16: {\ case e16: {\
float16_t &vd = P.VU.elt<float16_t>(rd_num, i, true); \ VFP_VF_PARAMS(16); \
float16_t rs1 = f16(READ_FREG(rs1_num)); \
float16_t vs2 = P.VU.elt<float16_t>(rs2_num, i); \
BODY16; \ BODY16; \
set_fp_exceptions; \ set_fp_exceptions; \
break; \ break; \
}\ }\
case e32: {\ case e32: {\
float32_t &vd = P.VU.elt<float32_t>(rd_num, i, true); \ VFP_VF_PARAMS(32); \
float32_t rs1 = f32(READ_FREG(rs1_num)); \
float32_t vs2 = P.VU.elt<float32_t>(rs2_num, i); \
BODY32; \ BODY32; \
set_fp_exceptions; \ set_fp_exceptions; \
break; \ break; \
}\ }\
case e64: {\ case e64: {\
float64_t &vd = P.VU.elt<float64_t>(rd_num, i, true); \ VFP_VF_PARAMS(64); \
float64_t rs1 = f64(READ_FREG(rs1_num)); \
float64_t vs2 = P.VU.elt<float64_t>(rs2_num, i); \
BODY64; \ BODY64; \
set_fp_exceptions; \ set_fp_exceptions; \
break; \ break; \

12
riscv/insns/vfmerge_vfm.h

@ -5,9 +5,7 @@ VI_VFP_COMMON;
switch(P.VU.vsew) { switch(P.VU.vsew) {
case e16: case e16:
for (reg_t i=P.VU.vstart->read(); i<vl; ++i) { for (reg_t i=P.VU.vstart->read(); i<vl; ++i) {
auto &vd = P.VU.elt<float16_t>(rd_num, i, true); VFP_VF_PARAMS(16);
auto rs1 = f16(READ_FREG(rs1_num));
auto vs2 = P.VU.elt<float16_t>(rs2_num, i);
int midx = i / 64; int midx = i / 64;
int mpos = i % 64; int mpos = i % 64;
@ -18,9 +16,7 @@ switch(P.VU.vsew) {
break; break;
case e32: case e32:
for (reg_t i=P.VU.vstart->read(); i<vl; ++i) { for (reg_t i=P.VU.vstart->read(); i<vl; ++i) {
auto &vd = P.VU.elt<float32_t>(rd_num, i, true); VFP_VF_PARAMS(32);
auto rs1 = f32(READ_FREG(rs1_num));
auto vs2 = P.VU.elt<float32_t>(rs2_num, i);
int midx = i / 64; int midx = i / 64;
int mpos = i % 64; int mpos = i % 64;
@ -31,9 +27,7 @@ switch(P.VU.vsew) {
break; break;
case e64: case e64:
for (reg_t i=P.VU.vstart->read(); i<vl; ++i) { for (reg_t i=P.VU.vstart->read(); i<vl; ++i) {
auto &vd = P.VU.elt<float64_t>(rd_num, i, true); VFP_VF_PARAMS(64);
auto rs1 = f64(READ_FREG(rs1_num));
auto vs2 = P.VU.elt<float64_t>(rs2_num, i);
int midx = i / 64; int midx = i / 64;
int mpos = i % 64; int mpos = i % 64;

Loading…
Cancel
Save