Plan 9 from Bell Labs’s /usr/web/sources/contrib/fernan/nhc98/src/runtime/Kernel/inscount.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#include <setjmp.h>
#include <signal.h>
#include "node.h"
/* #include "runtime.h"  -- already included in node.h */
/* #include "bytecode.h" -- already included in node.h via newmacros.h */

#if INSCOUNT
#define MAX_ARG 7


static int i_zap_arg_i1[1];
static int i_zap_arg_i3[1];
static int i_zap_arg_i2[1];
static int i_zap_arg[MAX_ARG+1];
static int i_zap_stack_p1[MAX_ARG+1];
static int i_zap_stack_p2[MAX_ARG+1];

static int i_needheap_i32[1];
static int i_needheap_p1[MAX_ARG+1];
static int i_needheap_p2[MAX_ARG+1];
static int i_needstack_i16[1];
static int i_needstack_p1[MAX_ARG+1];
static int i_needstack_p2[MAX_ARG+1];

static int i_jump[MAX_ARG+1];
static int i_jumpfalse[MAX_ARG+1];	/*DW/PH*/

static int i_nop[1];

static int i_matchcon[1];
static int i_matchint[1];
static int i_jumps_t[1];
static int i_jumps_l[1];

static int i_push_cadr_n2[MAX_ARG+1];
static int i_push_cadr_n1[MAX_ARG+1];
static int i_push_cadr_p1[MAX_ARG+1];
static int i_push_cadr_p2[MAX_ARG+1];
static int i_push_cval_n2[MAX_ARG+1];
static int i_push_cval_n1[MAX_ARG+1];
static int i_push_cval_p1[MAX_ARG+1];
static int i_push_cval_p2[MAX_ARG+1];
static int i_push_int_n2[MAX_ARG+1];
static int i_push_int_n1[MAX_ARG+1];
static int i_push_int_p1[MAX_ARG+1];
static int i_push_int_p2[MAX_ARG+1];
static int i_push_char_n1[MAX_ARG+1];
static int i_push_char_p1[MAX_ARG+1];
static int i_push_arg_i1[1];
static int i_push_arg_i2[1];
static int i_push_arg_i3[1];
static int i_push_arg[MAX_ARG+1];
static int i_push_i1[1];
static int i_push_p1[MAX_ARG+1];
static int i_push_p2[MAX_ARG+1];

static int i_pop_i1[1];
static int i_pop_p1[MAX_ARG+1];
static int i_pop_p2[MAX_ARG+1];
static int i_slide_p1[MAX_ARG+1];
static int i_slide_p2[MAX_ARG+1];
static int i_unpack[MAX_ARG+1];

static int i_selector_eval[1];
static int i_select[MAX_ARG+1];

static int i_apply[1];
static int i_eval[1];

static int i_return[1];
static int i_return_eval[1];

static int i_heap_off_n2[MAX_ARG+1];
static int i_heap_off_n1[MAX_ARG+1];
static int i_heap_off_p1[MAX_ARG+1];
static int i_heap_off_p2[MAX_ARG+1];

static int i_heap_create[1];
static int i_heap_space[1];

static int i_heap_cadr_n2[MAX_ARG+1];
static int i_heap_cadr_n1[MAX_ARG+1];
static int i_heap_cadr_p1[MAX_ARG+1];
static int i_heap_cadr_p2[MAX_ARG+1];
static int i_heap_cval_n2[MAX_ARG+1];
static int i_heap_cval_n1[MAX_ARG+1];
static int i_heap_cval_in3[1];
static int i_heap_cval_i3[1];
static int i_heap_cval_i4[1];
static int i_heap_cval_i5[1];
static int i_heap_cval_p1[MAX_ARG+1];
static int i_heap_cval_p2[MAX_ARG+1];
static int i_heap_int_n2[MAX_ARG+1];
static int i_heap_int_n1[MAX_ARG+1];
static int i_heap_int_p1[MAX_ARG+1];
static int i_heap_int_p2[MAX_ARG+1];
static int i_heap_char_n1[MAX_ARG+1];
static int i_heap_char_p1[MAX_ARG+1];
static int i_heap_arg[1];
static int i_heap_i1[1];
static int i_heap_i2[1];
static int i_heap_p1[MAX_ARG+1];
static int i_heap_p2[MAX_ARG+1];

