/[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 1195 by zherczeg, Thu Nov 1 15:21:27 2012 UTC revision 1243 by zherczeg, Tue Jan 29 08:11:36 2013 UTC
# Line 35  typedef sljit_ui sljit_ins; Line 35  typedef sljit_ui sljit_ins;
35    
36  static void sparc_cache_flush(sljit_ins *from, sljit_ins *to)  static void sparc_cache_flush(sljit_ins *from, sljit_ins *to)
37  {  {
38    #if defined(__SUNPRO_C) && __SUNPRO_C < 0x590
39            __asm (
40                    /* if (from == to) return */
41                    "cmp %i0, %i1\n"
42                    "be .leave\n"
43                    "nop\n"
44    
45                    /* loop until from >= to */
46                    ".mainloop:\n"
47                    "flush %i0\n"
48                    "add %i0, 8, %i0\n"
49                    "cmp %i0, %i1\n"
50                    "bcs .mainloop\n"
51                    "nop\n"
52    
53                    /* The comparison was done above. */
54                    "bne .leave\n"
55                    /* nop is not necessary here, since the
56                       sub operation has no side effect. */
57                    "sub %i0, 4, %i0\n"
58                    "flush %i0\n"
59                    ".leave:"
60            );
61    #else
62          if (SLJIT_UNLIKELY(from == to))          if (SLJIT_UNLIKELY(from == to))
63                  return;                  return;
64    
# Line 49  static void sparc_cache_flush(sljit_ins Line 73  static void sparc_cache_flush(sljit_ins
73    
74          if (from == to) {          if (from == to) {
75                  /* Flush the last word. */                  /* Flush the last word. */
76                  to --;                  from --;
77                  __asm__ volatile (                  __asm__ volatile (
78                          "flush %0\n"                          "flush %0\n"
79                          : : "r"(to)                          : : "r"(from)
80                  );                  );
81          }          }
82    #endif
83  }  }
84    
85  /* TMP_REG2 is not used by getput_arg */  /* TMP_REG2 is not used by getput_arg */
# Line 153  static SLJIT_CONST sljit_ub reg_map[SLJI Line 178  static SLJIT_CONST sljit_ub reg_map[SLJI
178     Useful for reordering instructions in the delay slot. */     Useful for reordering instructions in the delay slot. */
179  static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_si delay_slot)  static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_si delay_slot)
180  {  {
181            sljit_ins *ptr;
182          SLJIT_ASSERT((delay_slot & DST_INS_MASK) == UNMOVABLE_INS          SLJIT_ASSERT((delay_slot & DST_INS_MASK) == UNMOVABLE_INS
183                  || (delay_slot & DST_INS_MASK) == MOVABLE_INS                  || (delay_slot & DST_INS_MASK) == MOVABLE_INS
184                  || (delay_slot & DST_INS_MASK) == ((ins >> 25) & 0x1f));                  || (delay_slot & DST_INS_MASK) == ((ins >> 25) & 0x1f));
185          sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));          ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
186          FAIL_IF(!ptr);          FAIL_IF(!ptr);
187          *ptr = ins;          *ptr = ins;
188          compiler->size++;          compiler->size++;
# Line 343  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 369  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
369    
370    
371          compiler->error = SLJIT_ERR_COMPILED;          compiler->error = SLJIT_ERR_COMPILED;
372          compiler->executable_size = compiler->size * sizeof(sljit_ins);          compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
373          SLJIT_CACHE_FLUSH(code, code_ptr);          SLJIT_CACHE_FLUSH(code, code_ptr);
374          return code;          return code;
375  }  }
# Line 367  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 393  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
393    
394  #define WRITE_BACK      0x00020  #define WRITE_BACK      0x00020
395  #define ARG_TEST        0x00040  #define ARG_TEST        0x00040
396  #define CUMULATIVE_OP   0x00080  #define ALT_KEEP_CACHE  0x00080
397  #define IMM_OP          0x00100  #define CUMULATIVE_OP   0x00100
398  #define SRC2_IMM        0x00200  #define IMM_OP          0x00200
399    #define SRC2_IMM        0x00400
400  #define REG_DEST        0x00400  
401  #define REG2_SOURCE     0x00800  #define REG_DEST        0x00800
402  #define SLOW_SRC1       0x01000  #define REG2_SOURCE     0x01000
403  #define SLOW_SRC2       0x02000  #define SLOW_SRC1       0x02000
404  #define SLOW_DEST       0x04000  #define SLOW_SRC2       0x04000
405    #define SLOW_DEST       0x08000
406    
407  /* SET_FLAGS (0x10 << 19) also belong here! */  /* SET_FLAGS (0x10 << 19) also belong here! */
408    
409  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
# Line 384  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 412  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
412  #include "sljitNativeSPARC_64.c"  #include "sljitNativeSPARC_64.c"
413  #endif  #endif
414    
415  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, sljit_si args, sljit_si temporaries, sljit_si saveds, sljit_si local_size)  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_si local_size)
416  {  {
417          CHECK_ERROR();          CHECK_ERROR();
418          check_sljit_emit_enter(compiler, args, temporaries, saveds, local_size);          check_sljit_emit_enter(compiler, args, scratches, saveds, local_size);
419    
420          compiler->temporaries = temporaries;          compiler->scratches = scratches;
421          compiler->saveds = saveds;          compiler->saveds = saveds;
422  #if (defined SLJIT_DEBUG && SLJIT_DEBUG)  #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
423          compiler->logical_local_size = local_size;          compiler->logical_local_size = local_size;
# Line 417  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 445  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
445          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
446  }  }
447    
448  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, sljit_si args, sljit_si temporaries, sljit_si saveds, sljit_si local_size)  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_si local_size)
449  {  {
450          CHECK_ERROR_VOID();          CHECK_ERROR_VOID();
451          check_sljit_set_context(compiler, args, temporaries, saveds, local_size);          check_sljit_set_context(compiler, args, scratches, saveds, local_size);
452    
453          compiler->temporaries = temporaries;          compiler->scratches = scratches;
454          compiler->saveds = saveds;          compiler->saveds = saveds;
455  #if (defined SLJIT_DEBUG && SLJIT_DEBUG)  #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
456          compiler->logical_local_size = local_size;          compiler->logical_local_size = local_size;
# Line 437  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 >= SLJIT_TEMPORARY_REG1 && src <= SLJIT_NO_REGISTERS)) {          if (op != SLJIT_MOV || !(src <= TMP_REG3)) {
469                  FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));                  FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
470                  src = SLJIT_TEMPORARY_REG1;                  src = SLJIT_SCRATCH_REG1;
471          }          }
472    
473          FAIL_IF(push_inst(compiler, JMPL | D(0) | S1A(31) | IMM(8), UNMOVABLE_INS));          FAIL_IF(push_inst(compiler, JMPL | D(0) | S1A(31) | IMM(8), UNMOVABLE_INS));
474          return push_inst(compiler, RESTORE | D(SLJIT_TEMPORARY_REG1) | S1(src) | S2(0), UNMOVABLE_INS);          return push_inst(compiler, RESTORE | D(SLJIT_SCRATCH_REG1) | S1(src) | S2(0), UNMOVABLE_INS);
475  }  }
476    
477  /* --------------------------------------------------------------------- */  /* --------------------------------------------------------------------- */
# Line 488  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)) {          if (!(flags & WRITE_BACK) || !(arg & 0xf)) {
520                  if ((!(arg & 0xf0) && argw <= SIMM_MAX && argw >= SIMM_MIN)                  if ((!(arg & 0xf0) && argw <= SIMM_MAX && argw >= SIMM_MIN)
521                                  || ((arg & 0xf0) && (argw & 0x3) == 0)) {                                  || ((arg & 0xf0) && (argw & 0x3) == 0)) {
522                          /* Works for both absoulte and relative addresses (immediate case). */                          /* Works for both absoulte and relative addresses (immediate case). */
# Line 621  static sljit_si emit_op(struct sljit_com Line 649  static sljit_si emit_op(struct sljit_com
649          sljit_sw src2_r = 0;          sljit_sw src2_r = 0;
650          sljit_si sugg_src2_r = TMP_REG2;          sljit_si sugg_src2_r = TMP_REG2;
651    
652          compiler->cache_arg = 0;          if (!(flags & ALT_KEEP_CACHE)) {
653          compiler->cache_argw = 0;                  compiler->cache_arg = 0;
654                    compiler->cache_argw = 0;
655            }
656    
657          if (dst >= SLJIT_TEMPORARY_REG1 && dst <= TMP_REG3) {          if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
658                    if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM))
659                            return SLJIT_SUCCESS;
660            }
661            else if (dst <= TMP_REG3) {
662                  dst_r = dst;                  dst_r = dst;
663                  flags |= REG_DEST;                  flags |= REG_DEST;
664                  if (GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOVU_SI)                  if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)
665                          sugg_src2_r = dst_r;                          sugg_src2_r = dst_r;
666          }          }
         else if (dst == SLJIT_UNUSED) {  
                 if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM))  
                         return SLJIT_SUCCESS;  
         }  
