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

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

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

revision 1452 by zherczeg, Fri Mar 15 06:58:31 2013 UTC revision 1453 by zherczeg, Thu Jan 30 06:10:21 2014 UTC
# Line 87  static void sparc_cache_flush(sljit_ins Line 87  static void sparc_cache_flush(sljit_ins
87  #define TMP_REG2        (SLJIT_NO_REGISTERS + 2)  #define TMP_REG2        (SLJIT_NO_REGISTERS + 2)
88  #define TMP_REG3        (SLJIT_NO_REGISTERS + 3)  #define TMP_REG3        (SLJIT_NO_REGISTERS + 3)
89  #define TMP_REG4        (SLJIT_NO_REGISTERS + 4)  #define TMP_REG4        (SLJIT_NO_REGISTERS + 4)
90  #define LINK_REG        (SLJIT_NO_REGISTERS + 5)  #define TMP_LINK        (SLJIT_NO_REGISTERS + 5)
91    
92  #define TMP_FREG1       (0)  #define TMP_FREG1       (0)
93  #define TMP_FREG2       ((SLJIT_FLOAT_REG6 + 1) << 1)  #define TMP_FREG2       ((SLJIT_FLOAT_REG6 + 1) << 1)
# Line 190  static sljit_si push_inst(struct sljit_c Line 190  static sljit_si push_inst(struct sljit_c
190          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
191  }  }
192    
193  static SLJIT_INLINE sljit_ins* optimize_jump(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code)  static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code)
194  {  {
195          sljit_sw diff;          sljit_sw diff;
196          sljit_uw target_addr;          sljit_uw target_addr;
# Line 311  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 311  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
311  #else  #else
312                                  jump->addr = (sljit_uw)(code_ptr - 6);                                  jump->addr = (sljit_uw)(code_ptr - 6);
313  #endif  #endif
314                                  code_ptr = optimize_jump(jump, code_ptr, code);                                  code_ptr = detect_jump_type(jump, code_ptr, code);
315                                  jump = jump->next;                                  jump = jump->next;
316                          }                          }
317                          if (const_ && const_->addr == word_count) {                          if (const_ && const_->addr == word_count) {
# Line 465  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 465  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
465          CHECK_ERROR();          CHECK_ERROR();
466          check_sljit_emit_return(compiler, op, src, srcw);          check_sljit_emit_return(compiler, op, src, srcw);
467    
468          if (op != SLJIT_MOV || !(src <= TMP_REG3)) {          if (op != SLJIT_MOV || !FAST_IS_REG(src)) {
469                  FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));                  FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
470                  src = SLJIT_SCRATCH_REG1;                  src = SLJIT_SCRATCH_REG1;
471          }          }
# Line 516  static sljit_si getput_arg_fast(struct s Line 516  static sljit_si getput_arg_fast(struct s
516  {  {
517          SLJIT_ASSERT(arg & SLJIT_MEM);          SLJIT_ASSERT(arg & SLJIT_MEM);
518    
519          if (!(flags & WRITE_BACK) || !(arg & 0xf)) {          if (!(flags & WRITE_BACK) || !(arg & REG_MASK)) {
520                  if ((!(arg & 0xf0) && argw <= SIMM_MAX && argw >= SIMM_MIN)                  if ((!(arg & OFFS_REG_MASK) && argw <= SIMM_MAX && argw >= SIMM_MIN)
521                                  || ((arg & 0xf0) && (argw & 0x3) == 0)) {                                  || ((arg & OFFS_REG_MASK) && (argw & 0x3) == 0)) {
522                          /* Works for both absoulte and relative addresses (immediate case). */                          /* Works for both absoulte and relative addresses (immediate case). */
523                          if (SLJIT_UNLIKELY(flags & ARG_TEST))                          if (SLJIT_UNLIKELY(flags & ARG_TEST))
524                                  return 1;                                  return 1;
525                          FAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK]                          FAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK]
526                                  | ((flags & MEM_MASK) <= GPR_REG ? D(reg) : DA(reg))                                  | ((flags & MEM_MASK) <= GPR_REG ? D(reg) : DA(reg))
527                                  | S1(arg & 0xf) | ((arg & 0xf0) ? S2((arg >> 4) & 0xf) : IMM(argw)),                                  | S1(arg & REG_MASK) | ((arg & OFFS_REG_MASK) ? S2(OFFS_REG(arg)) : IMM(argw)),
528                                  ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? DR(reg) : MOVABLE_INS));                                  ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? DR(reg) : MOVABLE_INS));
529                          return -1;                          return -1;
530                  }                  }
# Line 540  static sljit_si can_cache(sljit_si arg, Line 540  static sljit_si can_cache(sljit_si arg,
540          SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));          SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));
541    
542          /* Simple operation except for updates. */          /* Simple operation except for updates. */
543          if (arg & 0xf0) {          if (arg & OFFS_REG_MASK) {
544                  argw &= 0x3;                  argw &= 0x3;
545                  SLJIT_ASSERT(argw);                  SLJIT_ASSERT(argw);
546                  next_argw &= 0x3;                  next_argw &= 0x3;
547                  if ((arg & 0xf0) == (next_arg & 0xf0) && argw == next_argw)                  if ((arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK) && argw == next_argw)
548                          return 1;                          return 1;
549                  return 0;                  return 0;
550          }          }
# Line 566  static sljit_si getput_arg(struct sljit_ Line 566  static sljit_si getput_arg(struct sljit_
566                  next_argw = 0;                  next_argw = 0;
567          }          }
568    
569          base = arg & 0xf;          base = arg & REG_MASK;
570          if (SLJIT_UNLIKELY(arg & 0xf0)) {          if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {
571                  argw &= 0x3;                  argw &= 0x3;
572                  SLJIT_ASSERT(argw != 0);                  SLJIT_ASSERT(argw != 0);
573    
574                  /* Using the cache. */                  /* Using the cache. */
575                  if (((SLJIT_MEM | (arg & 0xf0)) == compiler->cache_arg) && (argw == compiler->cache_argw))                  if (((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) && (argw == compiler->cache_argw))
576                          arg2 = TMP_REG3;                          arg2 = TMP_REG3;
577                  else {                  else {
578                          if ((arg & 0xf0) == (next_arg & 0xf0) && argw == (next_argw & 0x3)) {                          if ((arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK) && argw == (next_argw & 0x3)) {
579                                  compiler->cache_arg = SLJIT_MEM | (arg & 0xf0);                                  compiler->cache_arg = SLJIT_MEM | (arg & OFFS_REG_MASK);
580                                  compiler->cache_argw = argw;                                  compiler->cache_argw = argw;
581                                  arg2 = TMP_REG3;                                  arg2 = TMP_REG3;
582                          }                          }
583                          else if ((flags & LOAD_DATA) && ((flags & MEM_MASK) <= GPR_REG) && reg != base && (reg << 4) != (arg & 0xf0))                          else if ((flags & LOAD_DATA) && ((flags & MEM_MASK) <= GPR_REG) && reg != base && reg != OFFS_REG(arg))
584                                  arg2 = reg;                                  arg2 = reg;
585                          else /* It must be a mov operation, so tmp1 must be free to use. */                          else /* It must be a mov operation, so tmp1 must be free to use. */
586                                  arg2 = TMP_REG1;                                  arg2 = TMP_REG1;
587                          FAIL_IF(push_inst(compiler, SLL_W | D(arg2) | S1((arg >> 4) & 0xf) | IMM_ARG | argw, DR(arg2)));                          FAIL_IF(push_inst(compiler, SLL_W | D(arg2) | S1(OFFS_REG(arg)) | IMM_ARG | argw, DR(arg2)));
588                  }                  }
589          }          }
590          else {          else {
# Line 658  static sljit_si emit_op(struct sljit_com Line 658  static sljit_si emit_op(struct sljit_com
658                  if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM))                  if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM))
659                          return SLJIT_SUCCESS;                          return SLJIT_SUCCESS;
660          }          }
661          else if (dst <= TMP_REG3) {          else if (FAST_IS_REG(dst)) {
662                  dst_r = dst;                  dst_r = dst;
663                  flags |= REG_DEST;                  flags |= REG_DEST;
664                  if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)                  if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)
# Line 689  static sljit_si emit_op(struct sljit_com Line 689  static sljit_si emit_op(struct sljit_com
689          }          }
690    
691          /* Source 1. */          /* Source 1. */
692          if (src1 <= TMP_REG3)          if (FAST_IS_REG(src1))
693                  src1_r = src1;                  src1_r = src1;
694          else if (src1 & SLJIT_IMM) {          else if (src1 & SLJIT_IMM) {
695                  if (src1w) {                  if (src1w) {
# Line 708  static sljit_si emit_op(struct sljit_com Line 708  static sljit_si emit_op(struct sljit_com
708          }          }
709    
710          /* Source 2. */          /* Source 2. */
711          if (src2 <= TMP_REG3) {          if (FAST_IS_REG(src2)) {
712                  src2_r = src2;                  src2_r = src2;
713                  flags |= REG2_SOURCE;                  flags |= REG2_SOURCE;
714                  if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)                  if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)
# Line 963  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 963  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
963          compiler->cache_argw = 0;          compiler->cache_argw = 0;
964    
965          if (GET_OPCODE(op) == SLJIT_CMPD) {          if (GET_OPCODE(op) == SLJIT_CMPD) {
966                  if (dst > SLJIT_FLOAT_REG6) {                  if (dst & SLJIT_MEM) {
967                          FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, dst, dstw, src, srcw));                          FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, dst, dstw, src, srcw));
968                          dst = TMP_FREG1;                          dst = TMP_FREG1;
969                  }                  }
970                  else                  else
971                          dst <<= 1;                          dst <<= 1;
972    
973                  if (src > SLJIT_FLOAT_REG6) {                  if (src & SLJIT_MEM) {
974                          FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src, srcw, 0, 0));                          FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src, srcw, 0, 0));
975                          src = TMP_FREG2;                          src = TMP_FREG2;
976                  }                  }
# Line 980  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 980  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
980                  return push_inst(compiler, SELECT_FOP(op, FCMPS, FCMPD) | S1A(dst) | S2A(src), FCC_IS_SET | MOVABLE_INS);                  return push_inst(compiler, SELECT_FOP(op, FCMPS, FCMPD) | S1A(dst) | S2A(src), FCC_IS_SET | MOVABLE_INS);
981          }          }
982    
983          dst_fr = (dst > SLJIT_FLOAT_REG6) ? TMP_FREG1 : (dst << 1);          dst_fr = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1;
984    
985          if (src > SLJIT_FLOAT_REG6) {          if (src & SLJIT_MEM) {
986                  FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_fr, src, srcw, dst, dstw));                  FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_fr, src, srcw, dst, dstw));
987                  src = dst_fr;                  src = dst_fr;
988          }          }
# Line 1031  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1031  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1031          compiler->cache_arg = 0;          compiler->cache_arg = 0;
1032          compiler->cache_argw = 0;          compiler->cache_argw = 0;
1033    
1034          dst_fr = (dst > SLJIT_FLOAT_REG6) ? TMP_FREG2 : (dst << 1);          dst_fr = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG2;
1035    
1036          if (src1 > SLJIT_FLOAT_REG6) {          if (src1 & SLJIT_MEM) {
1037                  if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w)) {                  if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w)) {
1038                          FAIL_IF(compiler->error);                          FAIL_IF(compiler->error);
1039                          src1 = TMP_FREG1;                          src1 = TMP_FREG1;
# Line 1043  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1043  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1043          else          else
1044                  src1 <<= 1;                  src1 <<= 1;
1045    
1046          if (src2 > SLJIT_FLOAT_REG6) {          if (src2 & SLJIT_MEM) {
1047                  if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w)) {                  if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w)) {
1048                          FAIL_IF(compiler->error);                          FAIL_IF(compiler->error);
1049                          src2 = TMP_FREG2;                          src2 = TMP_FREG2;
# Line 1114  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1114  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1114          if (dst == SLJIT_UNUSED)          if (dst == SLJIT_UNUSED)
1115                  return SLJIT_SUCCESS;                  return SLJIT_SUCCESS;
1116    
1117          if (dst <= TMP_REG3)          if (FAST_IS_REG(dst))
1118                  return push_inst(compiler, OR | D(dst) | S1(0) | S2(LINK_REG), DR(dst));                  return push_inst(compiler, OR | D(dst) | S1(0) | S2(TMP_LINK), DR(dst));
1119    
1120          /* Memory. */          /* Memory. */
1121          return emit_op_mem(compiler, WORD_DATA, LINK_REG, dst, dstw);          return emit_op_mem(compiler, WORD_DATA, TMP_LINK, dst, dstw);
1122  }  }
1123    
1124  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
# Line 1127  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1127  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1127          check_sljit_emit_fast_return(compiler, src, srcw);          check_sljit_emit_fast_return(compiler, src, srcw);
1128          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1129    
1130          if (src <= TMP_REG3)          if (FAST_IS_REG(src))
1131                  FAIL_IF(push_inst(compiler, OR | D(LINK_REG) | S1(0) | S2(src), DR(LINK_REG)));                  FAIL_IF(push_inst(compiler, OR | D(TMP_LINK) | S1(0) | S2(src), DR(TMP_LINK)));
1132          else if (src & SLJIT_MEM)          else if (src & SLJIT_MEM)
1133                  FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, LINK_REG, src, srcw));                  FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_LINK, src, srcw));
1134          else if (src & SLJIT_IMM)          else if (src & SLJIT_IMM)
1135                  FAIL_IF(load_immediate(compiler, LINK_REG, srcw));                  FAIL_IF(load_immediate(compiler, TMP_LINK, srcw));
1136    
1137          FAIL_IF(push_inst(compiler, JMPL | D(0) | S1(LINK_REG) | IMM(8), UNMOVABLE_INS));          FAIL_IF(push_inst(compiler, JMPL | D(0) | S1(TMP_LINK) | IMM(8), UNMOVABLE_INS));
1138          return push_inst(compiler, NOP, UNMOVABLE_INS);          return push_inst(compiler, NOP, UNMOVABLE_INS);
1139  }  }
1140    
# Line 1269  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1269  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1269          }          }
1270    
1271          PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));          PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));
1272          PTR_FAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? LINK_REG : 0) | S1(TMP_REG2) | IMM(0), UNMOVABLE_INS));          PTR_FAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? TMP_LINK : 0) | S1(TMP_REG2) | IMM(0), UNMOVABLE_INS));
1273          jump->addr = compiler->size;          jump->addr = compiler->size;
1274          PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));          PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
1275    
# Line 1285  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1285  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1285          check_sljit_emit_ijump(compiler, type, src, srcw);          check_sljit_emit_ijump(compiler, type, src, srcw);
1286          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1287    
1288          if (src <= TMP_REG3)          if (FAST_IS_REG(src))
1289                  src_r = src;                  src_r = src;
1290          else if (src & SLJIT_IMM) {          else if (src & SLJIT_IMM) {
1291                  jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));                  jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
# Line 1305  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1305  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1305                  src_r = TMP_REG2;                  src_r = TMP_REG2;
1306          }          }
1307    
1308          FAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? LINK_REG : 0) | S1(src_r) | IMM(0), UNMOVABLE_INS));          FAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? TMP_LINK : 0) | S1(src_r) | IMM(0), UNMOVABLE_INS));
1309          if (jump)          if (jump)
1310                  jump->addr = compiler->size;                  jump->addr = compiler->size;
1311          return push_inst(compiler, NOP, UNMOVABLE_INS);          return push_inst(compiler, NOP, UNMOVABLE_INS);
# Line 1327  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1327  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1327    
1328  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
1329          op = GET_OPCODE(op);          op = GET_OPCODE(op);
1330          reg = (op < SLJIT_ADD && dst <= TMP_REG3) ? dst : TMP_REG2;          reg = (op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2;
1331    
1332          compiler->cache_arg = 0;          compiler->cache_arg = 0;
1333          compiler->cache_argw = 0;          compiler->cache_argw = 0;
# Line 1368  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co Line 1368  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
1368          PTR_FAIL_IF(!const_);          PTR_FAIL_IF(!const_);
1369          set_const(const_, compiler);          set_const(const_, compiler);
1370    
1371          reg = (dst <= TMP_REG3) ? dst : TMP_REG2;          reg = SLOW_IS_REG(dst) ? dst : TMP_REG2;
1372    
1373          PTR_FAIL_IF(emit_const(compiler, reg, init_value));          PTR_FAIL_IF(emit_const(compiler, reg, init_value));
1374    
1375          if (dst & SLJIT_MEM)          if (dst & SLJIT_MEM)
1376                  PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw));                  PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw));
   
1377          return const_;          return const_;
1378  }  }

Legend:
Removed from v.1452  
changed lines
  Added in v.1453

  ViewVC Help
Powered by ViewVC 1.1.5