1995-05-04 03:15:53 -07:00
|
|
|
/* Trace the instructions executed */
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "instruct.h"
|
|
|
|
#include "misc.h"
|
|
|
|
#include "mlvalues.h"
|
|
|
|
#include "opnames.h"
|
|
|
|
|
|
|
|
extern code_t start_code;
|
|
|
|
extern char * names_of_cprim[];
|
|
|
|
|
|
|
|
long icount = 0;
|
|
|
|
|
|
|
|
void stop_here () {}
|
|
|
|
|
|
|
|
int trace_flag = 0;
|
|
|
|
|
|
|
|
void disasm_instr(pc)
|
|
|
|
code_t pc;
|
|
|
|
{
|
|
|
|
int instr = *pc;
|
|
|
|
printf("%6d %s", pc - start_code,
|
|
|
|
instr < 0 || instr > STOP ? "???" : names_of_instructions[instr]);
|
|
|
|
pc++;
|
|
|
|
switch(instr) {
|
|
|
|
/* Instructions with one integer operand */
|
|
|
|
case PUSHACC: case ACC: case POP: case ASSIGN:
|
|
|
|
case PUSHENVACC: case ENVACC: case PUSH_RETADDR: case APPLY:
|
|
|
|
case APPTERM1: case APPTERM2: case APPTERM3: case RETURN:
|
|
|
|
case GRAB: case PUSHGETGLOBAL: case GETGLOBAL: case SETGLOBAL:
|
|
|
|
case PUSHATOM: case ATOM: case MAKEBLOCK1: case MAKEBLOCK2:
|
|
|
|
case MAKEBLOCK3: case GETFIELD: case SETFIELD: case DUMMY:
|
|
|
|
case BRANCH: case BRANCHIF: case BRANCHIFNOT: case PUSHTRAP:
|
|
|
|
case CONSTINT: case PUSHCONSTINT: case OFFSETINT: case OFFSETREF:
|
|
|
|
printf(" %d\n", pc[0]); break;
|
|
|
|
/* Instructions with two operands */
|
|
|
|
case APPTERM: case CLOSURE: case CLOSUREREC: case PUSHGETGLOBALFIELD:
|
|
|
|
case GETGLOBALFIELD: case MAKEBLOCK:
|
|
|
|
printf(" %d, %d\n", pc[0], pc[1]); break;
|
|
|
|
/* Instructions with a C primitive as operand */
|
1995-07-11 11:07:22 -07:00
|
|
|
case C_CALL1: case C_CALL2: case C_CALL3: case C_CALL4: case C_CALL5:
|
1995-05-04 03:15:53 -07:00
|
|
|
printf(" %s\n", names_of_cprim[pc[0]]); break;
|
|
|
|
case C_CALLN:
|
|
|
|
printf(" %d, %s\n", pc[0], names_of_cprim[pc[1]]); break;
|
|
|
|
default:
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|