static int i_add_w[1];
static int i_add_f[1];
static int i_add_d[1];
static int i_sub_w[1];
static int i_sub_f[1];
static int i_sub_d[1];
static int i_mul_w[1];
static int i_mul_f[1];
static int i_mul_d[1];
static int i_abs_w[1];
static int i_abs_f[1];
static int i_abs_d[1];
static int i_signum_w[1];
static int i_signum_f[1];
static int i_signum_d[1];
static int i_exp_f[1];
static int i_exp_d[1];
static int i_pow_f[1];
static int i_pow_d[1];
static int i_log_f[1];
static int i_log_d[1];
static int i_sqrt_f[1];
static int i_sqrt_d[1];
static int i_sin_f[1];
static int i_sin_d[1];
static int i_cos_f[1];
static int i_cos_d[1];
static int i_tan_f[1];
static int i_tan_d[1];
static int i_asin_f[1];
static int i_asin_d[1];
static int i_acos_f[1];
static int i_acos_d[1];
static int i_atan_f[1];
static int i_atan_d[1];
static int i_slash_f[1];
static int i_slash_d[1];
static int i_eq_w[1];
static int i_eq_f[1];
static int i_eq_d[1];
static int i_ne_w[1];
static int i_ne_f[1];
static int i_ne_d[1];
static int i_lt_w[1];
static int i_lt_f[1];
static int i_lt_d[1];
static int i_le_w[1];
static int i_le_f[1];
static int i_le_d[1];
static int i_gt_w[1];
static int i_gt_f[1];
static int i_gt_d[1];
static int i_ge_e[1];
static int i_ge_f[1];
static int i_ge_d[1];
static int i_neg_w[1];
static int i_neg_f[1];
static int i_neg_d[1];
static int i_quot[1];
static int i_rem[1];
static int i_and[1];
static int i_or[1];
static int i_not[1];
static int i_ord[1];
static int i_chr[1];
static int i_seq[1];
static int i_string[1];
static int i_exit[MAX_ARG+1];
static int i_primitive[1];
static int i_push_heap[1];
static int i_unknown[1];

static int i_tableswitch[1];	/*PH*/
static int i_lookupswitch[1];	/*PH*/
static int i_mkioreturn[1];	/*MW*/
static int i_endcode[1];	/*PH*/
static int i_hputc[1];		/*PH*/
static int i_hgetc[1];		/*PH*/

static int total = 0;



typedef void (*fun)(CodePtr, char *, int *);



