Minor performance tweak of vector_to_array function.
This commit is contained in:
parent
e5381feb85
commit
68a9526fec
|
|
@ -170,16 +170,17 @@ void vthread_put_real(struct vthread_s*thr, unsigned addr, double val)
|
||||||
static unsigned long* vector_to_array(struct vthread_s*thr,
|
static unsigned long* vector_to_array(struct vthread_s*thr,
|
||||||
unsigned addr, unsigned wid)
|
unsigned addr, unsigned wid)
|
||||||
{
|
{
|
||||||
unsigned awid = (wid + CPU_WORD_BITS - 1) / (CPU_WORD_BITS);
|
|
||||||
|
|
||||||
|
|
||||||
if (addr == 0) {
|
if (addr == 0) {
|
||||||
|
unsigned awid = (wid + CPU_WORD_BITS - 1) / (CPU_WORD_BITS);
|
||||||
unsigned long*val = new unsigned long[awid];
|
unsigned long*val = new unsigned long[awid];
|
||||||
for (unsigned idx = 0 ; idx < awid ; idx += 1)
|
for (unsigned idx = 0 ; idx < awid ; idx += 1)
|
||||||
val[idx] = 0;
|
val[idx] = 0;
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
if (addr == 1) {
|
if (addr == 1) {
|
||||||
|
unsigned awid = (wid + CPU_WORD_BITS - 1) / (CPU_WORD_BITS);
|
||||||
unsigned long*val = new unsigned long[awid];
|
unsigned long*val = new unsigned long[awid];
|
||||||
for (unsigned idx = 0 ; idx < awid ; idx += 1)
|
for (unsigned idx = 0 ; idx < awid ; idx += 1)
|
||||||
val[idx] = -1UL;
|
val[idx] = -1UL;
|
||||||
|
|
|
||||||
|
|
@ -355,6 +355,9 @@ unsigned long* vvp_vector4_t::subarray(unsigned adr, unsigned wid) const
|
||||||
unsigned long tmp = bits_ptr_[adr/BITS_PER_WORD];
|
unsigned long tmp = bits_ptr_[adr/BITS_PER_WORD];
|
||||||
tmp >>= 2UL * (adr%BITS_PER_WORD);
|
tmp >>= 2UL * (adr%BITS_PER_WORD);
|
||||||
|
|
||||||
|
unsigned long mask1 = 1;
|
||||||
|
const unsigned long mask1_last = 1UL << (BIT2_PER_WORD-1);
|
||||||
|
unsigned long*val_ptr = val;
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
||||||
/* Starting a new word? */
|
/* Starting a new word? */
|
||||||
if (adr%BITS_PER_WORD == 0)
|
if (adr%BITS_PER_WORD == 0)
|
||||||
|
|
@ -363,10 +366,17 @@ unsigned long* vvp_vector4_t::subarray(unsigned adr, unsigned wid) const
|
||||||
if (tmp&2)
|
if (tmp&2)
|
||||||
goto x_out;
|
goto x_out;
|
||||||
if (tmp&1)
|
if (tmp&1)
|
||||||
val[idx/BIT2_PER_WORD] |= 1UL << (idx % BIT2_PER_WORD);
|
*val_ptr |= mask1;
|
||||||
|
|
||||||
adr += 1;
|
adr += 1;
|
||||||
tmp >>= 2UL;
|
tmp >>= 2UL;
|
||||||
|
|
||||||
|
if (mask1 == mask1_last) {
|
||||||
|
val_ptr += 1;
|
||||||
|
mask1 = 1;
|
||||||
|
} else {
|
||||||
|
mask1 <<= 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue