Minor vec4 stack manipulation optimizations.

This commit is contained in:
Stephen Williams 2014-11-21 14:41:31 -08:00
parent b96f04ccce
commit bea03db25d
4 changed files with 22 additions and 37 deletions

View File

@ -165,12 +165,14 @@ struct assign_vector4_event_s : public event_s {
base = 0; base = 0;
vwid = 0; vwid = 0;
} }
#if 0
/* A constructor that makes the val directly. */ /* A constructor that makes the val directly. */
assign_vector4_event_s(const vvp_vector4_t&that, unsigned adr, unsigned wid) assign_vector4_event_s(const vvp_vector4_t&that, unsigned adr, unsigned wid)
: val(that,adr,wid) { : val(that,adr,wid) {
base = 0; base = 0;
vwid = 0; vwid = 0;
} }
#endif
/* Where to do the assign. */ /* Where to do the assign. */
vvp_net_ptr_t ptr; vvp_net_ptr_t ptr;
@ -782,26 +784,12 @@ void schedule_assign_vector(vvp_net_ptr_t ptr,
schedule_event_(cur, delay, SEQ_NBASSIGN); schedule_event_(cur, delay, SEQ_NBASSIGN);
} }
void schedule_assign_plucked_vector(vvp_net_ptr_t ptr, void schedule_propagate_vector(vvp_net_t*net,
vvp_time64_t delay, vvp_time64_t delay,
const vvp_vector4_t&src, const vvp_vector4_t&src)
unsigned adr, unsigned wid)
{
struct assign_vector4_event_s*cur
= new struct assign_vector4_event_s(src,adr,wid);
cur->ptr = ptr;
cur->vwid = 0;
cur->base = 0;
schedule_event_(cur, delay, SEQ_NBASSIGN);
}
void schedule_propagate_plucked_vector(vvp_net_t*net,
vvp_time64_t delay,
const vvp_vector4_t&src,
unsigned adr, unsigned wid)
{ {
struct propagate_vector4_event_s*cur struct propagate_vector4_event_s*cur
= new struct propagate_vector4_event_s(src,adr,wid); = new struct propagate_vector4_event_s(src);
cur->net = net; cur->net = net;
schedule_event_(cur, delay, SEQ_NBASSIGN); schedule_event_(cur, delay, SEQ_NBASSIGN);
} }

View File

@ -48,11 +48,6 @@ extern void schedule_assign_vector(vvp_net_ptr_t ptr,
const vvp_vector4_t&val, const vvp_vector4_t&val,
vvp_time64_t delay); vvp_time64_t delay);
extern void schedule_assign_plucked_vector(vvp_net_ptr_t ptr,
vvp_time64_t delay,
const vvp_vector4_t&val,
unsigned adr, unsigned wid);
extern void schedule_assign_array_word(vvp_array_t mem, extern void schedule_assign_array_word(vvp_array_t mem,
unsigned word_address, unsigned word_address,
unsigned off, unsigned off,
@ -66,10 +61,9 @@ extern void schedule_assign_array_word(vvp_array_t mem,
/* /*
* Create an event to propagate the output of a net. * Create an event to propagate the output of a net.
*/ */
extern void schedule_propagate_plucked_vector(vvp_net_t*ptr, extern void schedule_propagate_vector(vvp_net_t*ptr,
vvp_time64_t delay, vvp_time64_t delay,
const vvp_vector4_t&val, const vvp_vector4_t&val);
unsigned adr, unsigned wid);
/* /*
* This is very similar to schedule_assign_vector, but generates an * This is very similar to schedule_assign_vector, but generates an

View File

@ -993,9 +993,10 @@ bool of_ASSIGN_VEC4(vthread_t thr, vvp_code_t cp)
{ {
vvp_net_ptr_t ptr (cp->net, 0); vvp_net_ptr_t ptr (cp->net, 0);
unsigned delay = cp->bit_idx[0]; unsigned delay = cp->bit_idx[0];
vvp_vector4_t val = thr->pop_vec4(); vvp_vector4_t&val = thr->peek_vec4();
schedule_assign_plucked_vector(ptr, delay, val, 0, val.size()); schedule_assign_vector(ptr, 0, 0, val, delay);
thr->pop_vec4(1);
return true; return true;
} }
@ -1686,11 +1687,12 @@ static void do_CMPU(vthread_t thr, const vvp_vector4_t&lval, const vvp_vector4_t
bool of_CMPU(vthread_t thr, vvp_code_t) bool of_CMPU(vthread_t thr, vvp_code_t)
{ {
vvp_vector4_t rval = thr->pop_vec4(); const vvp_vector4_t&rval = thr->peek_vec4(0);
vvp_vector4_t lval = thr->pop_vec4(); const vvp_vector4_t&lval = thr->peek_vec4(1);
do_CMPU(thr, lval, rval); do_CMPU(thr, lval, rval);
thr->pop_vec4(2);
return true; return true;
} }
@ -3737,7 +3739,7 @@ bool of_PAD_S(vthread_t thr, vvp_code_t cp)
{ {
unsigned wid = cp->number; unsigned wid = cp->number;
vvp_vector4_t val = thr->pop_vec4(); vvp_vector4_t&val = thr->peek_vec4();
unsigned old_size = val.size(); unsigned old_size = val.size();
val.resize(wid); val.resize(wid);
@ -3748,8 +3750,6 @@ bool of_PAD_S(vthread_t thr, vvp_code_t cp)
val.set_bit(idx, sb); val.set_bit(idx, sb);
} }
thr->push_vec4(val);
return true; return true;
} }
@ -5400,17 +5400,20 @@ bool of_STORE_VEC4A(vthread_t thr, vvp_code_t cp)
unsigned adr_index = cp->bit_idx[0]; unsigned adr_index = cp->bit_idx[0];
unsigned off_index = cp->bit_idx[1]; unsigned off_index = cp->bit_idx[1];
vvp_vector4_t value = thr->pop_vec4(); vvp_vector4_t&value = thr->peek_vec4();
long adr = adr_index? thr->words[adr_index].w_int : 0; long adr = adr_index? thr->words[adr_index].w_int : 0;
long off = off_index? thr->words[off_index].w_int : 0; long off = off_index? thr->words[off_index].w_int : 0;
// Suppress action if flags-4 is true. // Suppress action if flags-4 is true.
if (thr->flags[4] == BIT4_1) if (thr->flags[4] == BIT4_1) {
thr->pop_vec4(1);
return true; return true;
}
array_set_word(cp->array, adr, off, value); array_set_word(cp->array, adr, off, value);
thr->pop_vec4(1);
return true; return true;
} }

View File

@ -3042,7 +3042,7 @@ void vvp_wide_fun_core::propagate_vec4(const vvp_vector4_t&bit,
vvp_time64_t delay) vvp_time64_t delay)
{ {
if (delay) if (delay)
schedule_propagate_plucked_vector(ptr_, delay, bit, 0, bit.size()); schedule_propagate_vector(ptr_, delay, bit);
else else
ptr_->send_vec4(bit, 0); ptr_->send_vec4(bit, 0);
} }