667          else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1, dst, dstw))          else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1, dst, dstw))
668                  flags |= SLOW_DEST;                  flags |= SLOW_DEST;
669    
# Line 659  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 >= SLJIT_TEMPORARY_REG1 && src1 <= TMP_REG3)          if (src1 <= TMP_REG3)
693                  src1_r = src1;                  src1_r = src1;
694          else if (src1 & SLJIT_IMM) {          else if (src1 & SLJIT_IMM) {
695                  if (src1w) {                  if (src1w) {
# Line 678  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 >= SLJIT_TEMPORARY_REG1 && src2 <= TMP_REG3) {          if (src2 <= TMP_REG3) {
712                  src2_r = src2;                  src2_r = src2;
713                  flags |= REG2_SOURCE;                  flags |= REG2_SOURCE;
714                  if (!(flags & REG_DEST) && GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOVU_SI)                  if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)
715                          dst_r = src2_r;                          dst_r = src2_r;
716          }          }
717          else if (src2 & SLJIT_IMM) {          else if (src2 & SLJIT_IMM) {
718                  if (!(flags & SRC2_IMM)) {                  if (!(flags & SRC2_IMM)) {
719                          if (src2w || (GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOVU_SI)) {                          if (src2w) {
720                                  FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w));                                  FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w));
721                                  src2_r = sugg_src2_r;                                  src2_r = sugg_src2_r;
722                          }                          }
723                          else                          else {
724                                  src2_r = 0;                                  src2_r = 0;
725                                    if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) && (dst & SLJIT_MEM))
726                                            dst_r = 0;
727                            }
728                  }                  }
729          }          }
730          else {          else {
# Line 745  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 778  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
778          case SLJIT_UMUL:          case SLJIT_UMUL:
779          case SLJIT_SMUL:          case SLJIT_SMUL:
780  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
781                  FAIL_IF(push_inst(compiler, (op == SLJIT_UMUL ? UMUL : SMUL) | D(SLJIT_TEMPORARY_REG1) | S1(SLJIT_TEMPORARY_REG1) | S2(SLJIT_TEMPORARY_REG2), DR(SLJIT_TEMPORARY_REG1)));                  FAIL_IF(push_inst(compiler, (op == SLJIT_UMUL ? UMUL : SMUL) | D(SLJIT_SCRATCH_REG1) | S1(SLJIT_SCRATCH_REG1) | S2(SLJIT_SCRATCH_REG2), DR(SLJIT_SCRATCH_REG1)));
782                  return push_inst(compiler, RDY | D(SLJIT_TEMPORARY_REG2), DR(SLJIT_TEMPORARY_REG2));                  return push_inst(compiler, RDY | D(SLJIT_SCRATCH_REG2), DR(SLJIT_SCRATCH_REG2));
783  #else  #else
784  #error "Implementation required"  #error "Implementation required"
785  #endif  #endif
# Line 756  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 789  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
789                  if (op == SLJIT_UDIV)                  if (op == SLJIT_UDIV)
790                          FAIL_IF(push_inst(compiler, WRY | S1(0), MOVABLE_INS));                          FAIL_IF(push_inst(compiler, WRY | S1(0), MOVABLE_INS));
791                  else {                  else {
792                          FAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(SLJIT_TEMPORARY_REG1) | IMM(31), DR(TMP_REG1)));                          FAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(SLJIT_SCRATCH_REG1) | IMM(31), DR(TMP_REG1)));
793                          FAIL_IF(push_inst(compiler, WRY | S1(TMP_REG1), MOVABLE_INS));                          FAIL_IF(push_inst(compiler, WRY | S1(TMP_REG1), MOVABLE_INS));
794                  }                  }
795                  FAIL_IF(push_inst(compiler, OR | D(TMP_REG2) | S1(0) | S2(SLJIT_TEMPORARY_REG1), DR(TMP_REG2)));                  FAIL_IF(push_inst(compiler, OR | D(TMP_REG2) | S1(0) | S2(SLJIT_SCRATCH_REG1), DR(TMP_REG2)));
796                  FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? UDIV : SDIV) | D(SLJIT_TEMPORARY_REG1) | S1(SLJIT_TEMPORARY_REG1) | S2(SLJIT_TEMPORARY_REG2), DR(SLJIT_TEMPORARY_REG1)));                  FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? UDIV : SDIV) | D(SLJIT_SCRATCH_REG1) | S1(SLJIT_SCRATCH_REG1) | S2(SLJIT_SCRATCH_REG2), DR(SLJIT_SCRATCH_REG1)));
797                  FAIL_IF(push_inst(compiler, SMUL | D(SLJIT_TEMPORARY_REG2) | S1(SLJIT_TEMPORARY_REG1) | S2(SLJIT_TEMPORARY_REG2), DR(SLJIT_TEMPORARY_REG2)));                  FAIL_IF(push_inst(compiler, SMUL | D(SLJIT_SCRATCH_REG2) | S1(SLJIT_SCRATCH_REG1) | S2(SLJIT_SCRATCH_REG2), DR(SLJIT_SCRATCH_REG2)));
798                  FAIL_IF(push_inst(compiler, SUB | D(SLJIT_TEMPORARY_REG2) | S1(TMP_REG2) | S2(SLJIT_TEMPORARY_REG2), DR(SLJIT_TEMPORARY_REG2)));                  FAIL_IF(push_inst(compiler, SUB | D(SLJIT_SCRATCH_REG2) | S1(TMP_REG2) | S2(SLJIT_SCRATCH_REG2), DR(SLJIT_SCRATCH_REG2)));
799                  return SLJIT_SUCCESS;                  return SLJIT_SUCCESS;
800  #else  #else
801  #error "Implementation required"  #error "Implementation required"
# Line 1071  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1104  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1104          check_sljit_emit_fast_enter(compiler, dst, dstw);          check_sljit_emit_fast_enter(compiler, dst, dstw);
1105          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1106    
1107          if (dst >= SLJIT_TEMPORARY_REG1 && dst <= SLJIT_NO_REGISTERS)          /* For UNUSED dst. Uncommon, but possible. */
1108            if (dst == SLJIT_UNUSED)
1109                    return SLJIT_SUCCESS;
1110    
1111            if (dst <= TMP_REG3)
1112                  return push_inst(compiler, OR | D(dst) | S1(0) | S2(LINK_REG), DR(dst));                  return push_inst(compiler, OR | D(dst) | S1(0) | S2(LINK_REG), DR(dst));
         else if (dst & SLJIT_MEM)  
                 return emit_op_mem(compiler, WORD_DATA, LINK_REG, dst, dstw);  
