vec4 handling of DARRAY of vec4 vectors.
This commit is contained in:
parent
f5564a195f
commit
401fccdf6e
|
|
@ -618,6 +618,18 @@ static void draw_select_vec4(ivl_expr_t expr)
|
|||
return;
|
||||
}
|
||||
|
||||
if (ivl_expr_value(subexpr)==IVL_VT_DARRAY) {
|
||||
ivl_signal_t sig = ivl_expr_signal(subexpr);
|
||||
assert(sig);
|
||||
assert(ivl_signal_data_type(sig)==IVL_VT_DARRAY);
|
||||
|
||||
assert(base);
|
||||
draw_eval_expr_into_integer(base, 3);
|
||||
fprintf(vvp_out, " %%load/dar/vec4 v%p_0;\n", sig);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
draw_eval_vec4(subexpr, 0);
|
||||
draw_eval_vec4(base, 0);
|
||||
fprintf(vvp_out, " %%part/%c %u;\n", sign_suff, wid);
|
||||
|
|
|
|||
|
|
@ -941,16 +941,13 @@ static int show_stmt_assign_sig_darray(ivl_statement_t net)
|
|||
fprintf(vvp_out, " %%store/dar/str v%p_0;\n", var);
|
||||
|
||||
} else if (mux) {
|
||||
struct vector_info rvec = draw_eval_expr_wid(rval, ivl_lval_width(lval),
|
||||
STUFF_OK_XZ);
|
||||
/* The %set/dar expects the array index to be in index
|
||||
draw_eval_vec4(rval, STUFF_OK_XZ);
|
||||
|
||||
/* The %store/dar/vec4 expects the array index to be in index
|
||||
register 3. Calculate the index in place. */
|
||||
draw_eval_expr_into_integer(mux, 3);
|
||||
|
||||
fprintf(vvp_out, " %%set/dar v%p_0, %u, %u;\n",
|
||||
var, rvec.base, rvec.wid);
|
||||
|
||||
if (rvec.base >= 4) clr_vector(rvec);
|
||||
fprintf(vvp_out, " %%store/dar/vec4 v%p_0;\n", var);
|
||||
|
||||
} else if (ivl_expr_type(rval) == IVL_EX_ARRAY_PATTERN) {
|
||||
/* There is no l-value mux, but the r-value is an array
|
||||
|
|
|
|||
|
|
@ -141,10 +141,10 @@ extern bool of_LOAD_AV(vthread_t thr, vvp_code_t code);
|
|||
extern bool of_LOAD_AVP0(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_AVP0_S(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_AVX_P(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_DAR(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_REAL(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_DAR_R(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_DAR_STR(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_DAR_VEC4(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_OBJ(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_STR(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_LOAD_STRA(vthread_t thr, vvp_code_t code);
|
||||
|
|
@ -212,6 +212,7 @@ extern bool of_SHIFTR_S(vthread_t thr, vvp_code_t code);
|
|||
extern bool of_SPLIT_VEC4(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_STORE_DAR_R(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_STORE_DAR_STR(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_STORE_DAR_VEC4(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_STORE_OBJ(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_STORE_PROP_OBJ(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_STORE_PROP_R(vthread_t thr, vvp_code_t code);
|
||||
|
|
|
|||
|
|
@ -189,9 +189,9 @@ static const struct opcode_table_s opcode_table[] = {
|
|||
{ "%load/avp0",of_LOAD_AVP0,3, {OA_BIT1, OA_ARR_PTR, OA_BIT2} },
|
||||
{ "%load/avp0/s",of_LOAD_AVP0_S,3,{OA_BIT1,OA_ARR_PTR, OA_BIT2} },
|
||||
{ "%load/avx.p",of_LOAD_AVX_P,3,{OA_BIT1, OA_ARR_PTR, OA_BIT2} },
|
||||
{ "%load/dar",of_LOAD_DAR,3,{OA_BIT1, OA_FUNC_PTR, OA_BIT2} },
|
||||
{ "%load/dar/r", of_LOAD_DAR_R, 1, {OA_FUNC_PTR, OA_NONE, OA_NONE}},
|
||||
{ "%load/dar/str",of_LOAD_DAR_STR, 1, {OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%load/dar/r", of_LOAD_DAR_R, 1, {OA_FUNC_PTR, OA_NONE, OA_NONE}},
|
||||
{ "%load/dar/str",of_LOAD_DAR_STR, 1, {OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%load/dar/vec4",of_LOAD_DAR_VEC4,1, {OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%load/obj", of_LOAD_OBJ, 1,{OA_FUNC_PTR,OA_NONE, OA_NONE} },
|
||||
{ "%load/real", of_LOAD_REAL, 1,{OA_VPI_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%load/str", of_LOAD_STR, 1,{OA_FUNC_PTR,OA_NONE, OA_NONE} },
|
||||
|
|
@ -256,10 +256,11 @@ static const struct opcode_table_s opcode_table[] = {
|
|||
{ "%shiftl", of_SHIFTL, 1, {OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
{ "%shiftr", of_SHIFTR, 1, {OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
{ "%shiftr/s", of_SHIFTR_S, 1, {OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
{ "%split/vec4", of_SPLIT_VEC4, 1, {OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
{ "%store/dar/r", of_STORE_DAR_R, 1, {OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%store/dar/str",of_STORE_DAR_STR, 1, {OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%store/obj", of_STORE_OBJ, 1, {OA_FUNC_PTR,OA_NONE, OA_NONE} },
|
||||
{ "%split/vec4", of_SPLIT_VEC4, 1,{OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
{ "%store/dar/r", of_STORE_DAR_R, 1,{OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%store/dar/str", of_STORE_DAR_STR, 1,{OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%store/dar/vec4",of_STORE_DAR_VEC4,1,{OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%store/obj", of_STORE_OBJ, 1,{OA_FUNC_PTR, OA_NONE, OA_NONE} },
|
||||
{ "%store/prop/obj",of_STORE_PROP_OBJ,1, {OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
{ "%store/prop/r", of_STORE_PROP_R, 1, {OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
{ "%store/prop/str",of_STORE_PROP_STR,1, {OA_NUMBER, OA_NONE, OA_NONE} },
|
||||
|
|
|
|||
|
|
@ -741,8 +741,7 @@ bit, and the <index> is the selector for the bit to use. If <index> is
|
|||
out of range, then x is loaded. The index value is incremented by one
|
||||
if it is defined (bit 4 is not 1).
|
||||
|
||||
* %load/dar <bit>, <functor-label>, <wid>
|
||||
* %load/dar/r <functor-label>
|
||||
* %load/dar <bit>, <functor-label>, <wid> (XXXX Old implementation)
|
||||
|
||||
This instruction loads an array word from a dynamic array. The
|
||||
<label> refers to the variable object, and the <bit>/<wid> are the
|
||||
|
|
@ -761,10 +760,14 @@ the object handle stack.
|
|||
See also %store/obj.
|
||||
|
||||
* %load/real <vpi-label>
|
||||
* %load/dar/r <functor-label>
|
||||
|
||||
The %load/real instruction reads a real value from the vpi-like object
|
||||
and pushes it to the top of the real value stack.
|
||||
|
||||
The %load/dar/r loads the real word from the darray and pushes it onto
|
||||
the stack.
|
||||
|
||||
* %load/str <var-label>
|
||||
* %load/stra <array-label>, <index>
|
||||
* %load/dar/str <var-label>
|
||||
|
|
@ -1241,6 +1244,7 @@ index in the index register <index>
|
|||
* %store/stra <array-label>, <index>
|
||||
* %store/dar/r <var-label>
|
||||
* %store/dar/str <var-label>
|
||||
* %store/dar/vec4 <var-label>
|
||||
|
||||
The %store/str instruction pops the top of the string stack and writes
|
||||
it to the string variable.
|
||||
|
|
|
|||
|
|
@ -3699,12 +3699,12 @@ bool of_LOAD_AV(vthread_t thr, vvp_code_t cp)
|
|||
return true;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* %load/dar <bit>, <array-label>, <index>;
|
||||
*/
|
||||
bool of_LOAD_DAR(vthread_t thr, vvp_code_t cp)
|
||||
{
|
||||
#if 0
|
||||
unsigned bit = cp->bit_idx[0];
|
||||
unsigned wid = cp->bit_idx[1];
|
||||
unsigned adr = thr->words[3].w_int;
|
||||
|
|
@ -3723,11 +3723,10 @@ bool of_LOAD_DAR(vthread_t thr, vvp_code_t cp)
|
|||
|
||||
thr_check_addr(thr, bit+word.size());
|
||||
thr->bits4.set_vec(bit, word);
|
||||
#else
|
||||
fprintf(stderr, "XXXX NOT IMPLEMENTED: %%load/dar ...\n");
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* %load/dar/r <array-label>;
|
||||
|
|
@ -3770,6 +3769,25 @@ bool of_LOAD_DAR_STR(vthread_t thr, vvp_code_t cp)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool of_LOAD_DAR_VEC4(vthread_t thr, vvp_code_t cp)
|
||||
{
|
||||
unsigned adr = thr->words[3].w_int;
|
||||
vvp_net_t*net = cp->net;
|
||||
|
||||
assert(net);
|
||||
vvp_fun_signal_object*obj = dynamic_cast<vvp_fun_signal_object*> (net->fun);
|
||||
assert(obj);
|
||||
|
||||
vvp_darray*darray = obj->get_object().peek<vvp_darray>();
|
||||
assert(darray);
|
||||
|
||||
vvp_vector4_t word;
|
||||
darray->get_word(adr, word);
|
||||
thr->push_vec4(word);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* %load/vp0, %load/vp0/s, %load/avp0 and %load/avp0/s share this function.
|
||||
*/
|
||||
|
|
@ -5816,6 +5834,24 @@ bool of_STORE_DAR_STR(vthread_t thr, vvp_code_t cp)
|
|||
}
|
||||
|
||||
|
||||
bool of_STORE_DAR_VEC4(vthread_t thr, vvp_code_t cp)
|
||||
{
|
||||
long adr = thr->words[3].w_int;
|
||||
|
||||
// Pop the real value to be store...
|
||||
vvp_vector4_t value = thr->pop_vec4();
|
||||
|
||||
vvp_net_t*net = cp->net;
|
||||
vvp_fun_signal_object*obj = dynamic_cast<vvp_fun_signal_object*> (net->fun);
|
||||
assert(obj);
|
||||
|
||||
vvp_darray*darray = obj->get_object().peek<vvp_darray>();
|
||||
assert(darray);
|
||||
|
||||
darray->set_word(adr, value);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool of_STORE_OBJ(vthread_t thr, vvp_code_t cp)
|
||||
{
|
||||
/* set the value into port 0 of the destination. */
|
||||
|
|
|
|||
Loading…
Reference in New Issue