mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-08-29 01:03:29 +02:00
Minor performance tweak of vector_to_array function.
This commit is contained in:
+2
-1
@@ -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,
|
||||
unsigned addr, unsigned wid)
|
||||
{
|
||||
unsigned awid = (wid + CPU_WORD_BITS - 1) / (CPU_WORD_BITS);
|
||||
|
||||
|
||||
if (addr == 0) {
|
||||
unsigned awid = (wid + CPU_WORD_BITS - 1) / (CPU_WORD_BITS);
|
||||
unsigned long*val = new unsigned long[awid];
|
||||
for (unsigned idx = 0 ; idx < awid ; idx += 1)
|
||||
val[idx] = 0;
|
||||
return val;
|
||||
}
|
||||
if (addr == 1) {
|
||||
unsigned awid = (wid + CPU_WORD_BITS - 1) / (CPU_WORD_BITS);
|
||||
unsigned long*val = new unsigned long[awid];
|
||||
for (unsigned idx = 0 ; idx < awid ; idx += 1)
|
||||
val[idx] = -1UL;
|
||||
|
||||
+11
-1
@@ -355,6 +355,9 @@ unsigned long* vvp_vector4_t::subarray(unsigned adr, unsigned wid) const
|
||||
unsigned long tmp = bits_ptr_[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) {
|
||||
/* Starting a new word? */
|
||||
if (adr%BITS_PER_WORD == 0)
|
||||
@@ -363,10 +366,17 @@ unsigned long* vvp_vector4_t::subarray(unsigned adr, unsigned wid) const
|
||||
if (tmp&2)
|
||||
goto x_out;
|
||||
if (tmp&1)
|
||||
val[idx/BIT2_PER_WORD] |= 1UL << (idx % BIT2_PER_WORD);
|
||||
*val_ptr |= mask1;
|
||||
|
||||
adr += 1;
|
||||
tmp >>= 2UL;
|
||||
|
||||
if (mask1 == mask1_last) {
|
||||
val_ptr += 1;
|
||||
mask1 = 1;
|
||||
} else {
|
||||
mask1 <<= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user