1113    
1114          /* SLJIT_UNUSED is also possible, although highly unlikely. */          /* Memory. */
1115          return SLJIT_SUCCESS;          return emit_op_mem(compiler, WORD_DATA, LINK_REG, dst, dstw);
1116  }  }
1117    
1118  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 1086  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1121  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1121          check_sljit_emit_fast_return(compiler, src, srcw);          check_sljit_emit_fast_return(compiler, src, srcw);
1122          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1123    
1124          if (src >= SLJIT_TEMPORARY_REG1 && src <= SLJIT_NO_REGISTERS)          if (src <= TMP_REG3)
1125                  FAIL_IF(push_inst(compiler, OR | D(LINK_REG) | S1(0) | S2(src), DR(LINK_REG)));                  FAIL_IF(push_inst(compiler, OR | D(LINK_REG) | S1(0) | S2(src), DR(LINK_REG)));
1126          else if (src & SLJIT_MEM)          else if (src & SLJIT_MEM)
1127                  FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, LINK_REG, src, srcw));                  FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, LINK_REG, src, srcw));
# Line 1244  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1279  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1279          check_sljit_emit_ijump(compiler, type, src, srcw);          check_sljit_emit_ijump(compiler, type, src, srcw);
1280          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1281    
1282          if (src >= SLJIT_TEMPORARY_REG1 && src <= SLJIT_NO_REGISTERS)          if (src <= TMP_REG3)
1283                  src_r = src;                  src_r = src;
1284          else if (src & SLJIT_IMM) {          else if (src & SLJIT_IMM) {
1285                  jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));                  jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
# Line 1270  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1305  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1305          return push_inst(compiler, NOP, UNMOVABLE_INS);          return push_inst(compiler, NOP, UNMOVABLE_INS);
1306  }  }
1307    
1308  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_cond_value(struct sljit_compiler *compiler, sljit_si op, sljit_si dst, sljit_sw dstw, sljit_si type)  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op,
1309            sljit_si dst, sljit_sw dstw,
1310            sljit_si src, sljit_sw srcw,
1311            sljit_si type)
1312  {  {
1313          sljit_si reg;          sljit_si reg, flags = (GET_FLAGS(op) ? SET_FLAGS : 0);
1314    
1315          CHECK_ERROR();          CHECK_ERROR();
1316          check_sljit_emit_cond_value(compiler, op, dst, dstw, type);          check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type);
1317          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1318    
1319          if (dst == SLJIT_UNUSED)          if (dst == SLJIT_UNUSED)
1320                  return SLJIT_SUCCESS;                  return SLJIT_SUCCESS;
1321    
1322  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)  #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
1323          reg = (op == SLJIT_MOV && dst >= SLJIT_TEMPORARY_REG1 && dst <= SLJIT_NO_REGISTERS) ? dst : TMP_REG2;          op = GET_OPCODE(op);
1324            reg = (op < SLJIT_ADD && dst <= TMP_REG3) ? dst : TMP_REG2;
1325    
1326            compiler->cache_arg = 0;
1327            compiler->cache_argw = 0;
1328            if (op >= SLJIT_ADD && (src & SLJIT_MEM)) {
1329                    ADJUST_LOCAL_OFFSET(src, srcw);
1330                    FAIL_IF(emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw, dst, dstw));
1331                    src = TMP_REG1;
1332                    srcw = 0;
1333            }
1334    
1335          if (type < SLJIT_C_FLOAT_EQUAL)          if (type < SLJIT_C_FLOAT_EQUAL)
1336                  FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS));                  FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS));
# Line 1292  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1340  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1340          FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(1), UNMOVABLE_INS));          FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(1), UNMOVABLE_INS));
1341          FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(0), UNMOVABLE_INS));          FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(0), UNMOVABLE_INS));
1342    
1343          if (GET_OPCODE(op) == SLJIT_OR)          if (op >= SLJIT_ADD)
1344                  return emit_op(compiler, SLJIT_OR, (GET_FLAGS(op) ? SET_FLAGS : 0) | CUMULATIVE_OP | IMM_OP, dst, dstw, dst, dstw, TMP_REG2, 0);                  return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP | ALT_KEEP_CACHE, dst, dstw, src, srcw, TMP_REG2, 0);
1345    
1346          return (reg == TMP_REG2) ? emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw) : SLJIT_SUCCESS;          return (reg == TMP_REG2) ? emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw) : SLJIT_SUCCESS;
1347  #else  #else
# Line 1314  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co Line 1362  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
1362          PTR_FAIL_IF(!const_);          PTR_FAIL_IF(!const_);
1363          set_const(const_, compiler);          set_const(const_, compiler);
1364    
1365          reg = (dst >= SLJIT_TEMPORARY_REG1 && dst <= SLJIT_NO_REGISTERS) ? dst : TMP_REG2;          reg = (dst <= TMP_REG3) ? dst : TMP_REG2;
1366    
1367          PTR_FAIL_IF(emit_const(compiler, reg, init_value));          PTR_FAIL_IF(emit_const(compiler, reg, init_value));
1368    

Legend:
Removed from v.1195  
changed lines
  Added in v.1243

  ViewVC Help
Powered by ViewVC 1.1.5