Branch: Tag:

1997-01-30

1997-01-30 03:51:37 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

many optimizations added (see Changelog)

Rev: src/builtin_functions.c:1.25
Rev: src/docode.c:1.10
Rev: src/interpret.c:1.23
Rev: src/language.yacc:1.21
Rev: src/las.c:1.16
Rev: src/lex.c:1.14
Rev: src/lex.h:1.3
Rev: src/peep.c:1.5
Rev: src/peep.in:1.3
Rev: src/pike_types.c:1.15
Rev: src/port.h:1.11

22:      dynamic_buffer instrbuf;    - static int hasarg(int opcode) - { -  switch(opcode) -  { -  case F_NUMBER: -  case F_NEG_NUMBER: -  case F_CALL_LFUN: -  case F_CALL_LFUN_AND_POP: -  case F_SSCANF: -  case F_POP_N_ELEMS: + static int hasarg(int opcode) { return instrs[opcode-F_OFFSET].hasarg; }    -  case F_SIZEOF_LOCAL: -  -  case F_ASSIGN_GLOBAL: -  case F_ASSIGN_GLOBAL_AND_POP: -  case F_ASSIGN_LOCAL: -  case F_ASSIGN_LOCAL_AND_POP: -  case F_GLOBAL_LVALUE: -  case F_LOCAL_LVALUE: -  case F_CLEAR_LOCAL: -  case F_LOCAL: -  case F_GLOBAL: -  -  case F_INC_LOCAL: -  case F_DEC_LOCAL: -  case F_POST_INC_LOCAL: -  case F_POST_DEC_LOCAL: -  case F_INC_LOCAL_AND_POP: -  case F_DEC_LOCAL_AND_POP: -  -  case F_LFUN: -  case F_STRING: -  case F_ARROW: -  case F_ARROW_STRING: -  case F_STRING_INDEX: -  case F_LOCAL_INDEX: -  case F_POS_INT_INDEX: -  case F_NEG_INT_INDEX: -  case F_CONSTANT: -  case F_SWITCH: -  case F_APPLY: -  case F_CATCH: -  -  case F_BRANCH: -  case F_BRANCH_WHEN_ZERO: -  case F_BRANCH_WHEN_NON_ZERO: -  -  case F_BRANCH_WHEN_EQ: -  case F_BRANCH_WHEN_NE: -  case F_BRANCH_WHEN_LT: -  case F_BRANCH_WHEN_LE: -  case F_BRANCH_WHEN_GT: -  case F_BRANCH_WHEN_GE: -  -  case F_FOREACH: -  case F_INC_LOOP: -  case F_DEC_LOOP: -  case F_INC_NEQ_LOOP: -  case F_DEC_NEQ_LOOP: -  -  case F_LAND: -  case F_LOR: -  -  case F_ALIGN: -  case F_POINTER: -  case F_LABEL: -  return 1; -  -  default: -  return 0; -  } - } -  +    void init_bytecode()   {    low_reinit_buf(&instrbuf);
170:    ADD_COMPILED(b);       b-=F_OFFSET; + #ifdef DEBUG    if(b>255) -  { -  switch(b >> 8) -  { -  case 1: ins_f_byte(F_ADD_256); break; -  case 2: ins_f_byte(F_ADD_512); break; -  case 3: ins_f_byte(F_ADD_768); break; -  case 4: ins_f_byte(F_ADD_1024); break; -  default: -  ins_f_byte(F_ADD_256X); -  ins_byte(b/256,A_PROGRAM); -  } -  b&=255; -  } +  error("Instruction too big %d\n",b); + #endif    ins_byte((unsigned char)b,A_PROGRAM);   }   
260:    while(PC % c->arg) ins_byte(0, A_PROGRAM);    break;    +  case F_BYTE: +  ins_byte(c->arg, A_PROGRAM); +  break; +     case F_LABEL:   #ifdef DEBUG    if(c->arg > max_label || c->arg < 0)
309:    jumps[c->arg]=tmp;    break;    -  case F_APPLY: -  ins_f_byte(c->arg + F_MAX_OPCODE); -  break; -  +     default:    if(hasarg(c->opcode))    ins_f_byte_with_arg(c->opcode, c->arg);