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

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

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

revision 1148 by zherczeg, Tue Apr 3 15:32:36 2012 UTC revision 1149 by zherczeg, Sat Oct 20 21:33:38 2012 UTC
# Line 24  Line 24 
24   * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25   */   */
26    
27  SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name()  SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
28  {  {
29  #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)  #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
30          return "ARMv7" SLJIT_CPUINFO;          return "ARMv7" SLJIT_CPUINFO;
# Line 56  SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST cha Line 56  SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST cha
56    
57  /* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */  /* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */
58  static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 5] = {  static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 5] = {
59    0, 0, 1, 2, 10, 11, 4, 5, 6, 7, 8, 13, 3, 12, 14, 15          0, 0, 1, 2, 10, 11, 4, 5, 6, 7, 8, 13, 3, 12, 14, 15
60  };  };
61    
62  #define RM(rm) (reg_map[rm])  #define RM(rm) (reg_map[rm])
# Line 793  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 793  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
793          return code;          return code;
794  }  }
795    
796    /* --------------------------------------------------------------------- */
797    /*  Entry, exit                                                          */
798    /* --------------------------------------------------------------------- */
799    
800  /* emit_op inp_flags.  /* emit_op inp_flags.
801     WRITE_BACK must be the first, since it is a flag. */     WRITE_BACK must be the first, since it is a flag. */
802  #define WRITE_BACK      0x01  #define WRITE_BACK      0x01
# Line 902  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 906  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
906    
907          CHECK_ERROR();          CHECK_ERROR();
908          check_sljit_emit_return(compiler, op, src, srcw);          check_sljit_emit_return(compiler, op, src, srcw);
         ADJUST_LOCAL_OFFSET(src, srcw);  
909    
910          FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));          FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
911    
# Line 1011  static SLJIT_INLINE int emit_single_op(s Line 1014  static SLJIT_INLINE int emit_single_op(s
1014          sljit_w mul_inst;          sljit_w mul_inst;
1015    
1016          switch (GET_OPCODE(op)) {          switch (GET_OPCODE(op)) {
1017            case SLJIT_MOV:
1018                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
1019                    if (dst != src2) {
1020                            if (src2 & SRC2_IMM) {
1021                                    if (flags & INV_IMM)
1022                                            EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);
1023                                    EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);
1024                            }
1025                            EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, reg_map[src2]);
1026                    }
1027                    return SLJIT_SUCCESS;
1028    
1029            case SLJIT_MOV_UB:
1030            case SLJIT_MOV_SB:
1031                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
1032                    if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) {
1033    #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
1034                            if (op == SLJIT_MOV_UB)
1035                                    return push_inst(compiler, EMIT_DATA_PROCESS_INS(AND_DP, 0, dst, src2, SRC2_IMM | 0xff));
1036                            EMIT_INSTRUCTION(EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | reg_map[src2]));
1037                            return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | (op == SLJIT_MOV_UB ? 0x20 : 0x40) | reg_map[dst]));
1038    #else
1039                            return push_inst(compiler, (op == SLJIT_MOV_UB ? UXTB : SXTB) | RD(dst) | RM(src2));
1040    #endif
1041                    }
1042                    else if (dst != src2) {
1043                            SLJIT_ASSERT(src2 & SRC2_IMM);
1044                            if (flags & INV_IMM)
1045                                    EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);
1046                            EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);
1047                    }
1048                    return SLJIT_SUCCESS;
1049    
1050            case SLJIT_MOV_UH:
1051            case SLJIT_MOV_SH:
1052                    SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
1053                    if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) {
1054    #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
1055                            EMIT_INSTRUCTION(EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | reg_map[src2]));
1056                            return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | (op == SLJIT_MOV_UH ? 0x20 : 0x40) | reg_map[dst]));
1057    #else
1058                            return push_inst(compiler, (op == SLJIT_MOV_UH ? UXTH : SXTH) | RD(dst) | RM(src2));
1059    #endif
1060                    }
1061                    else if (dst != src2) {
1062                            SLJIT_ASSERT(src2 & SRC2_IMM);
1063                            if (flags & INV_IMM)
1064                                    EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);
1065                            EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);
1066                    }
1067                    return SLJIT_SUCCESS;
1068    
1069            case SLJIT_NOT:
1070                    if (src2 & SRC2_IMM) {
1071                            if (flags & INV_IMM)
1072                                    EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);
1073                            EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);
1074                    }
1075                    EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, RM(src2));
1076    
1077            case SLJIT_CLZ:
1078                    SLJIT_ASSERT(!(flags & INV_IMM));
1079                    SLJIT_ASSERT(!(src2 & SRC2_IMM));
1080                    FAIL_IF(push_inst(compiler, CLZ | RD(dst) | RM(src2)));
1081                    if (flags & SET_FLAGS)
1082                            EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(CMP_DP, SLJIT_UNUSED, dst, SRC2_IMM);
1083                    return SLJIT_SUCCESS;
1084    
1085          case SLJIT_ADD:          case SLJIT_ADD:
1086                  SLJIT_ASSERT(!(flags & INV_IMM));                  SLJIT_ASSERT(!(flags & INV_IMM));
1087                  EMIT_DATA_PROCESS_INS_AND_RETURN(ADD_DP);                  EMIT_DATA_PROCESS_INS_AND_RETURN(ADD_DP);
# Line 1080  static SLJIT_INLINE int emit_single_op(s Line 1151  static SLJIT_INLINE int emit_single_op(s
1151    
1152          case SLJIT_ASHR:          case SLJIT_ASHR:
1153                  EMIT_SHIFT_INS_AND_RETURN(2);                  EMIT_SHIFT_INS_AND_RETURN(2);
   
         case SLJIT_MOV:  
                 SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));  
                 if (dst != src2) {  
                         if (src2 & SRC2_IMM) {  
                                 if (flags & INV_IMM)  
                                         EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);  
                                 EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);  
                         }  
                         EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, reg_map[src2]);  
                 }  
                 return SLJIT_SUCCESS;  
   
         case SLJIT_MOV_UB:  
         case SLJIT_MOV_SB:  
                 SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));  
                 if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) {  
 #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)  
                         if (op == SLJIT_MOV_UB)  
                                 return push_inst(compiler, EMIT_DATA_PROCESS_INS(AND_DP, 0, dst, src2, SRC2_IMM | 0xff));  
                         EMIT_INSTRUCTION(EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | reg_map[src2]));  
                         return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | (op == SLJIT_MOV_UB ? 0x20 : 0x40) | reg_map[dst]));  
 #else  
                         return push_inst(compiler, (op == SLJIT_MOV_UB ? UXTB : SXTB) | RD(dst) | RM(src2));  
 #endif  
                 }  
                 else if (dst != src2) {  
                         SLJIT_ASSERT(src2 & SRC2_IMM);  
                         if (flags & INV_IMM)  
                                 EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);  
                         EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);  
                 }  
                 return SLJIT_SUCCESS;  
   
         case SLJIT_MOV_UH:  
         case SLJIT_MOV_SH:  
                 SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));  
                 if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) {  
 #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)  
                         EMIT_INSTRUCTION(EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | reg_map[src2]));  
                         return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | (op == SLJIT_MOV_UH ? 0x20 : 0x40) | reg_map[dst]));  
 #else  
                         return push_inst(compiler, (op == SLJIT_MOV_UH ? UXTH : SXTH) | RD(dst) | RM(src2));  
 #endif  
                 }  
                 else if (dst != src2) {  
                         SLJIT_ASSERT(src2 & SRC2_IMM);  
                         if (flags & INV_IMM)  
                                 EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);  
                         EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);  
                 }  
                 return SLJIT_SUCCESS;  
   
         case SLJIT_NOT:  
                 if (src2 & SRC2_IMM) {  
                         if (flags & INV_IMM)  
                                 EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MOV_DP, dst, SLJIT_UNUSED, src2);  
                         EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, src2);  
                 }  
                 EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(MVN_DP, dst, SLJIT_UNUSED, RM(src2));  
   
         case SLJIT_CLZ:  
                 SLJIT_ASSERT(!(flags & INV_IMM));  
                 SLJIT_ASSERT(!(src2 & SRC2_IMM));  
                 FAIL_IF(push_inst(compiler, CLZ | RD(dst) | RM(src2)));  
                 if (flags & SET_FLAGS)  
                         EMIT_FULL_DATA_PROCESS_INS_AND_RETURN(CMP_DP, SLJIT_UNUSED, dst, SRC2_IMM);  
                 return SLJIT_SUCCESS;  
