pike.git / src / code / sparc.c

version» Context lines:

pike.git/src/code/sparc.c:1:   /* -  * $Id: sparc.c,v 1.3 2001/07/20 16:21:32 grubba Exp $ +  * $Id: sparc.c,v 1.4 2001/07/20 19:44:59 grubba Exp $    *    * Machine code generator for sparc.    *    * Henrik Grubbström 20010720    */    - #define CALL_ABSOLUTE(X) do { \ + #define ADD_CALL(X, DELAY_OK) do { \    INT32 delta_; \    struct program *p_ = Pike_compiler->new_program; \    INT32 off_ = p_->num_program; \ -  /* call X */ \ +  /* noop */ \ +  INT32 delay_ = 0x01000000; \ +  \ +  if (DELAY_OK) { \ +  /* Move the previous opcode to the delay-slot. */ \ +  delay_ = p_->program[--off_]; \ +  } else { \    add_to_program(0); /* Placeholder... */ \ -  +  } \ +  /* call X */ \    delta_ = ((PIKE_OPCODE_T *)(X)) - (p_->program + off_); \    p_->program[off_] = 0x40000000 | (delta_ & 0x3fffffff); \    add_to_relocations(off_); \ -  /* noop */ \ -  add_to_program(0x01000000); \ +  add_to_program(delay_); \    } while(0)    - void ins_f_byte(unsigned int b) + static void low_ins_f_byte(unsigned int b, int delay_ok)   {   #ifdef PIKE_DEBUG    if(store_linenumbers && b<F_MAX_OPCODE)    ADD_COMPILED(b);   #endif /* PIKE_DEBUG */       b-=F_OFFSET;   #ifdef PIKE_DEBUG    if(b>255)    Pike_error("Instruction too big %d\n",b);   #endif    -  do{ +  {    static int last_prog_id=-1;    static int last_num_linenumbers=-1;    if(last_prog_id != Pike_compiler->new_program->id ||    last_num_linenumbers != Pike_compiler->new_program->num_linenumbers)    {    last_prog_id=Pike_compiler->new_program->id;    last_num_linenumbers = Pike_compiler->new_program->num_linenumbers;    UPDATE_PC(); -  +  delay_ok = 1;    } -  }while(0); +  }    -  CALL_ABSOLUTE(instrs[b].address); -  return; +  ADD_CALL(instrs[b].address, delay_ok);   }    -  + void ins_f_byte(unsigned int opcode) + { +  low_ins_f_byte(opcode, 0); + } +    void ins_f_byte_with_arg(unsigned int a,unsigned INT32 b)   {    SET_REG(REG_O0, b); -  ins_f_byte(a); +  low_ins_f_byte(a, 1);    return;   }      void ins_f_byte_with_2_args(unsigned int a,    unsigned INT32 c,    unsigned INT32 b)   {    SET_REG(REG_O0, c);    SET_REG(REG_O1, b); -  ins_f_byte(a); +  low_ins_f_byte(a, 1);    return;   }      #define addstr(s, l) low_my_binary_strcat((s), (l), buf)   #define adddata2(s,l) addstr((char *)(s),(l) * sizeof((s)[0]));      void sparc_encode_program(struct program *p, struct dynamic_buffer_s *buf)   {    size_t prev = 0, rel;    /* De-relocate the program... */
pike.git/src/code/sparc.c:107: Inside #if defined(PIKE_DEBUG)
   if ((prog[p->relocations[rel]] & 0xc0000000) != 0x40000000) {    Pike_error("Bad relocation: %d, off:%d, opcode: 0x%08x\n",    rel, p->relocations[rel],    prog[p->relocations[rel]]);    }   #endif /* PIKE_DEBUG */    prog[p->relocations[rel]] = 0x40000000 |    (((prog[p->relocations[rel]] & 0x3fffffff) - delta) &    0x3fffffff);    } - #endif /* sparc */ +    }