Implement string compares for vec4 support.

This commit is contained in:
Stephen Williams 2014-01-28 17:11:21 -08:00
parent 75233a9bca
commit e497f63e29
1 changed files with 100 additions and 0 deletions

View File

@ -133,6 +133,26 @@ static void draw_binary_vec4_compare_real(ivl_expr_t expr)
} }
} }
static void draw_binary_vec4_compare_string(ivl_expr_t expr)
{
draw_eval_string(ivl_expr_oper1(expr));
draw_eval_string(ivl_expr_oper2(expr));
switch (ivl_expr_opcode(expr)) {
case 'e': /* == */
fprintf(vvp_out, " %%cmp/str;\n");
fprintf(vvp_out, " %%flag_get/vec4 4;\n");
break;
case 'n': /* != */
fprintf(vvp_out, " %%cmp/str;\n");
fprintf(vvp_out, " %%flag_get/vec4 4;\n");
fprintf(vvp_out, " %%inv;\n");
break;
default:
assert(0);
}
}
static void draw_binary_vec4_compare(ivl_expr_t expr, int stuff_ok_flag) static void draw_binary_vec4_compare(ivl_expr_t expr, int stuff_ok_flag)
{ {
ivl_expr_t le = ivl_expr_oper1(expr); ivl_expr_t le = ivl_expr_oper1(expr);
@ -144,6 +164,24 @@ static void draw_binary_vec4_compare(ivl_expr_t expr, int stuff_ok_flag)
return; return;
} }
if ((ivl_expr_value(le)==IVL_VT_STRING)
&& (ivl_expr_value(re)==IVL_VT_STRING)) {
draw_binary_vec4_compare_string(expr);
return;
}
if ((ivl_expr_value(le)==IVL_VT_STRING)
&& (ivl_expr_type(re)==IVL_EX_STRING)) {
draw_binary_vec4_compare_string(expr);
return;
}
if ((ivl_expr_type(le)==IVL_EX_STRING)
&& (ivl_expr_value(re)==IVL_VT_STRING)) {
draw_binary_vec4_compare_string(expr);
return;
}
draw_eval_vec4(le, stuff_ok_flag); draw_eval_vec4(le, stuff_ok_flag);
draw_eval_vec4(re, stuff_ok_flag); draw_eval_vec4(re, stuff_ok_flag);
@ -238,6 +276,50 @@ static void draw_binary_vec4_le_real(ivl_expr_t expr)
} }
} }
static void draw_binary_vec4_le_string(ivl_expr_t expr)
{
ivl_expr_t le = ivl_expr_oper1(expr);
ivl_expr_t re = ivl_expr_oper2(expr);
switch (ivl_expr_opcode(expr)) {
case '<':
draw_eval_string(le);
draw_eval_string(re);
fprintf(vvp_out, " %%cmp/str;\n");
fprintf(vvp_out, " %%flag_get/vec4 5;\n");
break;
case 'L': /* <= */
draw_eval_string(le);
draw_eval_string(re);
fprintf(vvp_out, " %%cmp/str;\n");
fprintf(vvp_out, " %%flag_get/vec4 4;\n");
fprintf(vvp_out, " %%flag_get/vec4 5;\n");
fprintf(vvp_out, " %%or;\n");
break;
case '>':
draw_eval_string(re);
draw_eval_string(le);
fprintf(vvp_out, " %%cmp/str;\n");
fprintf(vvp_out, " %%flag_get/vec4 5;\n");
break;
case 'G': /* >= */
draw_eval_string(re);
draw_eval_string(le);
fprintf(vvp_out, " %%cmp/str;\n");
fprintf(vvp_out, " %%flag_get/vec4 4;\n");
fprintf(vvp_out, " %%flag_get/vec4 5;\n");
fprintf(vvp_out, " %%or;\n");
break;
default:
assert(0);
break;
}
}
static void draw_binary_vec4_le(ivl_expr_t expr, int stuff_ok_flag) static void draw_binary_vec4_le(ivl_expr_t expr, int stuff_ok_flag)
{ {
ivl_expr_t le = ivl_expr_oper1(expr); ivl_expr_t le = ivl_expr_oper1(expr);
@ -270,6 +352,24 @@ static void draw_binary_vec4_le(ivl_expr_t expr, int stuff_ok_flag)
break; break;
} }
if ((ivl_expr_value(le)==IVL_VT_STRING)
&& (ivl_expr_value(re)==IVL_VT_STRING)) {
draw_binary_vec4_le_string(expr);
return;
}
if ((ivl_expr_value(le)==IVL_VT_STRING)
&& (ivl_expr_type(re)==IVL_EX_STRING)) {
draw_binary_vec4_le_string(expr);
return;
}
if ((ivl_expr_type(le)==IVL_EX_STRING)
&& (ivl_expr_value(re)==IVL_VT_STRING)) {
draw_binary_vec4_le_string(expr);
return;
}
/* NOTE: I think I would rather the elaborator handle the /* NOTE: I think I would rather the elaborator handle the
operand widths. When that happens, take this code out. */ operand widths. When that happens, take this code out. */
draw_eval_vec4(le, stuff_ok_flag); draw_eval_vec4(le, stuff_ok_flag);