1154          }          }
1155          SLJIT_ASSERT_STOP();          SLJIT_ASSERT_STOP();
1156          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
# Line 1982  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 1985  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
1985     1 - vfp */     1 - vfp */
1986  static int arm_fpu_type = -1;  static int arm_fpu_type = -1;
1987    
1988  static void init_compiler()  static void init_compiler(void)
1989  {  {
1990          if (arm_fpu_type != -1)          if (arm_fpu_type != -1)
1991                  return;                  return;
# Line 2080  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 2083  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
2083          int dst, sljit_w dstw,          int dst, sljit_w dstw,
2084          int src, sljit_w srcw)          int src, sljit_w srcw)
2085  {  {
2086          int dst_freg;          int dst_fr;
2087    
2088          CHECK_ERROR();          CHECK_ERROR();
2089          check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw);          check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw);
# Line 2102  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 2105  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
2105                  return SLJIT_SUCCESS;                  return SLJIT_SUCCESS;
2106          }          }
2107    
2108          dst_freg = (dst > SLJIT_FLOAT_REG4) ? TMP_FREG1 : dst;          dst_fr = (dst > SLJIT_FLOAT_REG4) ? TMP_FREG1 : dst;
2109    
2110          if (src > SLJIT_FLOAT_REG4) {          if (src > SLJIT_FLOAT_REG4) {
2111                  FAIL_IF(emit_fpu_data_transfer(compiler, dst_freg, 1, src, srcw));                  FAIL_IF(emit_fpu_data_transfer(compiler, dst_fr, 1, src, srcw));
2112                  src = dst_freg;                  src = dst_fr;
2113          }          }
2114    
2115          switch (op) {          switch (op) {
2116                  case SLJIT_FMOV:                  case SLJIT_FMOV:
2117                          if (src != dst_freg && dst_freg != TMP_FREG1)                          if (src != dst_fr && dst_fr != TMP_FREG1)
2118                                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VMOV_F64, dst_freg, src, 0));                                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VMOV_F64, dst_fr, src, 0));
2119                          break;                          break;
2120                  case SLJIT_FNEG:                  case SLJIT_FNEG:
2121                          EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VNEG_F64, dst_freg, src, 0));                          EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VNEG_F64, dst_fr, src, 0));
2122                          break;                          break;
2123                  case SLJIT_FABS:                  case SLJIT_FABS:
2124                          EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VABS_F64, dst_freg, src, 0));                          EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VABS_F64, dst_fr, src, 0));
2125                          break;                          break;
2126          }          }
2127    
2128          if (dst_freg == TMP_FREG1)          if (dst_fr == TMP_FREG1) {
2129                  FAIL_IF(emit_fpu_data_transfer(compiler, src, 0, dst, dstw));                  if (op == SLJIT_FMOV)
2130                            dst_fr = src;
2131                    FAIL_IF(emit_fpu_data_transfer(compiler, dst_fr, 0, dst, dstw));
2132            }
2133    
2134          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
2135  }  }
# Line 2133  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 2139  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
2139          int src1, sljit_w src1w,          int src1, sljit_w src1w,
2140          int src2, sljit_w src2w)          int src2, sljit_w src2w)
2141  {  {
2142          int dst_freg;          int dst_fr;
2143    
2144          CHECK_ERROR();          CHECK_ERROR();
2145          check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w);          check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w);
# Line 2141  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 2147  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
2147          compiler->cache_arg = 0;          compiler->cache_arg = 0;
2148          compiler->cache_argw = 0;          compiler->cache_argw = 0;
2149    
2150          dst_freg = (dst > SLJIT_FLOAT_REG4) ? TMP_FREG1 : dst;          dst_fr = (dst > SLJIT_FLOAT_REG4) ? TMP_FREG1 : dst;
2151    
2152          if (src2 > SLJIT_FLOAT_REG4) {          if (src2 > SLJIT_FLOAT_REG4) {
2153                  FAIL_IF(emit_fpu_data_transfer(compiler, TMP_FREG2, 1, src2, src2w));                  FAIL_IF(emit_fpu_data_transfer(compiler, TMP_FREG2, 1, src2, src2w));
# Line 2155  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 2161  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
2161    
2162          switch (op) {          switch (op) {
2163          case SLJIT_FADD:          case SLJIT_FADD:
2164                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VADD_F64, dst_freg, src2, src1));                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VADD_F64, dst_fr, src2, src1));
2165                  break;                  break;
2166    
2167          case SLJIT_FSUB:          case SLJIT_FSUB:
2168                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VSUB_F64, dst_freg, src2, src1));                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VSUB_F64, dst_fr, src2, src1));
2169                  break;                  break;
2170    
2171          case SLJIT_FMUL:          case SLJIT_FMUL:
2172                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VMUL_F64, dst_freg, src2, src1));                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VMUL_F64, dst_fr, src2, src1));
2173                  break;                  break;
2174    
2175          case SLJIT_FDIV:          case SLJIT_FDIV:
2176                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VDIV_F64, dst_freg, src2, src1));                  EMIT_INSTRUCTION(EMIT_FPU_OPERATION(VDIV_F64, dst_fr, src2, src1));
2177                  break;                  break;
2178          }          }
2179    
2180          if (dst_freg == TMP_FREG1)          if (dst_fr == TMP_FREG1)
2181                  FAIL_IF(emit_fpu_data_transfer(compiler, TMP_FREG1, 0, dst, dstw));                  FAIL_IF(emit_fpu_data_transfer(compiler, TMP_FREG1, 0, dst, dstw));
2182    
2183          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
# Line 2270  static sljit_uw get_cc(int type) Line 2276  static sljit_uw get_cc(int type)
2276                  return 0xd0000000;                  return 0xd0000000;
2277    
2278          case SLJIT_C_OVERFLOW:          case SLJIT_C_OVERFLOW:
2279          case SLJIT_C_FLOAT_NAN:          case SLJIT_C_FLOAT_UNORDERED:
2280                  return 0x60000000;                  return 0x60000000;
2281    
2282          case SLJIT_C_NOT_OVERFLOW:          case SLJIT_C_NOT_OVERFLOW:
2283          case SLJIT_C_FLOAT_NOT_NAN:          case SLJIT_C_FLOAT_ORDERED:
2284                  return 0x70000000;                  return 0x70000000;
2285    
2286          default: /* SLJIT_JUMP */          default: /* SLJIT_JUMP */

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

  ViewVC Help
Powered by ViewVC 1.1.5