void genericByteIns (CodePtr ip, fun op0, fun op1, fun op2, fun opdef)
{
  switch(*ip) {

  case ZAP_ARG_I1: op0(ip,"ZAP_ARG_I1",i_zap_arg_i1); break;
  case ZAP_ARG_I2: op0(ip,"ZAP_ARG_I2",i_zap_arg_i2); break;
  case ZAP_ARG_I3: op0(ip,"ZAP_ARG_I3",i_zap_arg_i3); break;
  case ZAP_ARG:      op1(ip,"ZAP_ARG",i_zap_arg); break;
  case ZAP_STACK_P1: op1(ip,"ZAP_STACK_P1",i_zap_stack_p1); break;
  case ZAP_STACK_P2: op2(ip,"ZAP_STACK_P2",i_zap_stack_p2); break;

  case NEEDHEAP_I32: op0(ip,"NEEDHEAP_I32",i_needheap_i32); break;
  case NEEDHEAP_P1: op1(ip,"NEEDHEAP_P1",i_needheap_p1); break;
  case NEEDHEAP_P2: op2(ip,"NEEDHEAP_P2",i_needheap_p2); break;
  case NEEDSTACK_I16: op0(ip,"NEEDSTACK_I16",i_needstack_i16); break;
  case NEEDSTACK_P1: op1(ip,"NEEDSTACK_P1",i_needstack_p1); break;
  case NEEDSTACK_P2: op2(ip,"NEEDSTACK_P2",i_needstack_p2); break;

  case JUMP: op2(ip,"JUMP",i_jump); break;
  case JUMPFALSE: op2(ip,"JUMPFALSE",i_jumpfalse); break; /*DW/PH*/

  case NOP: op0(ip,"NOP",i_nop); break;

#if 0 /*DW/PH*/
  case MATCHCON: op0(ip,"MATCHCON",i_matchcon); break;
  case MATCHINT: op0(ip,"MATCHINT",i_matchint); break;
  case JUMPS_T: op0(ip,"JUMPS_T",i_jumps_t); break;
  case JUMPS_L: op0(ip,"JUMPS_L",i_jumps_l); break;
#endif

  case PUSH_CADR_N2: op2(ip,"PUSH_CADR_N2",i_push_cadr_n2); break;
  case PUSH_CADR_N1: op1(ip,"PUSH_CADR_N1",i_push_cadr_n1); break;
  case PUSH_CADR_P1: op1(ip,"PUSH_CADR_P1",i_push_cadr_p1); break;
  case PUSH_CADR_P2: op2(ip,"PUSH_CADR_P2",i_push_cadr_p2); break;
  case PUSH_CVAL_N2: op2(ip,"PUSH_CVAL_N2",i_push_cval_n2); break;
  case PUSH_CVAL_N1: op1(ip,"PUSH_CVAL_N1",i_push_cval_n1); break;
  case PUSH_CVAL_P1: op1(ip,"PUSH_CVAL_P1",i_push_cval_p1); break;
  case PUSH_CVAL_P2: op2(ip,"PUSH_CVAL_P2",i_push_cval_p2); break;
  case PUSH_INT_N2: op2(ip,"PUSH_INT_N2",i_push_int_n2); break;
  case PUSH_INT_N1: op1(ip,"PUSH_INT_N1",i_push_int_n1); break;
  case PUSH_INT_P1: op1(ip,"PUSH_INT_P1",i_push_int_p1); break;
  case PUSH_INT_P2: op2(ip,"PUSH_INT_P2",i_push_int_p2); break;
  case PUSH_CHAR_N1: op1(ip,"PUSH_CHAR_N1",i_push_char_n1); break;
  case PUSH_CHAR_P1: op1(ip,"PUSH_CHAR_P1",i_push_char_p1); break;
  case PUSH_ARG_I1: op0(ip,"PUSH_ARG_I1",i_push_arg_i1); break;
  case PUSH_ARG_I2: op0(ip,"PUSH_ARG_I2",i_push_arg_i2); break;
  case PUSH_ARG_I3: op0(ip,"PUSH_ARG_I3",i_push_arg_i3); break;
  case PUSH_ARG: op1(ip,"PUSH_ARG",i_push_arg); break;
  case PUSH_I1: op0(ip,"PUSH_I1",i_push_i1); break;
  case PUSH_P1: op1(ip,"PUSH_P1",i_push_p1); break;
  case PUSH_P2: op2(ip,"PUSH_P2",i_push_p2); break;

  case POP_I1: op0(ip,"POP_I1",i_pop_i1); break;
  case POP_P1: op1(ip,"POP_P1",i_pop_p1); break;
  case POP_P2: op2(ip,"POP_P2",i_pop_p2); break;
  case SLIDE_P1: op1(ip,"SLIDE_P1",i_slide_p1); break;
  case SLIDE_P2: op2(ip,"SLIDE_P2",i_slide_p2); break;
  case UNPACK: op1(ip,"UNPACK",i_unpack); break;

  case SELECTOR_EVAL: op0(ip,"SELECTOR_EVAL",i_selector_eval); break;
  case SELECT: op1(ip,"SELECT",i_select); break;

  case APPLY: op0(ip,"APPLY",i_apply); break;
  case EVAL: op0(ip,"EVAL",i_eval); break;

  case RETURN: op0(ip,"RETURN",i_return); break;
  case RETURN_EVAL: op0(ip,"RETURN_EVAL",i_return_eval); break;

  case HEAP_OFF_N2: op2(ip,"HEAP_OFF_N2",i_heap_off_n2); break;
  case HEAP_OFF_N1: op1(ip,"HEAP_OFF_N1",i_heap_off_n1); break;
  case HEAP_OFF_P1: op1(ip,"HEAP_OFF_P1",i_heap_off_p1); break;
  case HEAP_OFF_P2: op2(ip,"HEAP_OFF_P2",i_heap_off_p2); break;

  case HEAP_CREATE: op0(ip,"HEAP_CREATE",i_heap_create); break;
  case HEAP_SPACE: op0(ip,"HEAP_SPACE",i_heap_space); break;

  case HEAP_CADR_N2: op2(ip,"HEAP_CADR_N2",i_heap_cadr_n2); break;
  case HEAP_CADR_N1: op1(ip,"HEAP_CADR_N1",i_heap_cadr_n1); break;
  case HEAP_CADR_P1: op1(ip,"HEAP_CADR_P1",i_heap_cadr_p1); break;
  case HEAP_CADR_P2: op2(ip,"HEAP_CADR_P2",i_heap_cadr_p2); break;
  case HEAP_CVAL_N2: op2(ip,"HEAP_CVAL_N2",i_heap_cval_n2); break;
  case HEAP_CVAL_N1: op1(ip,"HEAP_CVAL_N1",i_heap_cval_n1); break;
  case HEAP_CVAL_IN3: op0(ip,"HEAP_CVAL_IN3",i_heap_cval_in3); break;
  case HEAP_CVAL_I3: op0(ip,"HEAP_CVAL_I3",i_heap_cval_i3); break;
  case HEAP_CVAL_I4: op0(ip,"HEAP_CVAL_I4",i_heap_cval_i4); break;
  case HEAP_CVAL_I5: op0(ip,"HEAP_CVAL_I4",i_heap_cval_i5); break;
  case HEAP_CVAL_P1: op1(ip,"HEAP_CVAL_P1",i_heap_cval_p1); break;
  case HEAP_CVAL_P2: op2(ip,"HEAP_CVAL_P2",i_heap_cval_p2); break;
  case HEAP_INT_N2: op2(ip,"HEAP_INT_N2",i_heap_int_n2); break;
  case HEAP_INT_N1: op1(ip,"HEAP_INT_N1",i_heap_int_n1); break;
  case HEAP_INT_P1: op1(ip,"HEAP_INT_P1",i_heap_int_p1); break;
  case HEAP_INT_P2: op2(ip,"HEAP_INT_P2",i_heap_int_p2); break;
  case HEAP_CHAR_N1: op1(ip,"HEAP_CHAR_N1",i_heap_char_n1); break;
  case HEAP_CHAR_P1: op1(ip,"HEAP_CHAR_P1",i_heap_char_p1); break;
  case HEAP_ARG: op0(ip,"HEAP_ARG",i_heap_arg); break;
  case HEAP_I1: op0(ip,"HEAP_I1",i_heap_i1); break;
  case HEAP_I2: op0(ip,"HEAP_I2",i_heap_i2); break;
  case HEAP_P1: op1(ip,"HEAP_P1",i_heap_p1); break;
  case HEAP_P2: op2(ip,"HEAP_P2",i_heap_p2); break;

  case ADD_W: op0(ip,"ADD_W",i_add_w); break;
  case ADD_F: op0(ip,"ADD_F",i_add_f); break;
  case ADD_D: op0(ip,"ADD_D",i_add_d); break;
  case SUB_W: op0(ip,"SUB_W",i_sub_w); break;
  case SUB_F: op0(ip,"SUB_F",i_sub_f); break;
  case SUB_D: op0(ip,"SUB_D",i_sub_d); break;
  case MUL_W: op0(ip,"MUL_W",i_mul_w); break;
  case MUL_F: op0(ip,"MUL_F",i_mul_f); break;
  case MUL_D: op0(ip,"MUL_D",i_mul_d); break;
  case ABS_W: op0(ip,"ABS_W",i_abs_w); break;
  case ABS_F: op0(ip,"ABS_F",i_abs_f); break;
  case ABS_D: op0(ip,"ABS_D",i_abs_d); break;
  case SIGNUM_W: op0(ip,"SIGNUM_W",i_signum_w); break;
  case SIGNUM_F: op0(ip,"SIGNUM_F",i_signum_f); break;
  case SIGNUM_D: op0(ip,"SIGNUM_D",i_signum_d); break;
  case EXP_F: op0(ip,"EXP_F",i_exp_f); break;
  case EXP_D: op0(ip,"EXP_D",i_exp_d); break;
  case POW_F: op0(ip,"POW_F",i_pow_f); break;
  case POW_D: op0(ip,"POW_D",i_pow_d); break;
  case LOG_F: op0(ip,"LOG_F",i_log_f); break;
  case LOG_D: op0(ip,"LOG_D",i_log_d); break;
  case SQRT_F: op0(ip,"SQRT_F",i_sqrt_f); break;
  case SQRT_D: op0(ip,"SQRT_D",i_sqrt_d); break;
  case SIN_F: op0(ip,"SIN_F",i_sin_f); break;
  case SIN_D: op0(ip,"SIN_D",i_sin_d); break;
  case COS_F: op0(ip,"COS_F",i_cos_f); break;
  case COS_D: op0(ip,"COS_D",i_cos_d); break;
  case TAN_F: op0(ip,"TAN_F",i_tan_f); break;
  case TAN_D: op0(ip,"TAN_D",i_tan_d); break;
  case ASIN_F: op0(ip,"ASIN_F",i_asin_f); break;
  case ASIN_D: op0(ip,"ASIN_D",i_asin_d); break;
  case ACOS_F: op0(ip,"ACOS_F",i_acos_f); break;
  case ACOS_D: op0(ip,"ACOS_D",i_acos_d); break;
  case ATAN_F: op0(ip,"ATAN_F",i_atan_f); break;
  case ATAN_D: op0(ip,"ATAN_D",i_atan_d); break;
  case SLASH_F: op0(ip,"SLASH_F",i_slash_f); break;
  case SLASH_D: op0(ip,"SLASH_D",i_slash_d); break;
  case EQ_W: op0(ip,"EQ_W",i_eq_w); break;
  case EQ_F: op0(ip,"EQ_F",i_eq_f); break;
  case EQ_D: op0(ip,"EQ_D",i_eq_d); break;
  case NE_W: op0(ip,"NE_W",i_ne_w); break;
  case NE_F: op0(ip,"NE_F",i_ne_f); break;
  case NE_D: op0(ip,"NE_D",i_ne_d); break;
  case LT_W: op0(ip,"LT_W",i_lt_w); break;
  case LT_F: op0(ip,"LT_F",i_lt_f); break;
  case LT_D: op0(ip,"LT_D",i_lt_d); break;
  case LE_W: op0(ip,"LE_W",i_le_w); break;
  case LE_F: op0(ip,"LE_F",i_le_f); break;
  case LE_D: op0(ip,"LE_D",i_le_d); break;
  case GT_W: op0(ip,"GT_W",i_gt_w); break;
  case GT_F: op0(ip,"GT_F",i_gt_f); break;
  case GT_D: op0(ip,"GT_D",i_gt_d); break;
  case GE_W: op0(ip,"GE_W",i_ge_e); break;
  case GE_F: op0(ip,"GE_F",i_ge_f); break;
  case GE_D: op0(ip,"GE_D",i_ge_d); break;
  case NEG_W: op0(ip,"NEG_W",i_neg_w); break;
  case NEG_F: op0(ip,"NEG_F",i_neg_f); break;
  case NEG_D: op0(ip,"NEG_D",i_neg_d); break;

  case QUOT: op0(ip,"QUOT",i_quot); break;
  case REM: op0(ip,"REM",i_rem); break;
  case AND: op0(ip,"AND",i_and); break;
  case OR: op0(ip,"OR",i_or); break;
  case NOT: op0(ip,"NOT",i_not); break;
  case ORD: op0(ip,"ORD",i_ord); break;
  case CHR: op0(ip,"CHR",i_chr); break;
  case SEQ: op0(ip,"SEQ",i_seq); break;
  case STRING: op0(ip,"STRING",i_string); break;
  case EXIT: op1(ip,"EXIT",i_exit); break;
  case PRIMITIVE: op0(ip,"PRIMITIVE",i_primitive); break;
  case PUSH_HEAP: op0(ip,"PUSH_HEAP",i_push_heap); break;
  case HPUTC: op0(ip,"HPUTC",i_hputc); break;				/*PH*/
  case HGETC: op0(ip,"HGETC",i_hgetc); break;				/*PH*/
  case TABLESWITCH: op0(ip,"TABLESWITCH",i_tableswitch); break;		/*PH*/
  case LOOKUPSWITCH: op0(ip,"LOOKUPSWITCH",i_lookupswitch); break;	/*PH*/
  case MKIORETURN: op0(ip,"MKIORETURN",i_mkioreturn); break;		/*MW*/
  case ENDCODE: op0(ip,"ENDCODE",i_endcode); break;			/*PH*/
  default:
    opdef(ip,"Unknown",i_unknown); break;
  }
}

