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.45 2005/06/23 16:30:02 grubba Exp $ + || $Id: sparc.c,v 1.46 2005/06/27 18:00:12 grubba Exp $   */      /*    * Machine code generator for sparc.    *    * Henrik Grubbström 20010720    */      #include "global.h"   #include "svalue.h"
pike.git/src/code/sparc.c:103:   #define SPARC_OP3_LDX 0x0b   #define SPARC_OP3_STW 0x04   #define SPARC_OP3_STH 0x06   #define SPARC_OP3_STX 0x0e      #define SPARC_MEM_OP(OP3, D, S1, S2, I) \    add_to_program(0xc0000000|((D)<<25)|((OP3)<<19)|((S1)<<14)|((I)<<13)| \    ((S2)&0x1fff))      #define SPARC_OR(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_OR, D, S1, S2, I) + #define SPARC_XOR(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_XOR, D, S1, S2, I)      #define SPARC_SRA(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_SRA, D, S1, S2, I)   #define SPARC_SLL(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_SLL, 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)
pike.git/src/code/sparc.c:146:    add_to_program(0x40000000 | (((DISP30) >> 2) & 0x3fffffff))         #define SET_REG(REG, X) do { \    INT64 val_ = X; \    INT32 reg_ = REG; \    /*fprintf(stderr, "SET_REG(0x%02x, %p)\n", reg_, (void *)val_);*/ \    if ((-4096 <= val_) && (val_ <= 4095)) { \    /* or %g0, val_, reg */ \    SPARC_OR(reg_, SPARC_REG_G0, val_, 1); \ -  } else if ((-0x80000000LL <= val_) && (val_ <= 0x7fffffffLL)) { \ +  } else if (val_ < 0) { \ +  if ((-0x80000000LL <= val_)) { \ +  /* sethi %hi(~val_) */ \ +  SPARC_SETHI(reg_, ~val_); \ +  /* xor reg, %lo(val_)|0x1c00, reg */ \ +  SPARC_XOR(reg_, reg_, (val_ & 0x3ff)|0x1c00, 1); \ +  } else { \ +  /* FIXME: SPARC64 */ \ +  Pike_fatal("Value out of range: %p\n", (void *)val_); \ +  } \ +  } else { \ +  if (val_ <= 0x7fffffffLL) { \    /* sethi %hi(val_), reg */ \ -  SPARC_SETHI(reg_, val_); \ +  SPARC_SETHI(reg_, val_); \    if (val_ & 0x3ff) { \    /* or reg, %lo(val_), reg */ \ -  SPARC_OR(reg_, reg_, val_ & 0x3ff, 1); \ -  } \ -  if (val_ < 0) { \ -  /* Sign extend. */ \ -  /* sra reg, %g0, reg */ \ -  SPARC_SRA(reg_, reg_, SPARC_REG_G0, 0); \ -  } \ -  } else { \ -  /* FIXME: SPARC64 */ \ -  if (!(val_>>34)) { \ +  SPARC_OR(reg_, reg_, val_ & 0x3ff, 1); \ +  } \ +  } else if (!(val_>>34)) { \    /* The top 30 bits are zero. */ \    SPARC_SETHI(reg_, val_>>2); \    SPARC_SLL(reg_, reg_, 2, 1); \    if (val_ & 0xfff) { \    SPARC_OR(reg_, reg_, val_ & 0xfff, 1); \    } \ -  } else { \ +  } else { \ +  /* FIXME: SPARC64 */ \    Pike_fatal("Value out of range: %p\n", (void *)val_); \    } \    } \    } while(0)       /* FIXME: SPARC64 */   #define ADD_CALL(X, DELAY_OK) do { \    PIKE_OPCODE_T *ptr_ = (PIKE_OPCODE_T *)(X); \    ptrdiff_t delta_; \    struct program *p_ = Pike_compiler->new_program; \
pike.git/src/code/sparc.c:812:    return;    case F_LFUN:    sparc_push_lfun(b);    return;    case F_MARK_X:    sparc_mark(-(ptrdiff_t)b);    return;    case F_LOCAL_LVALUE:    sparc_local_lvalue(b);    return; +  case F_POS_INT_INDEX: +  sparc_push_int(b, 0); +  low_ins_f_byte(F_INDEX, 1); +  return; +  case F_NEG_INT_INDEX: +  sparc_push_int(-(ptrdiff_t)b, 0); +  low_ins_f_byte(F_INDEX, 1); +  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)   {