- 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:
parent
da49759323
commit
2d87c60a34
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user