Support negative index for %assign/av opcodes.
If the array index is negative these opcodes need to just return.
(cherry picked from commit 9d765820bf)
This commit is contained in:
parent
df177e9e14
commit
f34485d415
|
|
@ -824,10 +824,12 @@ bool of_ASSIGN_AV(vthread_t thr, vvp_code_t cp)
|
||||||
{
|
{
|
||||||
unsigned wid = thr->words[0].w_int;
|
unsigned wid = thr->words[0].w_int;
|
||||||
long off = thr->words[1].w_int;
|
long off = thr->words[1].w_int;
|
||||||
unsigned adr = thr->words[3].w_int;
|
long adr = thr->words[3].w_int;
|
||||||
unsigned delay = cp->bit_idx[0];
|
unsigned delay = cp->bit_idx[0];
|
||||||
unsigned bit = cp->bit_idx[1];
|
unsigned bit = cp->bit_idx[1];
|
||||||
|
|
||||||
|
if (adr < 0) return true;
|
||||||
|
|
||||||
long vwidth = get_array_word_size(cp->array);
|
long vwidth = get_array_word_size(cp->array);
|
||||||
// We fell off the MSB end.
|
// We fell off the MSB end.
|
||||||
if (off >= vwidth) return true;
|
if (off >= vwidth) return true;
|
||||||
|
|
@ -861,10 +863,12 @@ bool of_ASSIGN_AVD(vthread_t thr, vvp_code_t cp)
|
||||||
{
|
{
|
||||||
unsigned wid = thr->words[0].w_int;
|
unsigned wid = thr->words[0].w_int;
|
||||||
long off = thr->words[1].w_int;
|
long off = thr->words[1].w_int;
|
||||||
unsigned adr = thr->words[3].w_int;
|
long adr = thr->words[3].w_int;
|
||||||
vvp_time64_t delay = thr->words[cp->bit_idx[0]].w_int;
|
vvp_time64_t delay = thr->words[cp->bit_idx[0]].w_int;
|
||||||
unsigned bit = cp->bit_idx[1];
|
unsigned bit = cp->bit_idx[1];
|
||||||
|
|
||||||
|
if (adr < 0) return true;
|
||||||
|
|
||||||
long vwidth = get_array_word_size(cp->array);
|
long vwidth = get_array_word_size(cp->array);
|
||||||
// We fell off the MSB end.
|
// We fell off the MSB end.
|
||||||
if (off >= vwidth) return true;
|
if (off >= vwidth) return true;
|
||||||
|
|
@ -892,9 +896,11 @@ bool of_ASSIGN_AVE(vthread_t thr, vvp_code_t cp)
|
||||||
{
|
{
|
||||||
unsigned wid = thr->words[0].w_int;
|
unsigned wid = thr->words[0].w_int;
|
||||||
long off = thr->words[1].w_int;
|
long off = thr->words[1].w_int;
|
||||||
unsigned adr = thr->words[3].w_int;
|
long adr = thr->words[3].w_int;
|
||||||
unsigned bit = cp->bit_idx[0];
|
unsigned bit = cp->bit_idx[0];
|
||||||
|
|
||||||
|
if (adr < 0) return true;
|
||||||
|
|
||||||
long vwidth = get_array_word_size(cp->array);
|
long vwidth = get_array_word_size(cp->array);
|
||||||
// We fell off the MSB end.
|
// We fell off the MSB end.
|
||||||
if (off >= vwidth) return true;
|
if (off >= vwidth) return true;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue