Diff for /embedaddon/pcre/sljit/sljitNativePPC_32.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/02/21 23:50:25 version 1.1.1.3, 2013/07/22 08:25:57
Line 26 Line 26
   
 /* ppc 32-bit arch dependent functions. */  /* ppc 32-bit arch dependent functions. */
   
static int load_immediate(struct sljit_compiler *compiler, int reg, sljit_w imm)static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si reg, sljit_sw imm)
 {  {
         if (imm <= SIMM_MAX && imm >= SIMM_MIN)          if (imm <= SIMM_MAX && imm >= SIMM_MIN)
                 return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm));                  return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm));
Line 41  static int load_immediate(struct sljit_compiler *compi Line 41  static int load_immediate(struct sljit_compiler *compi
 #define INS_CLEAR_LEFT(dst, src, from) \  #define INS_CLEAR_LEFT(dst, src, from) \
         (RLWINM | S(src) | A(dst) | ((from) << 6) | (31 << 1))          (RLWINM | S(src) | A(dst) | ((from) << 6) | (31 << 1))
   
static SLJIT_INLINE int emit_single_op(struct sljit_compiler *compiler, int op, int flags,static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags,
        int dst, int src1, int src2)        sljit_si dst, sljit_si src1, sljit_si src2)
 {  {
         switch (op) {          switch (op) {
           case SLJIT_MOV:
           case SLJIT_MOV_UI:
           case SLJIT_MOV_SI:
           case SLJIT_MOV_P:
                   SLJIT_ASSERT(src1 == TMP_REG1);
                   if (dst != src2)
                           return push_inst(compiler, OR | S(src2) | A(dst) | B(src2));
                   return SLJIT_SUCCESS;
   
           case SLJIT_MOV_UB:
           case SLJIT_MOV_SB:
                   SLJIT_ASSERT(src1 == TMP_REG1);
                   if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
                           if (op == SLJIT_MOV_SB)
                                   return push_inst(compiler, EXTSB | S(src2) | A(dst));
                           return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24));
                   }
                   else if ((flags & REG_DEST) && op == SLJIT_MOV_SB)
                           return push_inst(compiler, EXTSB | S(src2) | A(dst));
                   else {
                           SLJIT_ASSERT(dst == src2);
                   }
                   return SLJIT_SUCCESS;
   
           case SLJIT_MOV_UH:
           case SLJIT_MOV_SH:
                   SLJIT_ASSERT(src1 == TMP_REG1);
                   if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
                           if (op == SLJIT_MOV_SH)
                                   return push_inst(compiler, EXTSH | S(src2) | A(dst));
                           return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16));
                   }
                   else {
                           SLJIT_ASSERT(dst == src2);
                   }
                   return SLJIT_SUCCESS;
   
           case SLJIT_NOT:
                   SLJIT_ASSERT(src1 == TMP_REG1);
                   return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));
   
           case SLJIT_NEG:
                   SLJIT_ASSERT(src1 == TMP_REG1);
                   return push_inst(compiler, NEG | OERC(flags) | D(dst) | A(src2));
   
           case SLJIT_CLZ:
                   SLJIT_ASSERT(src1 == TMP_REG1);
                   return push_inst(compiler, CNTLZW | RC(flags) | S(src2) | A(dst));
   
         case SLJIT_ADD:          case SLJIT_ADD:
                 if (flags & ALT_FORM1) {                  if (flags & ALT_FORM1) {
                         /* Flags does not set: BIN_IMM_EXTS unnecessary. */                          /* Flags does not set: BIN_IMM_EXTS unnecessary. */
Line 71  static SLJIT_INLINE int emit_single_op(struct sljit_co Line 120  static SLJIT_INLINE int emit_single_op(struct sljit_co
   
         case SLJIT_ADDC:          case SLJIT_ADDC:
                 if (flags & ALT_FORM1) {                  if (flags & ALT_FORM1) {
                        FAIL_IF(push_inst(compiler, MFXER | S(0)));                        FAIL_IF(push_inst(compiler, MFXER | D(0)));
                         FAIL_IF(push_inst(compiler, ADDE | D(dst) | A(src1) | B(src2)));                          FAIL_IF(push_inst(compiler, ADDE | D(dst) | A(src1) | B(src2)));
                         return push_inst(compiler, MTXER | S(0));                          return push_inst(compiler, MTXER | S(0));
                 }                  }
Line 106  static SLJIT_INLINE int emit_single_op(struct sljit_co Line 155  static SLJIT_INLINE int emit_single_op(struct sljit_co
   
         case SLJIT_SUBC:          case SLJIT_SUBC:
                 if (flags & ALT_FORM1) {                  if (flags & ALT_FORM1) {
                        FAIL_IF(push_inst(compiler, MFXER | S(0)));                        FAIL_IF(push_inst(compiler, MFXER | D(0)));
                         FAIL_IF(push_inst(compiler, SUBFE | D(dst) | A(src2) | B(src1)));                          FAIL_IF(push_inst(compiler, SUBFE | D(dst) | A(src2) | B(src1)));
                         return push_inst(compiler, MTXER | S(0));                          return push_inst(compiler, MTXER | S(0));
                 }                  }
Line 179  static SLJIT_INLINE int emit_single_op(struct sljit_co Line 228  static SLJIT_INLINE int emit_single_op(struct sljit_co
                 return push_inst(compiler, SRW | RC(flags) | S(src1) | A(dst) | B(src2));                  return push_inst(compiler, SRW | RC(flags) | S(src1) | A(dst) | B(src2));
   
         case SLJIT_ASHR:          case SLJIT_ASHR:
                   if (flags & ALT_FORM3)
                           FAIL_IF(push_inst(compiler, MFXER | D(0)));
                 if (flags & ALT_FORM1) {                  if (flags & ALT_FORM1) {
                         SLJIT_ASSERT(src2 == TMP_REG2);                          SLJIT_ASSERT(src2 == TMP_REG2);
                         compiler->imm &= 0x1f;                          compiler->imm &= 0x1f;
                        return push_inst(compiler, SRAWI | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11));                        FAIL_IF(push_inst(compiler, SRAWI | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11)));
                 }                  }
                return push_inst(compiler, SRAW | RC(flags) | S(src1) | A(dst) | B(src2));                else
                        FAIL_IF(push_inst(compiler, SRAW | RC(flags) | S(src1) | A(dst) | B(src2)));
        case SLJIT_MOV:                return (flags & ALT_FORM3) ? push_inst(compiler, MTXER | S(0)) : SLJIT_SUCCESS;
        case SLJIT_MOV_UI: 
        case SLJIT_MOV_SI: 
                SLJIT_ASSERT(src1 == TMP_REG1); 
                if (dst != src2) 
                        return push_inst(compiler, OR | S(src2) | A(dst) | B(src2)); 
                return SLJIT_SUCCESS; 
 
        case SLJIT_MOV_UB: 
        case SLJIT_MOV_SB: 
                SLJIT_ASSERT(src1 == TMP_REG1); 
                if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { 
                        if (op == SLJIT_MOV_SB) 
                                return push_inst(compiler, EXTSB | S(src2) | A(dst)); 
                        return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24)); 
                } 
                else if ((flags & REG_DEST) && op == SLJIT_MOV_SB) 
                        return push_inst(compiler, EXTSB | S(src2) | A(dst)); 
                else if (dst != src2) 
                        SLJIT_ASSERT_STOP(); 
                return SLJIT_SUCCESS; 
 
        case SLJIT_MOV_UH: 
        case SLJIT_MOV_SH: 
                SLJIT_ASSERT(src1 == TMP_REG1); 
                if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { 
                        if (op == SLJIT_MOV_SH) 
                                return push_inst(compiler, EXTSH | S(src2) | A(dst)); 
                        return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16)); 
                } 
                else if (dst != src2) 
                        SLJIT_ASSERT_STOP(); 
                return SLJIT_SUCCESS; 
 
        case SLJIT_NOT: 
                SLJIT_ASSERT(src1 == TMP_REG1); 
                return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2)); 
 
        case SLJIT_NEG: 
                SLJIT_ASSERT(src1 == TMP_REG1); 
                return push_inst(compiler, NEG | OERC(flags) | D(dst) | A(src2)); 
 
        case SLJIT_CLZ: 
                SLJIT_ASSERT(src1 == TMP_REG1); 
                return push_inst(compiler, CNTLZW | RC(flags) | S(src2) | A(dst)); 
         }          }
   
         SLJIT_ASSERT_STOP();          SLJIT_ASSERT_STOP();
         return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
 }  }
   
static SLJIT_INLINE int emit_const(struct sljit_compiler *compiler, int reg, sljit_w init_value)static SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si reg, sljit_sw init_value)
 {  {
         FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 16)));          FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 16)));
         return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));          return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));
Line 252  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(slji Line 259  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(slji
         SLJIT_CACHE_FLUSH(inst, inst + 2);          SLJIT_CACHE_FLUSH(inst, inst + 2);
 }  }
   
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_w new_constant)SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)
 {  {
         sljit_ins *inst = (sljit_ins*)addr;          sljit_ins *inst = (sljit_ins*)addr;
   

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>