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

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

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

revision 1505 by zherczeg, Mon Aug 11 06:42:28 2014 UTC revision 1506 by zherczeg, Sat Sep 27 06:25:26 2014 UTC
# Line 371  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 371  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
371          struct sljit_const *const_;          struct sljit_const *const_;
372    
373          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
374          check_sljit_generate_code(compiler);          CHECK_PTR(check_sljit_generate_code(compiler));
375          reverse_buf(compiler);          reverse_buf(compiler);
376    
377          code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));          code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
# Line 546  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 546  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
546          sljit_si i, tmp, offs;          sljit_si i, tmp, offs;
547    
548          CHECK_ERROR();          CHECK_ERROR();
549          check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);          CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
550            set_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
551    
552          compiler->options = options;          local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;
         compiler->scratches = scratches;  
         compiler->saveds = saveds;  
         compiler->fscratches = fscratches;  
         compiler->fsaveds = fsaveds;  
 #if (defined SLJIT_DEBUG && SLJIT_DEBUG)  
         compiler->logical_local_size = local_size;  
 #endif  
   
         local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + FIXED_LOCALS_OFFSET;  
553  #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)  #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
554          local_size = (local_size + 15) & ~0xf;          local_size = (local_size + 15) & ~0xf;
555  #else  #else
# Line 602  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 594  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
594          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
595  }  }
596    
597  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
598          sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,          sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
599          sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)          sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
600  {  {
601          CHECK_ERROR_VOID();          CHECK_ERROR();
602          check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);          CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
603            set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
         compiler->options = options;  
         compiler->scratches = scratches;  
         compiler->saveds = saveds;  
         compiler->fscratches = fscratches;  
         compiler->fsaveds = fsaveds;  
 #if (defined SLJIT_DEBUG && SLJIT_DEBUG)  
         compiler->logical_local_size = local_size;  
 #endif  
604    
605          local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + FIXED_LOCALS_OFFSET;          local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;
606  #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)  #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
607          compiler->local_size = (local_size + 15) & ~0xf;          compiler->local_size = (local_size + 15) & ~0xf;
608  #else  #else
609          compiler->local_size = (local_size + 31) & ~0x1f;          compiler->local_size = (local_size + 31) & ~0x1f;
610  #endif  #endif
611            return SLJIT_SUCCESS;
612  }  }
613    
614  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
# Line 632  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 617  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
617          sljit_ins base;          sljit_ins base;
618    
619          CHECK_ERROR();          CHECK_ERROR();
620          check_sljit_emit_return(compiler, op, src, srcw);          CHECK(check_sljit_emit_return(compiler, op, src, srcw));
621    
622          FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));          FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
623    
# Line 1051  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1036  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1036  #endif  #endif
1037    
1038          CHECK_ERROR();          CHECK_ERROR();
1039          check_sljit_emit_op0(compiler, op);          CHECK(check_sljit_emit_op0(compiler, op));
1040    
1041          op = GET_OPCODE(op);          op = GET_OPCODE(op);
1042          switch (op) {          switch (op) {
# Line 1059  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1044  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1044                  return push_inst(compiler, BREAK, UNMOVABLE_INS);                  return push_inst(compiler, BREAK, UNMOVABLE_INS);
1045          case SLJIT_NOP:          case SLJIT_NOP:
1046                  return push_inst(compiler, NOP, UNMOVABLE_INS);                  return push_inst(compiler, NOP, UNMOVABLE_INS);
1047          case SLJIT_UMUL:          case SLJIT_LUMUL:
1048          case SLJIT_SMUL:          case SLJIT_LSMUL:
1049  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
1050                  FAIL_IF(push_inst(compiler, (op == SLJIT_UMUL ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
1051  #else  #else
1052                  FAIL_IF(push_inst(compiler, (op == SLJIT_UMUL ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
1053  #endif  #endif
1054                  FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));                  FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));
1055                  return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));                  return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));
1056          case SLJIT_UDIV:          case SLJIT_LUDIV:
1057          case SLJIT_SDIV:          case SLJIT_LSDIV:
1058  #if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)  #if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
1059                  FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));                  FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
1060                  FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));                  FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
# Line 1077  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1062  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1062    
1063  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)  #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
1064                  if (int_op)                  if (int_op)
1065                          FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));                          FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
1066                  else                  else
1067                          FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));                          FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
1068  #else  #else
1069                  FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
1070  #endif  #endif
1071    
1072                  FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));                  FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));
# Line 1102  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1087  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1087  #endif  #endif
1088    
1089          CHECK_ERROR();          CHECK_ERROR();
1090          check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);          CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
1091          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1092          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1093    
# Line 1204  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1189  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1189  #endif  #endif
1190    
1191          CHECK_ERROR();          CHECK_ERROR();
1192          check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w);          CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
1193          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1194          ADJUST_LOCAL_OFFSET(src1, src1w);          ADJUST_LOCAL_OFFSET(src1, src1w);
1195          ADJUST_LOCAL_OFFSET(src2, src2w);          ADJUST_LOCAL_OFFSET(src2, src2w);
# Line 1262  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1247  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1247    
1248  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
1249  {  {
1250          check_sljit_get_register_index(reg);          CHECK_REG_INDEX(check_sljit_get_register_index(reg));
1251          return reg_map[reg];          return reg_map[reg];
1252  }  }
1253    
1254  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg)  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg)
1255  {  {
1256          check_sljit_get_float_register_index(reg);          CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
1257          return reg << 1;          return reg << 1;
1258  }  }
1259    
# Line 1276  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1261  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1261          void *instruction, sljit_si size)          void *instruction, sljit_si size)
1262  {  {
1263          CHECK_ERROR();          CHECK_ERROR();
1264          check_sljit_emit_op_custom(compiler, instruction, size);          CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
         SLJIT_ASSERT(size == 4);  
1265    
1266          return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);          return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);
1267  }  }
# Line 1438  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1422  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1422                  src <<= 1;                  src <<= 1;
1423    
1424          switch (GET_OPCODE(op)) {          switch (GET_OPCODE(op)) {
1425          case SLJIT_MOVD:          case SLJIT_DMOV:
1426                  if (src != dst_r) {                  if (src != dst_r) {
1427                          if (dst_r != TMP_FREG1)                          if (dst_r != TMP_FREG1)
1428                                  FAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));                                  FAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));
# Line 1446  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1430  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1430                                  dst_r = src;                                  dst_r = src;
1431                  }                  }
1432                  break;                  break;
1433          case SLJIT_NEGD:          case SLJIT_DNEG:
1434                  FAIL_IF(push_inst(compiler, NEG_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, NEG_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));
1435                  break;                  break;
1436          case SLJIT_ABSD:          case SLJIT_DABS:
1437                  FAIL_IF(push_inst(compiler, ABS_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, ABS_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));
1438                  break;                  break;
1439          case SLJIT_CONVD_FROMS:          case SLJIT_CONVD_FROMS:
# Line 1471  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1455  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1455          sljit_si dst_r, flags = 0;          sljit_si dst_r, flags = 0;
1456    
1457          CHECK_ERROR();          CHECK_ERROR();
1458          check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w);          CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
1459          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1460          ADJUST_LOCAL_OFFSET(src1, src1w);          ADJUST_LOCAL_OFFSET(src1, src1w);
1461          ADJUST_LOCAL_OFFSET(src2, src2w);          ADJUST_LOCAL_OFFSET(src2, src2w);
# Line 1522  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1506  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1506                  src2 = TMP_FREG2;                  src2 = TMP_FREG2;
1507    
1508          switch (GET_OPCODE(op)) {          switch (GET_OPCODE(op)) {
1509          case SLJIT_ADDD:          case SLJIT_DADD:
1510                  FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
1511                  break;                  break;
1512    
1513          case SLJIT_SUBD:          case SLJIT_DSUB:
1514                  FAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
1515                  break;                  break;
1516    
1517          case SLJIT_MULD:          case SLJIT_DMUL:
1518                  FAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
1519                  break;                  break;
1520    
1521          case SLJIT_DIVD:          case SLJIT_DDIV:
1522                  FAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));                  FAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
1523                  break;                  break;
1524          }          }
# Line 1552  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1536  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1536  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
1537  {  {
1538          CHECK_ERROR();          CHECK_ERROR();
1539          check_sljit_emit_fast_enter(compiler, dst, dstw);          CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
1540          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1541    
1542          /* For UNUSED dst. Uncommon, but possible. */          /* For UNUSED dst. Uncommon, but possible. */
# Line 1569  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1553  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1553  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)
1554  {  {
1555          CHECK_ERROR();          CHECK_ERROR();
1556          check_sljit_emit_fast_return(compiler, src, srcw);          CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
1557          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1558    
1559          if (FAST_IS_REG(src))          if (FAST_IS_REG(src))
# Line 1592  SLJIT_API_FUNC_ATTRIBUTE struct sljit_la Line 1576  SLJIT_API_FUNC_ATTRIBUTE struct sljit_la
1576          struct sljit_label *label;          struct sljit_label *label;
1577    
1578          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
1579          check_sljit_emit_label(compiler);          CHECK_PTR(check_sljit_emit_label(compiler));
1580    
1581          if (compiler->last_label && compiler->last_label->size == compiler->size)          if (compiler->last_label && compiler->last_label->size == compiler->size)
1582                  return compiler->last_label;                  return compiler->last_label;
# Line 1638  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1622  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1622          sljit_si delay_check = UNMOVABLE_INS;          sljit_si delay_check = UNMOVABLE_INS;
1623    
1624          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
1625          check_sljit_emit_jump(compiler, type);          CHECK_PTR(check_sljit_emit_jump(compiler, type));
1626    
1627          jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));          jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1628          PTR_FAIL_IF(!jump);          PTR_FAIL_IF(!jump);
# Line 1646  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1630  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1630          type &= 0xff;          type &= 0xff;
1631    
1632          switch (type) {          switch (type) {
1633          case SLJIT_C_EQUAL:          case SLJIT_EQUAL:
1634          case SLJIT_C_FLOAT_NOT_EQUAL:          case SLJIT_D_NOT_EQUAL:
1635                  BR_NZ(EQUAL_FLAG);                  BR_NZ(EQUAL_FLAG);
1636                  break;                  break;
1637          case SLJIT_C_NOT_EQUAL:          case SLJIT_NOT_EQUAL:
1638          case SLJIT_C_FLOAT_EQUAL:          case SLJIT_D_EQUAL:
1639                  BR_Z(EQUAL_FLAG);                  BR_Z(EQUAL_FLAG);
1640                  break;                  break;
1641          case SLJIT_C_LESS:          case SLJIT_LESS:
1642          case SLJIT_C_FLOAT_LESS:          case SLJIT_D_LESS:
1643                  BR_Z(ULESS_FLAG);                  BR_Z(ULESS_FLAG);
1644                  break;                  break;
1645          case SLJIT_C_GREATER_EQUAL:          case SLJIT_GREATER_EQUAL:
1646          case SLJIT_C_FLOAT_GREATER_EQUAL:          case SLJIT_D_GREATER_EQUAL:
1647                  BR_NZ(ULESS_FLAG);                  BR_NZ(ULESS_FLAG);
1648                  break;                  break;
1649          case SLJIT_C_GREATER:          case SLJIT_GREATER:
1650          case SLJIT_C_FLOAT_GREATER:          case SLJIT_D_GREATER:
1651                  BR_Z(UGREATER_FLAG);                  BR_Z(UGREATER_FLAG);
1652                  break;                  break;
1653          case SLJIT_C_LESS_EQUAL:          case SLJIT_LESS_EQUAL:
1654          case SLJIT_C_FLOAT_LESS_EQUAL:          case SLJIT_D_LESS_EQUAL:
1655                  BR_NZ(UGREATER_FLAG);                  BR_NZ(UGREATER_FLAG);
1656                  break;                  break;
1657          case SLJIT_C_SIG_LESS:          case SLJIT_SIG_LESS:
1658                  BR_Z(LESS_FLAG);                  BR_Z(LESS_FLAG);
1659                  break;                  break;
1660          case SLJIT_C_SIG_GREATER_EQUAL:          case SLJIT_SIG_GREATER_EQUAL:
1661                  BR_NZ(LESS_FLAG);                  BR_NZ(LESS_FLAG);
1662                  break;                  break;
1663          case SLJIT_C_SIG_GREATER:          case SLJIT_SIG_GREATER:
1664                  BR_Z(GREATER_FLAG);                  BR_Z(GREATER_FLAG);
1665                  break;                  break;
1666          case SLJIT_C_SIG_LESS_EQUAL:          case SLJIT_SIG_LESS_EQUAL:
1667                  BR_NZ(GREATER_FLAG);                  BR_NZ(GREATER_FLAG);
1668                  break;                  break;
1669          case SLJIT_C_OVERFLOW:          case SLJIT_OVERFLOW:
1670          case SLJIT_C_MUL_OVERFLOW:          case SLJIT_MUL_OVERFLOW:
1671                  BR_Z(OVERFLOW_FLAG);                  BR_Z(OVERFLOW_FLAG);
1672                  break;                  break;
1673          case SLJIT_C_NOT_OVERFLOW:          case SLJIT_NOT_OVERFLOW:
1674          case SLJIT_C_MUL_NOT_OVERFLOW:          case SLJIT_MUL_NOT_OVERFLOW:
1675                  BR_NZ(OVERFLOW_FLAG);                  BR_NZ(OVERFLOW_FLAG);
1676                  break;                  break;
1677          case SLJIT_C_FLOAT_UNORDERED:          case SLJIT_D_UNORDERED:
1678                  BR_F();                  BR_F();
1679                  break;                  break;
1680          case SLJIT_C_FLOAT_ORDERED:          case SLJIT_D_ORDERED:
1681                  BR_T();                  BR_T();
1682                  break;                  break;
1683          default:          default:
# Line 1755  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1739  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1739          sljit_ins inst;          sljit_ins inst;
1740    
1741          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
1742          check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);          CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));
1743          ADJUST_LOCAL_OFFSET(src1, src1w);          ADJUST_LOCAL_OFFSET(src1, src1w);
1744          ADJUST_LOCAL_OFFSET(src2, src2w);          ADJUST_LOCAL_OFFSET(src2, src2w);
1745    
# Line 1776  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1760  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1760          set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);          set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1761          type &= 0xff;          type &= 0xff;
1762    
1763          if (type <= SLJIT_C_NOT_EQUAL) {          if (type <= SLJIT_NOT_EQUAL) {
1764                  RESOLVE_IMM1();                  RESOLVE_IMM1();
1765                  RESOLVE_IMM2();                  RESOLVE_IMM2();
1766                  jump->flags |= IS_BIT26_COND;                  jump->flags |= IS_BIT26_COND;
1767                  if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2)))                  if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2)))
1768                          jump->flags |= IS_MOVABLE;                          jump->flags |= IS_MOVABLE;
1769                  PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_C_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | JUMP_LENGTH, UNMOVABLE_INS));                  PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | JUMP_LENGTH, UNMOVABLE_INS));
1770          }          }
1771          else if (type >= SLJIT_C_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) {          else if (type >= SLJIT_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) {
1772                  inst = NOP;                  inst = NOP;
1773                  if ((src1 & SLJIT_IMM) && (src1w == 0)) {                  if ((src1 & SLJIT_IMM) && (src1w == 0)) {
1774                          RESOLVE_IMM2();                          RESOLVE_IMM2();
1775                          switch (type) {                          switch (type) {
1776                          case SLJIT_C_SIG_LESS:                          case SLJIT_SIG_LESS:
1777                                  inst = BLEZ;                                  inst = BLEZ;
1778                                  jump->flags |= IS_BIT26_COND;                                  jump->flags |= IS_BIT26_COND;
1779                                  break;                                  break;
1780                          case SLJIT_C_SIG_GREATER_EQUAL:                          case SLJIT_SIG_GREATER_EQUAL:
1781                                  inst = BGTZ;                                  inst = BGTZ;
1782                                  jump->flags |= IS_BIT26_COND;                                  jump->flags |= IS_BIT26_COND;
1783                                  break;                                  break;
1784                          case SLJIT_C_SIG_GREATER:                          case SLJIT_SIG_GREATER:
1785                                  inst = BGEZ;                                  inst = BGEZ;
1786                                  jump->flags |= IS_BIT16_COND;                                  jump->flags |= IS_BIT16_COND;
1787                                  break;                                  break;
1788                          case SLJIT_C_SIG_LESS_EQUAL:                          case SLJIT_SIG_LESS_EQUAL:
1789                                  inst = BLTZ;                                  inst = BLTZ;
1790                                  jump->flags |= IS_BIT16_COND;                                  jump->flags |= IS_BIT16_COND;
1791                                  break;                                  break;
# Line 1811  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1795  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1795                  else {                  else {
1796                          RESOLVE_IMM1();                          RESOLVE_IMM1();
1797                          switch (type) {                          switch (type) {
1798                          case SLJIT_C_SIG_LESS:                          case SLJIT_SIG_LESS:
1799                                  inst = BGEZ;                                  inst = BGEZ;
1800                                  jump->flags |= IS_BIT16_COND;                                  jump->flags |= IS_BIT16_COND;
1801                                  break;                                  break;
1802                          case SLJIT_C_SIG_GREATER_EQUAL:                          case SLJIT_SIG_GREATER_EQUAL:
1803                                  inst = BLTZ;                                  inst = BLTZ;
1804                                  jump->flags |= IS_BIT16_COND;                                  jump->flags |= IS_BIT16_COND;
1805                                  break;                                  break;
1806                          case SLJIT_C_SIG_GREATER:                          case SLJIT_SIG_GREATER:
1807                                  inst = BLEZ;                                  inst = BLEZ;
1808                                  jump->flags |= IS_BIT26_COND;                                  jump->flags |= IS_BIT26_COND;
1809                                  break;                                  break;
1810                          case SLJIT_C_SIG_LESS_EQUAL:                          case SLJIT_SIG_LESS_EQUAL:
1811                                  inst = BGTZ;                                  inst = BGTZ;
1812                                  jump->flags |= IS_BIT26_COND;                                  jump->flags |= IS_BIT26_COND;
1813                                  break;                                  break;
# Line 1832  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1816  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1816                  PTR_FAIL_IF(push_inst(compiler, inst | S(src1) | JUMP_LENGTH, UNMOVABLE_INS));                  PTR_FAIL_IF(push_inst(compiler, inst | S(src1) | JUMP_LENGTH, UNMOVABLE_INS));
1817          }          }
1818          else {          else {
1819                  if (type == SLJIT_C_LESS || type == SLJIT_C_GREATER_EQUAL || type == SLJIT_C_SIG_LESS || type == SLJIT_C_SIG_GREATER_EQUAL) {                  if (type == SLJIT_LESS || type == SLJIT_GREATER_EQUAL || type == SLJIT_SIG_LESS || type == SLJIT_SIG_GREATER_EQUAL) {
1820                          RESOLVE_IMM1();                          RESOLVE_IMM1();
1821                          if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN)                          if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN)
1822                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1)));                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1)));
1823                          else {                          else {
1824                                  RESOLVE_IMM2();                                  RESOLVE_IMM2();
1825                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTU : SLT) | S(src1) | T(src2) | D(TMP_REG1), DR(TMP_REG1)));                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src1) | T(src2) | D(TMP_REG1), DR(TMP_REG1)));
1826                          }                          }
1827                          type = (type == SLJIT_C_LESS || type == SLJIT_C_SIG_LESS) ? SLJIT_C_NOT_EQUAL : SLJIT_C_EQUAL;                          type = (type == SLJIT_LESS || type == SLJIT_SIG_LESS) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL;
1828                  }                  }
1829                  else {                  else {
1830                          RESOLVE_IMM2();                          RESOLVE_IMM2();
1831                          if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN)                          if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN)
1832                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1)));                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1)));
1833                          else {                          else {
1834                                  RESOLVE_IMM1();                                  RESOLVE_IMM1();
1835                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTU : SLT) | S(src2) | T(src1) | D(TMP_REG1), DR(TMP_REG1)));                                  PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src2) | T(src1) | D(TMP_REG1), DR(TMP_REG1)));
1836                          }                          }
1837                          type = (type == SLJIT_C_GREATER || type == SLJIT_C_SIG_GREATER) ? SLJIT_C_NOT_EQUAL : SLJIT_C_EQUAL;                          type = (type == SLJIT_GREATER || type == SLJIT_SIG_GREATER) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL;
1838                  }                  }
1839    
1840                  jump->flags |= IS_BIT26_COND;                  jump->flags |= IS_BIT26_COND;
1841                  PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_C_EQUAL ? BNE : BEQ) | S(TMP_REG1) | TA(0) | JUMP_LENGTH, UNMOVABLE_INS));                  PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(TMP_REG1) | TA(0) | JUMP_LENGTH, UNMOVABLE_INS));
1842          }          }
1843    
1844          PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));          PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));
# Line 1876  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1860  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1860          sljit_si if_true;          sljit_si if_true;
1861    
1862          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
1863          check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w);          CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
1864    
1865          compiler->cache_arg = 0;          compiler->cache_arg = 0;
1866          compiler->cache_argw = 0;          compiler->cache_argw = 0;
# Line 1901  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1885  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1885          jump->flags |= IS_BIT16_COND;          jump->flags |= IS_BIT16_COND;
1886    
1887          switch (type & 0xff) {          switch (type & 0xff) {
1888          case SLJIT_C_FLOAT_EQUAL:          case SLJIT_D_EQUAL:
1889                  inst = C_UEQ_S;                  inst = C_UEQ_S;
1890                  if_true = 1;                  if_true = 1;
1891                  break;                  break;
1892          case SLJIT_C_FLOAT_NOT_EQUAL:          case SLJIT_D_NOT_EQUAL:
1893                  inst = C_UEQ_S;                  inst = C_UEQ_S;
1894                  if_true = 0;                  if_true = 0;
1895                  break;                  break;
1896          case SLJIT_C_FLOAT_LESS:          case SLJIT_D_LESS:
1897                  inst = C_ULT_S;                  inst = C_ULT_S;
1898                  if_true = 1;                  if_true = 1;
1899                  break;                  break;
1900          case SLJIT_C_FLOAT_GREATER_EQUAL:          case SLJIT_D_GREATER_EQUAL:
1901                  inst = C_ULT_S;                  inst = C_ULT_S;
1902                  if_true = 0;                  if_true = 0;
1903                  break;                  break;
1904          case SLJIT_C_FLOAT_GREATER:          case SLJIT_D_GREATER:
1905                  inst = C_ULE_S;                  inst = C_ULE_S;
1906                  if_true = 0;                  if_true = 0;
1907                  break;                  break;
1908          case SLJIT_C_FLOAT_LESS_EQUAL:          case SLJIT_D_LESS_EQUAL:
1909                  inst = C_ULE_S;                  inst = C_ULE_S;
1910                  if_true = 1;                  if_true = 1;
1911                  break;                  break;
1912          case SLJIT_C_FLOAT_UNORDERED:          case SLJIT_D_UNORDERED:
1913                  inst = C_UN_S;                  inst = C_UN_S;
1914                  if_true = 1;                  if_true = 1;
1915                  break;                  break;
         case SLJIT_C_FLOAT_ORDERED:  
1916          default: /* Make compilers happy. */          default: /* Make compilers happy. */
1917                    SLJIT_ASSERT_STOP();
1918            case SLJIT_D_ORDERED:
1919                  inst = C_UN_S;                  inst = C_UN_S;
1920                  if_true = 0;                  if_true = 0;
1921                  break;                  break;
# Line 1961  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1946  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1946          struct sljit_jump *jump = NULL;          struct sljit_jump *jump = NULL;
1947    
1948          CHECK_ERROR();          CHECK_ERROR();
1949          check_sljit_emit_ijump(compiler, type, src, srcw);          CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
1950          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1951    
1952          if (FAST_IS_REG(src)) {          if (FAST_IS_REG(src)) {
# Line 2027  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 2012  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
2012  #endif  #endif
2013    
2014          CHECK_ERROR();          CHECK_ERROR();
2015          check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type);          CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type));
2016          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
2017    
2018          if (dst == SLJIT_UNUSED)          if (dst == SLJIT_UNUSED)
# Line 2049  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 2034  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
2034                  srcw = 0;                  srcw = 0;
2035          }          }
2036    
2037          switch (type) {          switch (type & 0xff) {
2038          case SLJIT_C_EQUAL:          case SLJIT_EQUAL:
2039          case SLJIT_C_NOT_EQUAL:          case SLJIT_NOT_EQUAL:
2040                  FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));                  FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
2041                  dst_ar = sugg_dst_ar;                  dst_ar = sugg_dst_ar;
2042                  break;                  break;
2043          case SLJIT_C_LESS:          case SLJIT_LESS:
2044          case SLJIT_C_GREATER_EQUAL:          case SLJIT_GREATER_EQUAL:
2045          case SLJIT_C_FLOAT_LESS:          case SLJIT_D_LESS:
2046          case SLJIT_C_FLOAT_GREATER_EQUAL:          case SLJIT_D_GREATER_EQUAL:
2047                  dst_ar = ULESS_FLAG;                  dst_ar = ULESS_FLAG;
2048                  break;                  break;
2049          case SLJIT_C_GREATER:          case SLJIT_GREATER:
2050          case SLJIT_C_LESS_EQUAL:          case SLJIT_LESS_EQUAL:
2051          case SLJIT_C_FLOAT_GREATER:          case SLJIT_D_GREATER:
2052          case SLJIT_C_FLOAT_LESS_EQUAL:          case SLJIT_D_LESS_EQUAL:
2053                  dst_ar = UGREATER_FLAG;                  dst_ar = UGREATER_FLAG;
2054                  break;                  break;
2055          case SLJIT_C_SIG_LESS:          case SLJIT_SIG_LESS:
2056          case SLJIT_C_SIG_GREATER_EQUAL:          case SLJIT_SIG_GREATER_EQUAL:
2057                  dst_ar = LESS_FLAG;                  dst_ar = LESS_FLAG;
2058                  break;                  break;
2059          case SLJIT_C_SIG_GREATER:          case SLJIT_SIG_GREATER:
2060          case SLJIT_C_SIG_LESS_EQUAL:          case SLJIT_SIG_LESS_EQUAL:
2061                  dst_ar = GREATER_FLAG;                  dst_ar = GREATER_FLAG;
2062                  break;                  break;
2063          case SLJIT_C_OVERFLOW:          case SLJIT_OVERFLOW:
2064          case SLJIT_C_NOT_OVERFLOW:          case SLJIT_NOT_OVERFLOW:
2065                  dst_ar = OVERFLOW_FLAG;                  dst_ar = OVERFLOW_FLAG;
2066                  break;                  break;
2067          case SLJIT_C_MUL_OVERFLOW:          case SLJIT_MUL_OVERFLOW:
2068          case SLJIT_C_MUL_NOT_OVERFLOW:          case SLJIT_MUL_NOT_OVERFLOW:
2069                  FAIL_IF(push_inst(compiler, SLTIU | SA(OVERFLOW_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));                  FAIL_IF(push_inst(compiler, SLTIU | SA(OVERFLOW_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
2070                  dst_ar = sugg_dst_ar;                  dst_ar = sugg_dst_ar;
2071                  type ^= 0x1; /* Flip type bit for the XORI below. */                  type ^= 0x1; /* Flip type bit for the XORI below. */
2072                  break;                  break;
2073          case SLJIT_C_FLOAT_EQUAL:          case SLJIT_D_EQUAL:
2074          case SLJIT_C_FLOAT_NOT_EQUAL:          case SLJIT_D_NOT_EQUAL:
2075                  dst_ar = EQUAL_FLAG;                  dst_ar = EQUAL_FLAG;
2076                  break;                  break;
2077    
2078          case SLJIT_C_FLOAT_UNORDERED:          case SLJIT_D_UNORDERED:
2079          case SLJIT_C_FLOAT_ORDERED:          case SLJIT_D_ORDERED:
2080                  FAIL_IF(push_inst(compiler, CFC1 | TA(sugg_dst_ar) | DA(FCSR_REG), sugg_dst_ar));                  FAIL_IF(push_inst(compiler, CFC1 | TA(sugg_dst_ar) | DA(FCSR_REG), sugg_dst_ar));
2081                  FAIL_IF(push_inst(compiler, SRL | TA(sugg_dst_ar) | DA(sugg_dst_ar) | SH_IMM(23), sugg_dst_ar));                  FAIL_IF(push_inst(compiler, SRL | TA(sugg_dst_ar) | DA(sugg_dst_ar) | SH_IMM(23), sugg_dst_ar));
2082                  FAIL_IF(push_inst(compiler, ANDI | SA(sugg_dst_ar) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));                  FAIL_IF(push_inst(compiler, ANDI | SA(sugg_dst_ar) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
# Line 2133  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co Line 2118  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
2118          sljit_si reg;          sljit_si reg;
2119    
2120          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
2121          check_sljit_emit_const(compiler, dst, dstw, init_value);          CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
2122          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
2123    
2124          const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));          const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));

Legend:
Removed from v.1505  
changed lines
  Added in v.1506

  ViewVC Help
Powered by ViewVC 1.1.5