pike.git / src / code / sparc.c

version» Context lines:

pike.git/src/code/sparc.c:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: sparc.c,v 1.27 2002/11/08 17:37:00 grubba Exp $ + || $Id: sparc.c,v 1.28 2002/11/09 13:41:14 grubba Exp $   */      /*    * Machine code generator for sparc.    *    * Henrik Grubbström 20010720    */      #include "global.h"   #include "svalue.h"
pike.git/src/code/sparc.c:74:   #define SPARC_OP3_ADDC 0x08   #define SPARC_OP3_ADDCcc 0x18   #define SPARC_OP3_SUB 0x04   #define SPARC_OP3_SUBcc 0x14   #define SPARC_OP3_SUBC 0x0c   #define SPARC_OP3_SUBCcc 0x1c   #define SPARC_OP3_SLL 0x25   #define SPARC_OP3_SRL 0x26   #define SPARC_OP3_SRA 0x27   #define SPARC_OP3_RD 0x28 + #define SPARC_OP3_RETURN 0x39   #define SPARC_OP3_SAVE 0x3c      #define SPARC_RD_REG_CCR 0x02   #define SPARC_RD_REG_PC 0x05      #define SPARC_ALU_OP(OP3, D, S1, S2, I) \    add_to_program(0x80000000|((D)<<25)|((OP3)<<19)|((S1)<<14)|((I)<<13)| \    ((S2)&0x1fff))      #define SPARC_OP3_LDUW 0x00
pike.git/src/code/sparc.c:103:      #define SPARC_OR(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_OR, D, S1, S2, I)      #define SPARC_SRA(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_SRA, D, S1, S2, I)      #define SPARC_ADD(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_ADD, D, S1, S2, I)   #define SPARC_SUBcc(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_SUBcc, D, S1, S2, I)      #define SPARC_RD(D, RDREG) SPARC_ALU_OP(SPARC_OP3_RD, D, RDREG, 0, 0)    + #define SPARC_RETURN(S1, S2, I) SPARC_ALU_OP(SPARC_OP3_RETURN, 0, S1, S2, I) +    #define SPARC_LDUW(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_LDUW, D, S1, S2, I)   #define SPARC_LDUH(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_LDUH, D, S1, S2, I)      #define SPARC_STW(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_STW, D, S1, S2, I)   #define SPARC_STH(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_STH, D, S1, S2, I)      #define SPARC_SETHI(D, VAL) \    add_to_program(0x01000000|((D)<<25)|(((VAL)>>10)&0x3fffff))      #define SPARC_BE(DISP22, A) \
pike.git/src/code/sparc.c:276:   {    /* save %sp, -112, %sp */    add_to_program(0x81e02000|(SPARC_REG_SP<<25)|    (SPARC_REG_SP<<14)|((-112)&0x1fff));    FLUSH_CODE_GENERATOR_STATE();   }      /* Update Pike_fp->pc */   void sparc_update_pc(void)   { +  LOAD_PIKE_FP();    /* rd %pc, %i0 */    SPARC_RD(SPARC_REG_I0, SPARC_RD_REG_PC); -  LOAD_PIKE_FP(); +     /* stw %pc, [ %pike_fp + pc ] */    SPARC_STW(SPARC_REG_I0, SPARC_REG_PIKE_FP, OFFSETOF(pike_frame, pc), 1);   }      /*    * Opcode implementations.    */      #define MAKE_TYPE_WORD(TYPE, SUB_TYPE) (((TYPE) << 16)|(SUB_TYPE))   
pike.git/src/code/sparc.c:402:    sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE;   }      void sparc_local_lvalue(unsigned int no)   {    LOAD_PIKE_SP();    LOAD_PIKE_FP();    SET_REG(SPARC_REG_I0, T_LVALUE);    /* sth %i0, [ %pike_sp, %g0 ] */    SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP, SPARC_REG_G0, 0); -  SET_REG(SPARC_REG_I1, no * sizeof(struct svalue)); +  SET_REG(SPARC_REG_I0, T_VOID); +  no *= sizeof(struct svalue); +  if (no < 4096) {    /* lduw [ %pike_fp, %offset(pike_frame, locals) ], %i2 */    SPARC_LDUW(SPARC_REG_I2, SPARC_REG_PIKE_FP,    OFFSETOF(pike_frame, locals), 1); -  SET_REG(SPARC_REG_I0, T_VOID); +  /* add %i2, no * sizeof(struct svalue), %i2 */ +  SPARC_ADD(SPARC_REG_I2, SPARC_REG_I2, no, 1); +  } else { +  SET_REG(SPARC_REG_I1, no); +  /* lduw [ %pike_fp, %offset(pike_frame, locals) ], %i2 */ +  SPARC_LDUW(SPARC_REG_I2, SPARC_REG_PIKE_FP, +  OFFSETOF(pike_frame, locals), 1); +  /* add %i2, %i1, %i2 */ +  SPARC_ADD(SPARC_REG_I2, SPARC_REG_I2, SPARC_REG_I1, 0); +  }    /* stw %i2, [ %pike_sp, %offset(svalue, u.lval) ] */    SPARC_STW(SPARC_REG_I2, SPARC_REG_PIKE_SP,    OFFSETOF(svalue, u.lval), 1);    /* add %pike_sp, sizeof(struct svalue) * 2, %pike_sp */    SPARC_ADD(SPARC_REG_PIKE_SP, SPARC_REG_PIKE_SP, sizeof(struct svalue)*2, 1);    /* sth %i0, [ %pike_sp , -sizeof(struct svalue) ] */    SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP, -sizeof(struct svalue), 1);    sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE;   }    -  + void sparc_escape_catch(void) + { +  LOAD_PIKE_FP(); +  SPARC_FLUSH_UNSTORED(); +  /* rd %pc, %i0 */ +  SPARC_RD(SPARC_REG_I0, SPARC_RD_REG_PC); +  /* add %i0, 20, %i0 */ +  SPARC_ADD(SPARC_REG_I0, SPARC_REG_I0, 20, 1); +  /* stw %i0, [ %pike_fp, %offset(pike_frame, pc) ] */ +  SPARC_STW(SPARC_REG_I0, SPARC_REG_PIKE_FP, +  OFFSETOF(pike_frame, pc), 1); +  /* return %i7 + 8 */ +  SPARC_RETURN(SPARC_REG_I7, 8, 1); +  /* or %g0, -2, %o0 */ +  SPARC_OR(SPARC_REG_O0, SPARC_REG_G0, -2, 1); +  SPARC_UNLOAD_CACHED(); + } +    /*    *    */      static void low_ins_call(void *addr, int delay_ok)   {    SPARC_FLUSH_UNSTORED();       {    static int last_prog_id=-1;
pike.git/src/code/sparc.c:512:    sparc_mark(0);    sparc_push_int(1, 0);    return;    case F_CONST_1 - F_OFFSET:    sparc_push_int(-1, 0);    return;    case F_BIGNUM - F_OFFSET:    sparc_push_int(0x7fffffff, 0);    return;    +  case F_EXIT_CATCH - F_OFFSET: +  sparc_push_int(0, 1); +  /* FALL_THROUGH */ +  case F_ESCAPE_CATCH - F_OFFSET: +  sparc_escape_catch(); +  return; +    #define F_ALIAS(F_FUN, O_FUN) \    case F_FUN - F_OFFSET: \    addr = (void *)O_FUN; \    break       case F_MAKE_ITERATOR - F_OFFSET:    {    extern void f_Iterator(INT32);    SET_REG(SPARC_REG_O0, 1);    delay_ok = 1;
pike.git/src/code/sparc.c:574:    return;    case F_NEG_NUMBER:    sparc_push_int(-b, 0);    return;    case F_LFUN:    sparc_push_lfun(b);    return;    case F_MARK_X:    sparc_mark(-b);    return; +  case F_LOCAL_LVALUE: +  sparc_local_lvalue(b); +  return;    }    SET_REG(SPARC_REG_O0, b);    low_ins_f_byte(a, 1);    return;   }      void ins_f_byte_with_2_args(unsigned int a,    unsigned INT32 c,    unsigned INT32 b)   {