|
|
|
@ -794,19 +794,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); \ |
|
|
|
@ -1174,84 +1174,91 @@ 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 |
|
|
|
|
|
|
|
#define VI_VI_LOOP_NSHIFT(BODY, is_vs1) \ |
|
|
|
VI_CHECK_SDS(is_vs1); \ |
|
|
|
#define VI_VI_LOOP_NSHIFT(BODY) \ |
|
|
|
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 |
|
|
|
|
|
|
|
#define VI_VX_LOOP_NSHIFT(BODY, is_vs1) \ |
|
|
|
VI_CHECK_SDS(is_vs1); \ |
|
|
|
#define VI_VX_LOOP_NSHIFT(BODY) \ |
|
|
|
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 |
|
|
|
|
|
|
|
#define VI_VV_LOOP_NSHIFT(BODY, is_vs1) \ |
|
|
|
VI_CHECK_SDS(is_vs1); \ |
|
|
|
#define VI_VV_LOOP_NSHIFT(BODY) \ |
|
|
|
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 |
|
|
|
|