makes widenning function types more explicit

This commit is contained in:
Eyck-Alexander Jentzsch 2025-03-06 16:20:35 +01:00
parent fe9f2a5455
commit 2166a6d81e

View File

@ -276,60 +276,77 @@ std::function<dest_elem_t(dest_elem_t, src2_elem_t, src1_elem_t)> get_funct(unsi
case 0b101111: // VNMSAC
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) { return -1 * (vs1 * vs2) + vd; };
case 0b110000: // VWADDU
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) { return vs2 + vs1; };
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<dest_elem_t>(vs2) + static_cast<dest_elem_t>(vs1);
};
case 0b110001: // VWADD
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2) +
static_cast<std::make_signed_t<src1_elem_t>>(vs1));
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) +
static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1));
};
case 0b110010: // VWSUBU
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) { return vs2 - vs1; };
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<dest_elem_t>(vs2) - static_cast<dest_elem_t>(vs1);
};
case 0b110011: // VWSUB
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2) -
static_cast<std::make_signed_t<src1_elem_t>>(vs1));
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) -
static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1));
};
case 0b110100: // VWADDU.W
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) { return vs2 + vs1; };
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<dest_elem_t>(vs2) + static_cast<dest_elem_t>(vs1);
};
case 0b110101: // VWADD.W
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2) +
static_cast<std::make_signed_t<src1_elem_t>>(vs1));
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) +
static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1));
};
case 0b110110: // VWSUBU.W
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) { return vs2 - vs1; };
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<dest_elem_t>(vs2) - static_cast<dest_elem_t>(vs1);
};
case 0b110111: // VWSUB.W
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2) -
static_cast<std::make_signed_t<src1_elem_t>>(vs1));
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) -
static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1));
};
case 0b111000: // VWMULU
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return (static_cast<twice_t<src2_elem_t>>(vs2) * static_cast<twice_t<src2_elem_t>>(vs1));
return (static_cast<dest_elem_t>(vs2) * static_cast<dest_elem_t>(vs1));
};
case 0b111010: // VWMULSU
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return (static_cast<twice_t<std::make_signed_t<src2_elem_t>>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) *
static_cast<twice_t<src2_elem_t>>(vs1));
return static_cast<std::make_signed_t<dest_elem_t>>(
static_cast<std::make_signed_t<src2_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2))) *
static_cast<dest_elem_t>(vs1);
};
case 0b111011: // VWMUL
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return (static_cast<twice_t<std::make_signed_t<src2_elem_t>>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) *
static_cast<twice_t<std::make_signed_t<src2_elem_t>>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1)));
return (static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) *
static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1)));
};
case 0b111100: // VWMACCU
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) { return vs1 * vs2 + vd; };
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<dest_elem_t>(vs1) * static_cast<dest_elem_t>(vs2) + vd;
};
case 0b111101: // VWMACC
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<std::make_signed_t<src1_elem_t>>(vs1) * static_cast<std::make_signed_t<src2_elem_t>>(vs2) + vd;
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1)) *
static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) +
vd;
};
case 0b111110: // VWMACCUS
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return vs1 * static_cast<std::make_signed_t<src2_elem_t>>(vs2) + vd;
return static_cast<dest_elem_t>(vs1) *
static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src2_elem_t>>(vs2)) +
vd;
};
case 0b111111: // VWMACCSU
return [](dest_elem_t vd, src2_elem_t vs2, src1_elem_t vs1) {
return static_cast<std::make_signed_t<src1_elem_t>>(vs1) * vs2 + vd;
return static_cast<std::make_signed_t<dest_elem_t>>(static_cast<std::make_signed_t<src1_elem_t>>(vs1)) *
static_cast<dest_elem_t>(vs2) +
vd;
};
default:
throw new std::runtime_error("Unknown funct6 in get_funct");