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.28 2002/11/09 13:41:14 grubba Exp $ + || $Id: sparc.c,v 1.29 2002/11/10 18:33:56 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_JMPL 0x38   #define SPARC_OP3_RETURN 0x39   #define SPARC_OP3_SAVE 0x3c -  + #define SPARC_OP3_RESTORE 0x3d      #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   #define SPARC_OP3_LDUH 0x02
pike.git/src/code/sparc.c:106:      #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_JMPL(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_JMPL, D, S1, S2, I) + #define SPARC_RET() SPARC_JMPL(SPARC_REG_G0, SPARC_REG_I7, 8, 1) + #define SPARC_RESTORE(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_RESTORE, D, 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:442:   {    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); + #if 0 +  /* The following code is Sparc V9 only code. */    /* return %i7 + 8 */    SPARC_RETURN(SPARC_REG_I7, 8, 1);    /* or %g0, -2, %o0 */    SPARC_OR(SPARC_REG_O0, SPARC_REG_G0, -2, 1); -  + #else /* ! 0 */ +  /* Sparc V7 & V8 code. */ +  /* or %g0, -2, %i0 */ +  SPARC_OR(SPARC_REG_I0, SPARC_REG_G0, -2, 1); +  /* ret */ +  SPARC_RET(); +  /* restore */ +  SPARC_RESTORE(SPARC_REG_G0, SPARC_REG_G0, SPARC_REG_G0, 0); + #endif /* 0 */    SPARC_UNLOAD_CACHED();   }      /*    *    */      static void low_ins_call(void *addr, int delay_ok)   {    SPARC_FLUSH_UNSTORED();
pike.git/src/code/sparc.c:517:    /* This is not very pretty */    switch(b)    {    case F_MARK2 - F_OFFSET:    sparc_mark(0);    /* FALL_THROUGH */    case F_SYNCH_MARK - F_OFFSET:    case F_MARK - F_OFFSET:    sparc_mark(0);    return; +     case F_POP_MARK - F_OFFSET:    sparc_incr_mark_sp(-1);    return;    case F_UNDEFINED - F_OFFSET:    sparc_push_int(0, 1);    return; -  case F_CONST0 - F_OFFSET: -  sparc_push_int(0, 0); -  return; -  case F_CONST1 - F_OFFSET: -  sparc_push_int(1, 0); -  return; +     case F_MARK_AND_CONST0 - F_OFFSET:    sparc_mark(0); -  +  /* FALL_THROUGH */ +  case F_CONST0 - F_OFFSET:    sparc_push_int(0, 0);    return; -  +     case F_MARK_AND_CONST1 - F_OFFSET:    sparc_mark(0); -  +  /* FALL_THROUGH */ +  case F_CONST1 - F_OFFSET:    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 */
pike.git/src/code/sparc.c:789:    fprintf(stderr, "%scc ", mnemonic);    } else {    fprintf(stderr, "%s ", mnemonic);    }    } else {    switch(op3) {    case SPARC_OP3_SLL: mnemonic = "sll"; break;    case SPARC_OP3_SRL: mnemonic = "srl"; break;    case SPARC_OP3_SRA: mnemonic = "sra"; break;    case SPARC_OP3_RD: mnemonic = "rd"; break; +  case SPARC_OP3_JMPL: mnemonic = "jmpl"; break; +  case SPARC_OP3_RETURN:mnemonic = "return"; break;    case SPARC_OP3_SAVE: mnemonic = "save"; break; -  +  case SPARC_OP3_RESTORE:mnemonic = "restore"; break;    default:    sprintf(buf, "op3(0x%02x)", op3);    mnemonic = buf;    break;    }    fprintf(stderr, "%s ", mnemonic);    }    if (op3 == SPARC_OP3_RD) {    sparc_disass_rd_reg(opcode>>14);    fprintf(stderr, ", ");