/************************************************************************ * File: instinfo.c * * Author: Karl Abrahamson * * Written: February 2002 * * Description: * * Describe characteristics of instructions. * * Tab stops: Every 8 characters * ************************************************************************/ /************************************************************************ * INSTRUCTION CLASSES * ************************************************************************/ #ifdef USE_INSTRUCTION_CLASS #define ONE_BYTE_INSTRUCTION 1 #define TWO_BYTE_INSTRUCTION 2 #define LABEL_INSTRUCTION 3 #define GOTO_INSTRUCTION 4 #define CALL_INSTRUCTION 5 char instruction_class[] = { /* M_POP_INTEGER */ ONE_BYTE_INSTRUCTION, /* M_POP_REAL */ ONE_BYTE_INSTRUCTION, /* M_POP_ARRAY */ ONE_BYTE_INSTRUCTION, /* M_DUP_INTEGER */ ONE_BYTE_INSTRUCTION, /* M_DUP_REAL */ ONE_BYTE_INSTRUCTION, /* M_DUP_ARRAY */ ONE_BYTE_INSTRUCTION, /* M_INTEGER_ADD */ ONE_BYTE_INSTRUCTION, /* M_INTEGER_SUBTRACT */ ONE_BYTE_INSTRUCTION, /* M_INTEGER_MULTIPLY */ ONE_BYTE_INSTRUCTION, /* M_INTEGER_DIVIDE */ ONE_BYTE_INSTRUCTION, /* M_INTEGER_MOD */ ONE_BYTE_INSTRUCTION, /* M_REAL_ADD */ ONE_BYTE_INSTRUCTION, /* M_REAL_SUBTRACT */ ONE_BYTE_INSTRUCTION, /* M_REAL_MULTIPLY */ ONE_BYTE_INSTRUCTION, /* M_REAL_DIVIDE */ ONE_BYTE_INSTRUCTION, /* M_COMPARE_INTEGERS */ ONE_BYTE_INSTRUCTION, /* M_COMPARE_REALS */ ONE_BYTE_INSTRUCTION, /* M_MAKE_INTEGER_ARRAY */ ONE_BYTE_INSTRUCTION, /* M_MAKE_REAL_ARRAY */ ONE_BYTE_INSTRUCTION, /* M_DELETE_ARRAY */ ONE_BYTE_INSTRUCTION, /* M_INDEX */ ONE_BYTE_INSTRUCTION, /* M_STORE_INTEGER_INDEXED */ ONE_BYTE_INSTRUCTION, /* M_STORE_REAL_INDEXED */ ONE_BYTE_INSTRUCTION, /* M_STORE_LEAVE_INTEGER_INDEXED */ ONE_BYTE_INSTRUCTION, /* M_STORE_LEAVE_REAL_INDEXED */ ONE_BYTE_INSTRUCTION, /* M_RETURN_INTEGER */ ONE_BYTE_INSTRUCTION, /* M_RETURN_REAL */ ONE_BYTE_INSTRUCTION, /* M_RETURN */ ONE_BYTE_INSTRUCTION, /* M_READ_INTEGER */ ONE_BYTE_INSTRUCTION, /* M_READ_REAL */ ONE_BYTE_INSTRUCTION, /* M_READ_CHAR */ ONE_BYTE_INSTRUCTION, /* M_WRITE_INTEGER */ ONE_BYTE_INSTRUCTION, /* M_WRITE_REAL */ ONE_BYTE_INSTRUCTION, /* M_WRITE_CHAR */ ONE_BYTE_INSTRUCTION, /* M_PUSH_INTEGER */ TWO_BYTE_INSTRUCTION, /* M_PUSH_INTEGER_CONSTANT */ TWO_BYTE_INSTRUCTION, /* M_PUSH_REAL_CONSTANT */ TWO_BYTE_INSTRUCTION, /* M_ALLOC */ TWO_BYTE_INSTRUCTION, /* M_DEALLOC */ TWO_BYTE_INSTRUCTION, /* M_FETCH_LOCAL_INTEGER */ TWO_BYTE_INSTRUCTION, /* M_FETCH_LOCAL_REAL */ TWO_BYTE_INSTRUCTION, /* M_FETCH_LOCAL_ARRAY */ TWO_BYTE_INSTRUCTION, /* M_STORE_LOCAL_INTEGER */ TWO_BYTE_INSTRUCTION, /* M_STORE_LOCAL_REAL */ TWO_BYTE_INSTRUCTION, /* M_STORE_LOCAL_ARRAY */ TWO_BYTE_INSTRUCTION, /* M_FETCH_PARAM_INTEGER */ TWO_BYTE_INSTRUCTION, /* M_FETCH_PARAM_REAL */ TWO_BYTE_INSTRUCTION, /* M_FETCH_PARAM_ARRAY */ TWO_BYTE_INSTRUCTION, /* M_STORE_PARAM_INTEGER */ TWO_BYTE_INSTRUCTION, /* M_STORE_PARAM_REAL */ TWO_BYTE_INSTRUCTION, /* M_STORE_PARAM_ARRAY */ TWO_BYTE_INSTRUCTION, /* M_FETCH_GLOBAL_INTEGER */ TWO_BYTE_INSTRUCTION, /* M_FETCH_GLOBAL_REAL */ TWO_BYTE_INSTRUCTION, /* M_FETCH_GLOBAL_ARRAY */ TWO_BYTE_INSTRUCTION, /* M_STORE_GLOBAL_INTEGER */ TWO_BYTE_INSTRUCTION, /* M_STORE_GLOBAL_REAL */ TWO_BYTE_INSTRUCTION, /* M_STORE_GLOBAL_ARRAY */ TWO_BYTE_INSTRUCTION, /* M_LABEL */ LABEL_INSTRUCTION, /* M_GOTO */ GOTO_INSTRUCTION, /* M_GOTO_IF_ZERO */ GOTO_INSTRUCTION, /* M_GOTO_IF_NOT_ZERO */ GOTO_INSTRUCTION, /* M_GOTO_IF_POSITIVE */ GOTO_INSTRUCTION, /* M_GOTO_IF_NOT_POSITIVE */ GOTO_INSTRUCTION, /* M_GOTO_IF_NEGATIVE */ GOTO_INSTRUCTION, /* M_GOTO_IF_NOT_NEGATIVE */ GOTO_INSTRUCTION, /* M_GOTO_IF_FAILED */ GOTO_INSTRUCTION, /* M_GOTO_IF_EOF */ GOTO_INSTRUCTION, /* M_CALL */ CALL_INSTRUCTION }; #endif /************************************************************************ * INSTRUCTION NAMES * ************************************************************************ * Give names to instructions. * * * * instruction_name handles all executable instructions. * * * * one_byte_instruction_name gives names of instructions that are * * one byte long, terminateded by NULL. * * * * two_byte_instruction_name gives names of instructions that are * * two bytes long, terminated by NULL. * ************************************************************************/ #ifdef USE_INSTRUCTION_NAME char* instruction_name[] = { /* M_POP_INTEGER */ "M_POP_INTEGER", /* M_POP_REAL */ "M_POP_REAL", /* M_POP_ARRAY */ "M_POP_ARRAY", /* M_DUP_INTEGER */ "M_DUP_INTEGER", /* M_DUP_REAL */ "M_DUP_REAL", /* M_DUP_ARRAY */ "M_DUP_ARRAY", /* M_INTEGER_ADD */ "M_INTEGER_ADD", /* M_INTEGER_SUBTRACT */ "M_INTEGER_SUBTRACT", /* M_INTEGER_MULTIPLY */ "M_INTEGER_MULTIPLY", /* M_INTEGER_DIVIDE */ "M_INTEGER_DIVIDE", /* M_INTEGER_MOD */ "M_INTEGER_MOD", /* M_REAL_ADD */ "M_REAL_ADD", /* M_REAL_SUBTRACT */ "M_REAL_SUBTRACT", /* M_REAL_MULTIPLY */ "M_REAL_MULTIPLY", /* M_REAL_DIVIDE */ "M_REAL_DIVIDE", /* M_COMPARE_INTEGERS */ "M_COMPARE_INTEGERS", /* M_COMPARE_REALS */ "M_COMPARE_REALS", /* M_MAKE_INTEGER_ARRAY */ "M_MAKE_INTEGER_ARRAY", /* M_MAKE_REAL_ARRAY */ "M_MAKE_REAL_ARRAY", /* M_DELETE_ARRAY */ "M_DELETE_ARRAY", /* M_INDEX */ "M_INDEX", /* M_STORE_INTEGER_INDEXED */ "M_STORE_INTEGER_INDEXED", /* M_STORE_REAL_INDEXED */ "M_STORE_REAL_INDEXED", /* M_STORE_LEAVE_INTEGER_INDEXED */ "M_STORE_LEAVE_INTEGER_INDEXED", /* M_STORE_LEAVE_REAL_INDEXED */ "M_STORE_LEAVE_REAL_INDEXED", /* M_RETURN_INTEGER */ "M_RETURN_INTEGER", /* M_RETURN_REAL */ "M_RETURN_REAL", /* M_RETURN */ "M_RETURN", /* M_READ_INTEGER */ "M_READ_INTEGER", /* M_READ_REAL */ "M_READ_REAL", /* M_READ_CHAR */ "M_READ_CHAR", /* M_WRITE_INTEGER */ "M_WRITE_INTEGER", /* M_WRITE_REAL */ "M_WRITE_REAL", /* M_WRITE_CHAR */ "M_WRITE_CHAR", /* M_PUSH_INTEGER */ "M_PUSH_INTEGER", /* M_PUSH_INTEGER_CONSTANT */ "M_PUSH_INTEGER_CONSTANT", /* M_PUSH_REAL_CONSTANT */ "M_PUSH_REAL_CONSTANT", /* M_ALLOC */ "M_ALLOC", /* M_DEALLOC */ "M_DEALLOC", /* M_FETCH_LOCAL_INTEGER */ "M_FETCH_LOCAL_INTEGER", /* M_FETCH_LOCAL_REAL */ "M_FETCH_LOCAL_REAL", /* M_FETCH_LOCAL_ARRAY */ "M_FETCH_LOCAL_ARRAY", /* M_STORE_LOCAL_INTEGER */ "M_STORE_LOCAL_INTEGER", /* M_STORE_LOCAL_REAL */ "M_STORE_LOCAL_REAL", /* M_STORE_LOCAL_ARRAY */ "M_STORE_LOCAL_ARRAY", /* M_FETCH_PARAM_INTEGER */ "M_FETCH_PARAM_INTEGER", /* M_FETCH_PARAM_REAL */ "M_FETCH_PARAM_REAL", /* M_FETCH_PARAM_ARRAY */ "M_FETCH_PARAM_ARRAY", /* M_STORE_PARAM_INTEGER */ "M_STORE_PARAM_INTEGER", /* M_STORE_PARAM_REAL */ "M_STORE_PARAM_REAL", /* M_STORE_PARAM_ARRAY */ "M_STORE_PARAM_ARRAY", /* M_FETCH_GLOBAL_INTEGER */ "M_FETCH_GLOBAL_INTEGER", /* M_FETCH_GLOBAL_REAL */ "M_FETCH_GLOBAL_REAL", /* M_FETCH_GLOBAL_ARRAY */ "M_FETCH_GLOBAL_ARRAY", /* M_STORE_GLOBAL_INTEGER */ "M_STORE_GLOBAL_INTEGER", /* M_STORE_GLOBAL_REAL */ "M_STORE_GLOBAL_REAL", /* M_STORE_GLOBAL_ARRAY */ "M_STORE_GLOBAL_ARRAY", /* M_LABEL */ "M_LABEL", /* M_GOTO */ "M_GOTO", /* M_GOTO_IF_ZERO */ "M_GOTO_IF_ZERO", /* M_GOTO_IF_NOT_ZERO */ "M_GOTO_IF_NOT_ZERO", /* M_GOTO_IF_POSITIVE */ "M_GOTO_IF_POSITIVE", /* M_GOTO_IF_NOT_POSITIVE */ "M_GOTO_IF_NOT_POSITIVE", /* M_GOTO_IF_NEGATIVE */ "M_GOTO_IF_NEGATIVE", /* M_GOTO_IF_NOT_NEGATIVE */ "M_GOTO_IF_NOT_NEGATIVE", /* M_GOTO_IF_FAILED */ "M_GOTO_IF_FAILED", /* M_GOTO_IF_EOF */ "M_GOTO_IF_EOF", /* M_CALL */ "M_CALL", NULL }; #endif #ifdef USE_SIZED_INSTRUCTION_NAME char* one_byte_instruction_name[] = { /* M_POP_INTEGER */ "M_POP_INTEGER", /* M_POP_REAL */ "M_POP_REAL", /* M_POP_ARRAY */ "M_POP_ARRAY", /* M_DUP_INTEGER */ "M_DUP_INTEGER", /* M_DUP_REAL */ "M_DUP_REAL", /* M_DUP_ARRAY */ "M_DUP_ARRAY", /* M_INTEGER_ADD */ "M_INTEGER_ADD", /* M_INTEGER_SUBTRACT */ "M_INTEGER_SUBTRACT", /* M_INTEGER_MULTIPLY */ "M_INTEGER_MULTIPLY", /* M_INTEGER_DIVIDE */ "M_INTEGER_DIVIDE", /* M_INTEGER_MOD */ "M_INTEGER_MOD", /* M_REAL_ADD */ "M_REAL_ADD", /* M_REAL_SUBTRACT */ "M_REAL_SUBTRACT", /* M_REAL_MULTIPLY */ "M_REAL_MULTIPLY", /* M_REAL_DIVIDE */ "M_REAL_DIVIDE", /* M_COMPARE_INTEGERS */ "M_COMPARE_INTEGERS", /* M_COMPARE_REALS */ "M_COMPARE_REALS", /* M_MAKE_INTEGER_ARRAY */ "M_MAKE_INTEGER_ARRAY", /* M_MAKE_REAL_ARRAY */ "M_MAKE_REAL_ARRAY", /* M_DELETE_ARRAY */ "M_DELETE_ARRAY", /* M_INDEX */ "M_INDEX", /* M_STORE_INTEGER_INDEXED */ "M_STORE_INTEGER_INDEXED", /* M_STORE_REAL_INDEXED */ "M_STORE_REAL_INDEXED", /* M_STORE_LEAVE_INTEGER_INDEXED */ "M_STORE_LEAVE_INTEGER_INDEXED", /* M_STORE_LEAVE_REAL_INDEXED */ "M_STORE_LEAVE_REAL_INDEXED", /* M_RETURN_INTEGER */ "M_RETURN_INTEGER", /* M_RETURN_REAL */ "M_RETURN_REAL", /* M_RETURN */ "M_RETURN", /* M_READ_INTEGER */ "M_READ_INTEGER", /* M_READ_REAL */ "M_READ_REAL", /* M_READ_CHAR */ "M_READ_CHAR", /* M_WRITE_INTEGER */ "M_WRITE_INTEGER", /* M_WRITE_REAL */ "M_WRITE_REAL", /* M_WRITE_CHAR */ "M_WRITE_CHAR", NULL }; char* two_byte_instruction_name[] = { /* M_PUSH_INTEGER */ "M_PUSH_INTEGER", /* M_PUSH_INTEGER_CONSTANT */ "M_PUSH_INTEGER_CONSTANT", /* M_PUSH_REAL_CONSTANT */ "M_PUSH_REAL_CONSTANT", /* M_ALLOC */ "M_ALLOC", /* M_DEALLOC */ "M_DEALLOC", /* M_FETCH_LOCAL_INTEGER */ "M_FETCH_LOCAL_INTEGER", /* M_FETCH_LOCAL_REAL */ "M_FETCH_LOCAL_REAL", /* M_FETCH_LOCAL_ARRAY */ "M_FETCH_LOCAL_ARRAY", /* M_STORE_LOCAL_INTEGER */ "M_STORE_LOCAL_INTEGER", /* M_STORE_LOCAL_REAL */ "M_STORE_LOCAL_REAL", /* M_STORE_LOCAL_ARRAY */ "M_STORE_LOCAL_ARRAY", /* M_FETCH_PARAM_INTEGER */ "M_FETCH_PARAM_INTEGER", /* M_FETCH_PARAM_REAL */ "M_FETCH_PARAM_REAL", /* M_FETCH_PARAM_ARRAY */ "M_FETCH_PARAM_ARRAY", /* M_STORE_PARAM_INTEGER */ "M_STORE_PARAM_INTEGER", /* M_STORE_PARAM_REAL */ "M_STORE_PARAM_REAL", /* M_STORE_PARAM_ARRAY */ "M_STORE_PARAM_ARRAY", /* M_FETCH_GLOBAL_INTEGER */ "M_FETCH_GLOBAL_INTEGER", /* M_FETCH_GLOBAL_REAL */ "M_FETCH_GLOBAL_REAL", /* M_FETCH_GLOBAL_ARRAY */ "M_FETCH_GLOBAL_ARRAY", /* M_STORE_GLOBAL_INTEGER */ "M_STORE_GLOBAL_INTEGER", /* M_STORE_GLOBAL_REAL */ "M_STORE_GLOBAL_REAL", /* M_STORE_GLOBAL_ARRAY */ "M_STORE_GLOBAL_ARRAY", /* M_LABEL */ "M_LABEL", /* M_GOTO */ "M_GOTO", /* M_GOTO_IF_ZERO */ "M_GOTO_IF_ZERO", /* M_GOTO_IF_NOT_ZERO */ "M_GOTO_IF_NOT_ZERO", /* M_GOTO_IF_POSITIVE */ "M_GOTO_IF_POSITIVE", /* M_GOTO_IF_NOT_POSITIVE */ "M_GOTO_IF_NOT_POSITIVE", /* M_GOTO_IF_NEGATIVE */ "M_GOTO_IF_NEGATIVE", /* M_GOTO_IF_NOT_NEGATIVE */ "M_GOTO_IF_NOT_NEGATIVE", /* M_GOTO_IF_FAILED */ "M_GOTO_IF_FAILED", /* M_GOTO_IF_EOF */ "M_GOTO_IF_EOF", NULL }; #endif /************************************************************************ * Kinds of instructions for tracing. This tells how the instruction * * manipulates the stack. The kinds are as follows. Here, N is an * * integer, R is a real number and A is an array. * * * * The stacks are shown with the top to the left. * * * * Kind Stack before Stack after * * ----- ------------- ----------- * * 0 N * * 1 R * * 2 A * * 3 N N N * * 4 R R R * * 5 R R N * * 6 N A * * 7 N A N or R (M_INDEX) * * 8 N N A * * 9 R N A * * 10 * * 11 N * * 12 R * * 13 A * * 14 N N A N * * 15 R N A R * ************************************************************************/ #ifdef USE_INSTRUCTION_TRACE_KIND char instruction_trace_kind[] = { /* M_POP_INTEGER */ 0, /* M_POP_REAL */ 1, /* M_POP_ARRAY */ 2, /* M_DUP_INTEGER */ 11, /* M_DUP_REAL */ 12, /* M_DUP_ARRAY */ 13, /* M_INTEGER_ADD */ 3, /* M_INTEGER_SUBTRACT */ 3, /* M_INTEGER_MULTIPLY */ 3, /* M_INTEGER_DIVIDE */ 3, /* M_INTEGER_MOD */ 3, /* M_REAL_ADD */ 4, /* M_REAL_SUBTRACT */ 4, /* M_REAL_MULTIPLY */ 4, /* M_REAL_DIVIDE */ 4, /* M_COMPARE_INTEGERS */ 3, /* M_COMPARE_REALS */ 5, /* M_MAKE_INTEGER_ARRAY */ 6, /* M_MAKE_REAL_ARRAY */ 6, /* M_DELETE_ARRAY */ 2, /* M_INDEX */ 7, /* M_STORE_INTEGER_INDEXED */ 8, /* M_STORE_REAL_INDEXED */ 9, /* M_STORE_LEAVE_INTEGER_INDEXED */ 14, /* M_STORE_LEAVE_REAL_INDEXED */ 15, /* M_RETURN_INTEGER */ 0, /* M_RETURN_REAL */ 1, /* M_RETURN */ 10, /* M_READ_INTEGER */ 11, /* M_READ_REAL */ 12, /* M_READ_CHAR */ 11, /* M_WRITE_INTEGER */ 0, /* M_WRITE_REAL */ 1, /* M_WRITE_CHAR */ 0, /* M_PUSH_INTEGER */ 11, /* M_PUSH_INTEGER_CONSTANT */ 11, /* M_PUSH_REAL_CONSTANT */ 12, /* M_ALLOC */ 10, /* M_DEALLOC */ 10, /* M_FETCH_LOCAL_INTEGER */ 11, /* M_FETCH_LOCAL_REAL */ 12, /* M_FETCH_LOCAL_ARRAY */ 13, /* M_STORE_LOCAL_INTEGER */ 0, /* M_STORE_LOCAL_REAL */ 1, /* M_STORE_LOCAL_ARRAY */ 2, /* M_FETCH_PARAM_INTEGER */ 11, /* M_FETCH_PARAM_REAL */ 12, /* M_FETCH_PARAM_ARRAY */ 13, /* M_STORE_PARAM_INTEGER */ 0, /* M_STORE_PARAM_REAL */ 1, /* M_STORE_PARAM_ARRAY */ 2, /* M_FETCH_GLOBAL_INTEGER */ 11, /* M_FETCH_GLOBAL_REAL */ 12, /* M_FETCH_GLOBAL_ARRAY */ 13, /* M_STORE_GLOBAL_INTEGER */ 0, /* M_STORE_GLOBAL_REAL */ 1, /* M_STORE_GLOBAL_ARRAY */ 2, /* M_LABEL */ 10, /* M_GOTO */ 10, /* M_GOTO_IF_ZERO */ 0, /* M_GOTO_IF_NOT_ZERO */ 0, /* M_GOTO_IF_POSITIVE */ 0, /* M_GOTO_IF_NOT_POSITIVE */ 0, /* M_GOTO_IF_NEGATIVE */ 0, /* M_GOTO_IF_NOT_NEGATIVE */ 0, /* M_GOTO_IF_FAILED */ 10, /* M_GOTO_IF_EOF */ 10, /* M_CALL */ 10 }; #endif