vvp: vthread: Use word wide vector operations
The vthread binary logic opcodes update vectors bit by bit. Use the in-place `vvp_vector4_t` operators instead. This reuses the word wide implementation and avoids per-bit `value()` and `set_bit()` calls. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
41c3423209
commit
cf53479ba2
|
|
@ -4491,13 +4491,9 @@ bool of_NAND(vthread_t thr, vvp_code_t)
|
||||||
vvp_vector4_t valr = thr->pop_vec4();
|
vvp_vector4_t valr = thr->pop_vec4();
|
||||||
vvp_vector4_t&vall = thr->peek_vec4();
|
vvp_vector4_t&vall = thr->peek_vec4();
|
||||||
assert(vall.size() == valr.size());
|
assert(vall.size() == valr.size());
|
||||||
unsigned wid = vall.size();
|
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
vall &= valr;
|
||||||
vvp_bit4_t lb = vall.value(idx);
|
vall.invert();
|
||||||
vvp_bit4_t rb = valr.value(idx);
|
|
||||||
vall.set_bit(idx, ~(lb&rb));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -4755,13 +4751,9 @@ bool of_NOR(vthread_t thr, vvp_code_t)
|
||||||
vvp_vector4_t valr = thr->pop_vec4();
|
vvp_vector4_t valr = thr->pop_vec4();
|
||||||
vvp_vector4_t&vall = thr->peek_vec4();
|
vvp_vector4_t&vall = thr->peek_vec4();
|
||||||
assert(vall.size() == valr.size());
|
assert(vall.size() == valr.size());
|
||||||
unsigned wid = vall.size();
|
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
vall |= valr;
|
||||||
vvp_bit4_t lb = vall.value(idx);
|
vall.invert();
|
||||||
vvp_bit4_t rb = valr.value(idx);
|
|
||||||
vall.set_bit(idx, ~(lb|rb));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -6564,14 +6556,9 @@ bool of_XNOR(vthread_t thr, vvp_code_t)
|
||||||
vvp_vector4_t valr = thr->pop_vec4();
|
vvp_vector4_t valr = thr->pop_vec4();
|
||||||
vvp_vector4_t&vall = thr->peek_vec4();
|
vvp_vector4_t&vall = thr->peek_vec4();
|
||||||
assert(vall.size() == valr.size());
|
assert(vall.size() == valr.size());
|
||||||
unsigned wid = vall.size();
|
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
vall ^= valr;
|
||||||
|
vall.invert();
|
||||||
vvp_bit4_t lb = vall.value(idx);
|
|
||||||
vvp_bit4_t rb = valr.value(idx);
|
|
||||||
vall.set_bit(idx, ~(lb ^ rb));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -6584,14 +6571,8 @@ bool of_XOR(vthread_t thr, vvp_code_t)
|
||||||
vvp_vector4_t valr = thr->pop_vec4();
|
vvp_vector4_t valr = thr->pop_vec4();
|
||||||
vvp_vector4_t&vall = thr->peek_vec4();
|
vvp_vector4_t&vall = thr->peek_vec4();
|
||||||
assert(vall.size() == valr.size());
|
assert(vall.size() == valr.size());
|
||||||
unsigned wid = vall.size();
|
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
vall ^= valr;
|
||||||
|
|
||||||
vvp_bit4_t lb = vall.value(idx);
|
|
||||||
vvp_bit4_t rb = valr.value(idx);
|
|
||||||
vall.set_bit(idx, lb ^ rb);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue