/[pcre]/code/trunk/sljit/sljitNativeMIPS_32.c
ViewVC logotype

Diff of /code/trunk/sljit/sljitNativeMIPS_32.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 836 by ph10, Wed Dec 28 17:16:11 2011 UTC revision 1149 by zherczeg, Sat Oct 20 21:33:38 2012 UTC
# Line 72  static SLJIT_INLINE int emit_single_op(s Line 72  static SLJIT_INLINE int emit_single_op(s
72          int overflow_ra = 0;          int overflow_ra = 0;
73    
74          switch (GET_OPCODE(op)) {          switch (GET_OPCODE(op)) {
75            case SLJIT_MOV:
76            case SLJIT_MOV_UI:
77            case SLJIT_MOV_SI:
78                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
79                    if (dst != src2)
80                            return push_inst(compiler, ADDU | S(src2) | TA(0) | D(dst), DR(dst));
81                    return SLJIT_SUCCESS;
82    
83            case SLJIT_MOV_UB:
84            case SLJIT_MOV_SB:
85                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
86                    if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
87                            if (op == SLJIT_MOV_SB) {
88    #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
89                                    return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));
90    #else
91                                    FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst)));
92                                    return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst));
93    #endif
94                            }
95                            return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(dst));
96                    }
97                    else if (dst != src2)
98                            SLJIT_ASSERT_STOP();
99                    return SLJIT_SUCCESS;
100    
101            case SLJIT_MOV_UH:
102            case SLJIT_MOV_SH:
103                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
104                    if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
105                            if (op == SLJIT_MOV_SH) {
106    #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
107                                    return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));
108    #else
109                                    FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst)));
110                                    return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst));
111    #endif
112                            }
113                            return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst));
114                    }
115                    else if (dst != src2)
116                            SLJIT_ASSERT_STOP();
117                    return SLJIT_SUCCESS;
118    
119            case SLJIT_NOT:
120                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
121                    if (op & SLJIT_SET_E)
122                            FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));
123                    if (CHECK_FLAGS(SLJIT_SET_E))
124                            FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst)));
125                    return SLJIT_SUCCESS;
126    
127            case SLJIT_CLZ:
128                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
129    #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
130                    if (op & SLJIT_SET_E)
131                            FAIL_IF(push_inst(compiler, CLZ | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));
132                    if (CHECK_FLAGS(SLJIT_SET_E))
133                            FAIL_IF(push_inst(compiler, CLZ | S(src2) | T(dst) | D(dst), DR(dst)));
134    #else
135                    if (SLJIT_UNLIKELY(flags & UNUSED_DEST)) {
136                            FAIL_IF(push_inst(compiler, SRL | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG));
137                            return push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG);
138                    }
139                    /* Nearly all instructions are unmovable in the following sequence. */
140                    FAIL_IF(push_inst(compiler, ADDU_W | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));
141                    /* Check zero. */
142                    FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS));
143                    FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM(32), UNMOVABLE_INS));
144                    FAIL_IF(push_inst(compiler, ADDIU_W | SA(0) | T(dst) | IMM(-1), DR(dst)));
145                    /* Loop for searching the highest bit. */
146                    FAIL_IF(push_inst(compiler, ADDIU_W | S(dst) | T(dst) | IMM(1), DR(dst)));
147                    FAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS));
148                    FAIL_IF(push_inst(compiler, SLL | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS));
149                    if (op & SLJIT_SET_E)
150                            return push_inst(compiler, ADDU_W | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG);
151    #endif
152                    return SLJIT_SUCCESS;
153    
154          case SLJIT_ADD:          case SLJIT_ADD:
155                  if (flags & SRC2_IMM) {                  if (flags & SRC2_IMM) {
156                          if (op & SLJIT_SET_O) {                          if (op & SLJIT_SET_O) {
# Line 293  static SLJIT_INLINE int emit_single_op(s Line 372  static SLJIT_INLINE int emit_single_op(s
372          case SLJIT_ASHR:          case SLJIT_ASHR:
373                  EMIT_SHIFT(SRA, SRAV);                  EMIT_SHIFT(SRA, SRAV);
374                  return SLJIT_SUCCESS;                  return SLJIT_SUCCESS;
   
         case SLJIT_MOV:  
         case SLJIT_MOV_UI:  
         case SLJIT_MOV_SI:  
                 SLJIT_ASSERT(src1 == TMP_REG1);  
                 if (dst != src2)  
                         return push_inst(compiler, ADDU | S(src2) | TA(0) | D(dst), DR(dst));  
                 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) {  
 #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)  
                                 return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));  
 #else  
                                 FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst)));  
                                 return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst));  
 #endif  
                         }  
                         return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(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) {  
 #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)  
                                 return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));  
 #else  
                                 FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst)));  
                                 return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst));  
 #endif  
                         }  
                         return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst));  
                 }  
                 else if (dst != src2)  
                         SLJIT_ASSERT_STOP();  
                 return SLJIT_SUCCESS;  
   
         case SLJIT_NOT:  
                 SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));  
                 if (op & SLJIT_SET_E)  
                         FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));  
                 if (CHECK_FLAGS(SLJIT_SET_E))  
                         FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst)));  
                 return SLJIT_SUCCESS;  
   
         case SLJIT_CLZ:  
                 SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));  
 #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)  
                 if (op & SLJIT_SET_E)  
                         FAIL_IF(push_inst(compiler, CLZ | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));  
                 if (CHECK_FLAGS(SLJIT_SET_E))  
                         FAIL_IF(push_inst(compiler, CLZ | S(src2) | T(dst) | D(dst), DR(dst)));  
 #else  
                 if (SLJIT_UNLIKELY(flags & UNUSED_DEST)) {  
                         FAIL_IF(push_inst(compiler, SRL | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG));  
                         return push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG);  
                 }  
                 /* Nearly all instructions are unmovable in the following sequence. */  
                 FAIL_IF(push_inst(compiler, ADDU_W | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));  
                 /* Check zero. */  
                 FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(6), UNMOVABLE_INS));  
                 FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM(32), UNMOVABLE_INS));  
                 /* Check sign bit. */  
                 FAIL_IF(push_inst(compiler, BLTZ | S(TMP_REG1) | IMM(4), UNMOVABLE_INS));  
                 FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM(0), UNMOVABLE_INS));  
                 /* Loop for searching the highest bit. */  
                 FAIL_IF(push_inst(compiler, SLL | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), DR(TMP_REG1)));  
                 FAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS));  
                 FAIL_IF(push_inst(compiler, ADDIU_W | S(dst) | T(dst) | IMM(1), UNMOVABLE_INS));  
                 if (op & SLJIT_SET_E)  
                         return push_inst(compiler, ADDU_W | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG);  
 #endif  
                 return SLJIT_SUCCESS;  
375          }          }
376    
377          SLJIT_ASSERT_STOP();          SLJIT_ASSERT_STOP();
378          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
379  }  }
380    
381  static SLJIT_INLINE int emit_const(struct sljit_compiler *compiler, int reg, sljit_w init_value)  static SLJIT_INLINE int emit_const(struct sljit_compiler *compiler, int dst, sljit_w init_value)
382  {  {
383          FAIL_IF(push_inst(compiler, LUI | T(reg) | IMM(init_value >> 16), DR(reg)));          FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 16), DR(dst)));
384          return push_inst(compiler, ORI | S(reg) | T(reg) | IMM(init_value), DR(reg));          return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst));
385  }  }
386    
387  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)

Legend:
Removed from v.836  
changed lines
  Added in v.1149

  ViewVC Help
Powered by ViewVC 1.1.5