Minor vec4 stack manipulation optimizations.
This commit is contained in:
parent
b96f04ccce
commit
bea03db25d
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue