- add BLUR_DYNAMIC_TRANSLATE2, which produces code that inserts the

loop updates into the translated function so that the loop can be
  optimized.
This commit is contained in:
Bryce Denney 2002-04-17 05:15:37 +00:00
parent da49759323
commit 2d87c60a34

View File

@ -1,6 +1,6 @@
/*
*
* $Id: blur-opcode.c,v 1.2 2002-04-17 04:18:34 bdenney Exp $
* $Id: blur-opcode.c,v 1.3 2002-04-17 05:15:37 bdenney Exp $
*
*/
@ -49,6 +49,7 @@ int blur_instructions[] = {
OP_ADD_DATA,
OP_MOVE_REL, 0, 1,
OP_ADD_DATA,
OP_MOVE_REL, -1, -1,
OP_STORE_DATA,
OP_END
};
@ -538,7 +539,7 @@ void blur_dynamic_translate1 ()
fprintf (csrc, "// code generated by blur-opcode.c, blur_dynamic_translate1()\n");
fprintf (csrc, "#include \"translate1-defs.h\"\n");
fprintf (csrc, "void translate%d (State *state) {\n", unique_fn_id);
fprintf (csrc, "TOP_OF_TRANSLATED_FUNCTION();\n");
fprintf (csrc, "BEGIN_TRANSLATED_FUNCTION();\n");
pc = &blur_instructions[0];
while (!done) {
switch (*pc++) {
@ -567,8 +568,8 @@ void blur_dynamic_translate1 ()
assert (0);
}
}
fprintf (csrc, "BOTTOM_OF_TRANSLATED_FUNCTION();\n");
fprintf (csrc, "} // end of translate%d\n", unique_fn_id);
fprintf (csrc, "END_TRANSLATED_FUNCTION();\n");
fprintf (csrc, "} // end of translate%d\n", unique_fn_id);
unique_fn_id++;
fclose (csrc);
}
@ -600,6 +601,88 @@ void blur_dynamic_translate1_test ()
}
#endif
#ifdef BLUR_DYNAMIC_TRANSLATE2
static int unique_fn_id = 283473;
void blur_dynamic_translate2 ()
{
// csrc is the main text file containing the translated code.
FILE *csrc = fopen ("translate2.c", "w");
State state;
int done = 0;
int *pc;
assert (csrc!=NULL);
fprintf (csrc, "// code generated by blur-opcode.c, blur_dynamic_translate1()\n");
fprintf (csrc, "#include \"translate2-defs.h\"\n");
fprintf (csrc, "\n");
fprintf (csrc, "void translate%d (State *state) {\n", unique_fn_id);
// the BEGIN_TRANSLATED_FUNCTION macro is defined in the
// translate2-defs.h file. It creates local variables to mirror the
// frequently used fields in the state struct.
fprintf (csrc, "BEGIN_TRANSLATED_FUNCTION()\n");
// this code is executed before the block begins, each time.
fprintf (csrc, " ST(load_ptr) = &array[x][y];\n");
fprintf (csrc, " ST(store_ptr) = &array2[x][y];\n");
pc = &blur_instructions[0];
while (!done) {
switch (*pc++) {
case OP_MOVE_REL:
fprintf (csrc, "DO_MOVE_REL(%d,%d);\n", *pc++, *pc++);
break;
case OP_SET_ACCUM:
fprintf (csrc, "DO_SET_ACCUM(%d);\n", *pc++);
break;
case OP_ADD_DATA:
fprintf (csrc, "DO_ADD_DATA();\n");
break;
case OP_SUBTRACT_DATA:
fprintf (csrc, "DO_SUBTRACT_DATA();\n");
break;
case OP_MULTIPLY_DATA:
fprintf (csrc, "DO_MULTIPLY_DATA();\n");
break;
case OP_STORE_DATA:
fprintf (csrc, "DO_STORE_DATA();\n");
break;
case OP_END:
done = 1;
break;
default:
assert (0);
}
}
// loop count updates
fprintf (csrc, " ST(y)++; \n");
fprintf (csrc, " if (!(ST(y)<MAX-1)) { \n");
fprintf (csrc, " ST(y)=1; \n");
fprintf (csrc, " ST(x)++; \n");
fprintf (csrc, " if (!(ST(x)<MAX-1)) { \n");
fprintf (csrc, " done=1; \n");
fprintf (csrc, " } \n");
fprintf (csrc, " } \n");
fprintf (csrc, "END_TRANSLATED_FUNCTION()\n");
fprintf (csrc, "} // end of translate%d\n", unique_fn_id);
unique_fn_id++;
fclose (csrc);
}
#endif
#ifdef BLUR_DYNAMIC_TRANSLATE2_TEST
extern void translate284472 (State *state);
void blur_dynamic_translate2_test ()
{
State state;
state.x = 1;
state.y = 1;
translate284472 (&state);
}
#endif
void fill_array()
{
int x,y;
@ -661,8 +744,12 @@ int main (int argc, char *argv[])
blur_opcode_translated3();
#elif defined BLUR_DYNAMIC_TRANSLATE1
blur_dynamic_translate1 ();
#elif defined BLUR_DYNAMIC_TRANSLATE2
blur_dynamic_translate2 ();
#elif defined BLUR_DYNAMIC_TRANSLATE1_TEST
blur_dynamic_translate1_test ();
#elif defined BLUR_DYNAMIC_TRANSLATE2_TEST
blur_dynamic_translate2_test ();
#else
blur_simple();
#endif