pike.git / src / peep.c

version» Context lines:

pike.git/src/peep.c:11:   #include "pike_memory.h"   #include "peep.h"   #include "dmalloc.h"   #include "stuff.h"   #include "bignum.h"   #include "opcodes.h"   #include "builtin_functions.h"   #include "constants.h"   #include "interpret.h"    - RCSID("$Id: peep.c,v 1.58 2001/07/17 20:16:40 grubba Exp $"); + RCSID("$Id: peep.c,v 1.59 2001/07/17 22:03:33 grubba Exp $");      static void asm_opt(void);      dynamic_buffer instrbuf;      static int hasarg(int opcode)   {    return instrs[opcode-F_OFFSET].flags & I_HASARG;   }   
pike.git/src/peep.c:133:    p[instr].arg=arg;   }         /**** Bytecode Generator *****/      #ifdef PIKE_USE_MACHINE_CODE   /* FIXME: Move this to pike_cpulib.h */   #ifdef __GNUC__    + #ifdef __i386__ +    #define PUSH_INT(X) ins_int((INT32)(X), add_to_program)   #define PUSH_ADDR(X) PUSH_INT((X))    - #ifdef __i386__ -  +    /* This is ugly, but since the code may be moved we cannot use    * relative addressing :(    */   #define CALL_ABSOLUTE(X) do{ \    add_to_program(0xb8); /* mov $xxx,%eax */ \    PUSH_INT(X); \    add_to_program(0xff); /* jsr *(%eax) */ \    add_to_program(0xd0); \   }while(0)   
pike.git/src/peep.c:175:   #define REG_O4 12   #define REG_O5 13   #define REG_O6 14   #define REG_O7 15      #define SET_REG(REG, X) do { \    INT32 val_ = X; \    INT32 reg_ = REG; \    if ((-4096 <= val_) && (val_ <= 4095)) { \    /* or %g0, val_, reg */ \ -  PUSH_INT(0x80102000|(reg_<<25)|(val_ & 0x1fff)); \ +  add_to_program(0x80102000|(reg_<<25)|(val_ & 0x1fff)); \    } else { \    /* sethi %hi(val_), reg */ \ -  PUSH_INT(0x01000000|(reg_<<25)|((val_ >> 10)&0x3fffff)); \ +  add_to_program(0x01000000|(reg_<<25)|((val_ >> 10)&0x3fffff)); \    if (val_ & 0x3ff) { \    /* or reg, %lo(val_), reg */ \ -  PUSH_INT(0x80102000|(reg_<<25)|(reg_<<14)|(val_ & 0x0fff)); \ +  add_to_program(0x80102000|(reg_<<25)|(reg_<<14)|(val_ & 0x0fff)); \    } \    if (val_ < 0) { \    /* sra reg, %g0, reg */ \ -  PUSH_INT(0x81380000|(reg_<<25)|(reg_<<14)); \ +  add_to_program(0x81380000|(reg_<<25)|(reg_<<14)); \    } \    } \    } while(0)    - #define CALL_ABSOLUTE(X) do { \ -  SET_REG(REG_O2, (INT32)(X)); \ -  /* jmpl %o2, %o7 */ \ -  PUSH_INT(0x81c00000|(REG_O7<<25)|(REG_O2<<14)); \ -  /* noop */ \ -  PUSH_INT(0x01000000); \ + #define CALL_ABSOLUTE(X) do { \ +  SET_REG(REG_O2, (INT32)(X)); \ +  /* jmpl %o2, %o7 */ \ +  add_to_program(0x81c00000|(REG_O7<<25)|(REG_O2<<14)); \ +  /* noop */ \ +  add_to_program(0x01000000); \    } while(0)    - #define UPDATE_PC() do { \ -  INT32 tmp = PC; \ -  SET_REG(REG_O3, ((INT32)(&Pike_interpreter.frame_pointer))); \ -  /* lduw %o3, %o3 */ \ -  PUSH_INT(0xc0000000|(REG_O3<<25)|(REG_O3<<14)); \ -  SET_REG(REG_O4, tmp); \ -  /* stw %o4, yy(%o3) */ \ -  PUSH_INT(0xc0202000|(REG_O4<<25)|(REG_O3<<14)|OFFSETOF(pike_frame, pc)); \ + #if 0 + #define UPDATE_PC() do { \ +  INT32 tmp = PC; \ +  SET_REG(REG_O3, ((INT32)(&Pike_interpreter.frame_pointer))); \ +  /* lduw %o3, %o3 */ \ +  add_to_program(0xc0000000|(REG_O3<<25)|(REG_O3<<14)); \ +  SET_REG(REG_O4, tmp); \ +  /* stw %o4, yy(%o3) */ \ +  add_to_program(0xc0202000|(REG_O4<<25)|(REG_O3<<14)| \ +  OFFSETOF(pike_frame, pc)); \    } while(0) -  + #else + #define UPDATE_PC() + #endif   #endif /* __i386__ || sparc */   #endif /* __GNUC__ */      #else /* !PIKE_USE_MACHINE_CODE */   #undef UPDATE_PC   #define UPDATE_PC()   #endif /* PIKE_USE_MACHINE_CODE */      void ins_f_byte(unsigned int b)   {
pike.git/src/peep.c:503:    break;    case F_ALIGN:   #ifndef HAVE_COMPUTED_GOTO    while(PC % c->arg) add_to_program(0);   #endif /* HAVE_COMPUTED_GOTO */    break;       case F_BYTE:   #ifdef HAVE_COMPUTED_GOTO    add_to_program((void *)(ptrdiff_t)(unsigned char)(c->arg)); + #elif defined(PIKE_USE_MACHINE_CODE) && defined(sparc) +  add_to_program(c->arg);   #else /* !HAVE_COMPUTED_GOTO */    add_to_program((unsigned char)(c->arg));   #endif /* HAVE_COMPUTED_GOTO */    break;       case F_DATA:   #ifdef HAVE_COMPUTED_GOTO    add_to_program((void *)(ptrdiff_t)c->arg); -  + #elif defined(PIKE_USE_MACHINE_CODE) && defined(sparc) +  add_to_program(c->arg);   #else /* !HAVE_COMPUTED_GOTO */    ins_int(c->arg, (void(*)(char))add_to_program);   #endif /* HAVE_COMPUTED_GOTO */    break;       case F_LABEL:    if(c->arg == -1) break;   #ifdef PIKE_DEBUG    if(c->arg > max_label || c->arg < 0)    fatal("max_label calculation failed!\n");
pike.git/src/peep.c:546:    case I_ISJUMP:    ins_f_byte(c->opcode);       case I_ISPOINTER:   #ifdef PIKE_DEBUG    if(c->arg > max_label || c->arg < 0) fatal("Jump to unknown label?\n");   #endif    tmp = DO_NOT_WARN((INT32)PC);   #ifdef HAVE_COMPUTED_GOTO    add_to_program(jumps[c->arg]); + #elif defined(PIKE_USE_MACHINE_CODE) && defined(sparc) +  add_to_program(jumps[c->arg]);   #else /* !HAVE_COMPUTED_GOTO */    ins_int(jumps[c->arg], (void(*)(char))add_to_program);   #endif /* HAVE_COMPUTED_GOTO */    jumps[c->arg]=tmp;    break;       case I_TWO_ARGS:    ins_f_byte_with_2_args(c->opcode, c->arg, c->arg2);    break;   
pike.git/src/peep.c:576:    fatal("Unknown instruction type.\n");   #endif    }    }       c++;    }       for(e=0;e<=max_label;e++)    { -  int tmp2=labels[e]; +  INT32 tmp2=labels[e];       while(jumps[e]!=-1)    {   #ifdef PIKE_DEBUG    if(labels[e]==-1)    fatal("Hyperspace error: unknown jump point %ld at %d (pc=%x).\n",    PTRDIFF_T_TO_LONG(e), labels[e], jumps[e]);   #endif   #ifdef HAVE_COMPUTED_GOTO    tmp = (int)(ptrdiff_t)(Pike_compiler->new_program->program[jumps[e]]);    Pike_compiler->new_program->program[jumps[e]] =    (PIKE_OPCODE_T)(ptrdiff_t)(tmp2 - jumps[e]);    jumps[e] = tmp; -  + #elif defined(PIKE_USE_MACHINE_CODE) && defined(sparc) +  tmp = Pike_compiler->new_program->program[jumps[e]]; +  Pike_compiler->new_program->program[jumps[e]] = tmp2 - jumps[e]; +  jumps[e] = tmp;   #else /* !HAVE_COMPUTED_GOTO */    tmp=read_int(jumps[e]);    upd_int(jumps[e], tmp2 - jumps[e]);    jumps[e]=tmp;   #endif /* HAVE_COMPUTED_GOTO */    }    }       free((char *)labels);    free((char *)jumps);