From 68a9526fec3f3dc29dc40a5b79a9a5428efe159b Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 2 Dec 2007 19:00:12 -0800 Subject: [PATCH] Minor performance tweak of vector_to_array function. --- vvp/vthread.cc | 3 ++- vvp/vvp_net.cc | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/vvp/vthread.cc b/vvp/vthread.cc index 878418e17..3fe8e53e6 100644 --- a/vvp/vthread.cc +++ b/vvp/vthread.cc @@ -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; diff --git a/vvp/vvp_net.cc b/vvp/vvp_net.cc index e1eade218..aed907fe7 100644 --- a/vvp/vvp_net.cc +++ b/vvp/vvp_net.cc @@ -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; + } } }