adds Vector Integer Divide Instructions
This commit is contained in:
parent
ab31fd27c9
commit
c9b7962cd3
@ -184,10 +184,40 @@ std::function<dest_elem_t(src2_elem_t, src1_elem_t)> get_funct(unsigned funct6,
|
|||||||
// case 0b011101: // VMNAND
|
// case 0b011101: // VMNAND
|
||||||
// case 0b011110: // VMNOR
|
// case 0b011110: // VMNOR
|
||||||
// case 0b011111: // VMXNOR
|
// case 0b011111: // VMXNOR
|
||||||
// case 0b100000: // VDIVU
|
case 0b100000: // VDIVU
|
||||||
// case 0b100001: // VDIV
|
return [](src2_elem_t vs2, src1_elem_t vs1) -> dest_elem_t {
|
||||||
// case 0b100010: // VREMU
|
if(vs1 == 0)
|
||||||
// case 0b100011: // VREM
|
return -1;
|
||||||
|
else
|
||||||
|
return vs2 / vs1;
|
||||||
|
};
|
||||||
|
case 0b100001: // VDIV
|
||||||
|
return [](src2_elem_t vs2, src1_elem_t vs1) -> dest_elem_t {
|
||||||
|
if(vs1 == 0)
|
||||||
|
return -1;
|
||||||
|
else if(vs2 == std::numeric_limits<std::make_signed_t<src2_elem_t>>::min() &&
|
||||||
|
static_cast<std::make_signed_t<src1_elem_t>>(vs1) == -1)
|
||||||
|
return vs2;
|
||||||
|
else
|
||||||
|
return static_cast<std::make_signed_t<src2_elem_t>>(vs2) / static_cast<std::make_signed_t<src1_elem_t>>(vs1);
|
||||||
|
};
|
||||||
|
case 0b100010: // VREMU
|
||||||
|
return [](src2_elem_t vs2, src1_elem_t vs1) -> dest_elem_t {
|
||||||
|
if(vs1 == 0)
|
||||||
|
return vs2;
|
||||||
|
else
|
||||||
|
return vs2 % vs1;
|
||||||
|
};
|
||||||
|
case 0b100011: // VREM
|
||||||
|
return [](src2_elem_t vs2, src1_elem_t vs1) -> dest_elem_t {
|
||||||
|
if(vs1 == 0)
|
||||||
|
return vs2;
|
||||||
|
else if(vs2 == std::numeric_limits<std::make_signed_t<src2_elem_t>>::min() &&
|
||||||
|
static_cast<std::make_signed_t<src1_elem_t>>(vs1) == -1)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return static_cast<std::make_signed_t<src2_elem_t>>(vs2) % static_cast<std::make_signed_t<src1_elem_t>>(vs1);
|
||||||
|
};
|
||||||
case 0b100100: // VMULHU
|
case 0b100100: // VMULHU
|
||||||
return [](src2_elem_t vs2, src1_elem_t vs1) {
|
return [](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)) >> sizeof(dest_elem_t) * 8;
|
return (static_cast<twice_t<src2_elem_t>>(vs2) * static_cast<twice_t<src2_elem_t>>(vs1)) >> sizeof(dest_elem_t) * 8;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user