static void incOp0(CodePtr ip, char *str, int* counter)
{
  counter[0]++;
}

static void incOp1(CodePtr ip, char *str, int* counter)
{
  int arg = ip[1];
  if(arg>=MAX_ARG) counter[MAX_ARG]++;
  else counter[arg]++;
}

static void incOp2(CodePtr ip, char *str, int* counter)
{
  unsigned int arg = (ip[2]<<8)+ip[1];
  if(arg>=MAX_ARG) counter[MAX_ARG]++;
  else counter[arg]++;
}

static void incDef(CodePtr ip, char *str, int* counter)
{
  fprintf(stderr,"Unknown instruction %3d at %08x\n",ip[0],ip);
  counter[0]++;
}


static void prOp0(CodePtr ip, char *str, int* counter)
{
  if(insCount>1 || counter[0]) {
    fprintf(stderr,"%15s  %10d\n",str,counter[0]);
    total += counter[0];
  }
}

static void prOpN(CodePtr ip, char *str, int* counter)
{
  int i;
  int tot = 0;
  for(i = 0; i <= MAX_ARG; i++)
    tot += counter[i];

  if(insCount>1 || tot) {
    fprintf(stderr,"%15s",str);
    for(i = 0; i <= MAX_ARG; i++) {
      fprintf(stderr,"  %10d",counter[i]);
      total += counter[i];
    }
    fprintf(stderr,"  (total = %10d)\n",tot);
  }
}

static void prDef(CodePtr ip, char *str, int* counter)
{
  if(counter[0]) {
    fprintf(stderr,"%15s  %10d\n",str,counter[0]);
    total += counter[0];
  }
}

void countIns(CodePtr ip)
{
  genericByteIns(ip,incOp0,incOp1,incOp2,incDef);
}

void printIns(void)
{
  Code code;
  int i;
  total = 0;
  fprintf(stderr,"Instruction counts\n");
  fprintf(stderr,"%15s","Argument");
  for(i=0; i<MAX_ARG; i++) {
    fprintf(stderr,"     %4d   ",i);
  }
  fprintf(stderr,"    >%4d   \n",MAX_ARG);
  for(i=0, code=0; i<256; i++,code++)
    genericByteIns(&code,prOp0,prOpN,prOpN,prDef);

  fprintf(stderr,"Total number of instructions   %d\n",total);
}

#endif


Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].