static void draw_concat_vec4(ivl_expr_t expr) { /* Repeat the concatenation this many times to make a super-concatenation. */ unsigned repeat = ivl_expr_repeat(expr); /* This is the number of expressions that go into the concatenation. */ unsigned num_sube = ivl_expr_parms(expr); unsigned sub_idx; assert(num_sube > 0); /* Start with the most-significant bits. */ draw_eval_vec4(ivl_expr_parm(expr, 0)); for (sub_idx = 1 ; sub_idx < num_sube ; sub_idx += 1) { /* Concatenate progressively lower parts. */ ivl_expr_t sube = ivl_expr_parm(expr, sub_idx); /* Special case: The next expression is a NUMBER that can be concatenated using %concati/vec4 instructions. */ if (ivl_expr_type(sube) == IVL_EX_NUMBER) { draw_concat_number_vec4(sube, 1); continue; } draw_eval_vec4(sube); fprintf(vvp_out, " %%concat/vec4; draw_concat_vec4\n"); } if (repeat > 1) { fprintf(vvp_out, " %%replicate %u;\n", repeat); } }
/* * Push a number into the vec4 stack using %pushi/vec4 * instructions. The %pushi/vec4 instruction can only handle up to 32 * non-zero bits, so if there are more than that, then generate * multiple %pushi/vec4 statements, and use %concat/vec4 statements to * concatenate the vectors into the desired result. */ static void draw_number_vec4(ivl_expr_t expr) { draw_concat_number_vec4(expr, 0); }