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

Diff of /code/trunk/sljit/sljitNativeARM_64.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 32  SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST cha Line 32  SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST cha
32  /* Length of an instruction word */  /* Length of an instruction word */
33  typedef sljit_ui sljit_ins;  typedef sljit_ui sljit_ins;
34    
35  #define TMP_ZERO        0  #define TMP_ZERO        (0)
36    
37  #define TMP_REG1        (SLJIT_NUMBER_OF_REGISTERS + 2)  #define TMP_REG1        (SLJIT_NUMBER_OF_REGISTERS + 2)
38  #define TMP_REG2        (SLJIT_NUMBER_OF_REGISTERS + 3)  #define TMP_REG2        (SLJIT_NUMBER_OF_REGISTERS + 3)
39  #define TMP_REG3        (SLJIT_NUMBER_OF_REGISTERS + 4)  #define TMP_REG3        (SLJIT_NUMBER_OF_REGISTERS + 4)
40  #define TMP_REG4        (SLJIT_NUMBER_OF_REGISTERS + 5)  #define TMP_LR          (SLJIT_NUMBER_OF_REGISTERS + 5)
41  #define TMP_LR          (SLJIT_NUMBER_OF_REGISTERS + 6)  #define TMP_SP          (SLJIT_NUMBER_OF_REGISTERS + 6)
 #define TMP_SP          (SLJIT_NUMBER_OF_REGISTERS + 7)  
42    
43  #define TMP_FREG1       (0)  #define TMP_FREG1       (0)
44  #define TMP_FREG2       (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)  #define TMP_FREG2       (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
45    
46  static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = {  static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = {
47    31, 0, 1, 2, 3, 4, 5, 6, 7, 13, 14, 15, 16, 17, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 29, 9, 10, 11, 12, 30, 31    31, 0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, 8, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 29, 9, 10, 11, 30, 31
48  };  };
49    
50  #define W_OP (1 << 31)  #define W_OP (1 << 31)
# Line 220  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 219  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
219          struct sljit_const *const_;          struct sljit_const *const_;
220    
221          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
222          check_sljit_generate_code(compiler);          CHECK_PTR(check_sljit_generate_code(compiler));
223          reverse_buf(compiler);          reverse_buf(compiler);
224    
225          code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));          code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
# Line 730  static sljit_si emit_op_imm(struct sljit Line 729  static sljit_si emit_op_imm(struct sljit
729                          return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO));                          return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO));
730                  if (flags & INT_OP) {                  if (flags & INT_OP) {
731                          FAIL_IF(push_inst(compiler, SMADDL | RD(dst) | RN(arg1) | RM(arg2) | (31 << 10)));                          FAIL_IF(push_inst(compiler, SMADDL | RD(dst) | RN(arg1) | RM(arg2) | (31 << 10)));
732                          FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG4) | RN(TMP_ZERO) | RM(dst) | (2 << 22) | (31 << 10)));                          FAIL_IF(push_inst(compiler, ADD | RD(TMP_LR) | RN(TMP_ZERO) | RM(dst) | (2 << 22) | (31 << 10)));
733                          return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_REG4) | RM(dst) | (2 << 22) | (63 << 10));                          return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10));
734                  }                  }
735                  FAIL_IF(push_inst(compiler, SMULH | RD(TMP_REG4) | RN(arg1) | RM(arg2)));                  FAIL_IF(push_inst(compiler, SMULH | RD(TMP_LR) | RN(arg1) | RM(arg2)));
736                  FAIL_IF(push_inst(compiler, MADD | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)));                  FAIL_IF(push_inst(compiler, MADD | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)));
737                  return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_REG4) | RM(dst) | (2 << 22) | (63 << 10));                  return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10));
738          case SLJIT_AND:          case SLJIT_AND:
739                  CHECK_FLAGS(3 << 29);                  CHECK_FLAGS(3 << 29);
740                  return push_inst(compiler, (AND ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));                  return push_inst(compiler, (AND ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));
# Line 976  static sljit_si getput_arg(struct sljit_ Line 975  static sljit_si getput_arg(struct sljit_
975                          FAIL_IF(push_inst(compiler, ADD | RD(arg) | RN(arg) | RM(other_r) | (argw << 10)));                          FAIL_IF(push_inst(compiler, ADD | RD(arg) | RN(arg) | RM(other_r) | (argw << 10)));
976                          return push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(arg));                          return push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(arg));
977                  }                  }
978                  FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG4) | RN(arg) | RM(other_r) | (argw << 10)));                  FAIL_IF(push_inst(compiler, ADD | RD(TMP_LR) | RN(arg) | RM(other_r) | (argw << 10)));
979                  FAIL_IF(push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(TMP_REG4)));                  FAIL_IF(push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(TMP_LR)));
980                  return push_inst(compiler, ORR | RD(arg) | RN(TMP_ZERO) | RM(TMP_REG4));                  return push_inst(compiler, ORR | RD(arg) | RN(TMP_ZERO) | RM(TMP_LR));
981          }          }
982    
983          if (arg & OFFS_REG_MASK) {          if (arg & OFFS_REG_MASK) {
# Line 1065  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1064  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1064          sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,          sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
1065          sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)          sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
1066  {  {
1067          sljit_si i, tmp, offs, prev;          sljit_si i, tmp, offs, prev, saved_regs_size;
1068    
1069          CHECK_ERROR();          CHECK_ERROR();
1070          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));
1071            set_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
1072    
1073          compiler->options = options;          saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 0);
1074          compiler->scratches = scratches;          local_size += saved_regs_size + SLJIT_LOCALS_OFFSET;
1075          compiler->saveds = saveds;          local_size = (local_size + 15) & ~0xf;
         compiler->fscratches = fscratches;  
         compiler->fsaveds = fsaveds;  
 #if (defined SLJIT_DEBUG && SLJIT_DEBUG)  
         compiler->logical_local_size = local_size;  
 #endif  
         compiler->locals_offset = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);  
         local_size = (compiler->locals_offset + local_size + 15) & ~15;  
1076          compiler->local_size = local_size;          compiler->local_size = local_size;
1077    
1078          if (local_size <= (64 << 3))          if (local_size <= (63 * sizeof(sljit_sw))) {
1079                  FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR)                  FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR)
1080                          | RN(TMP_SP) | ((-(local_size >> 3) & 0x7f) << 15)));                          | RN(TMP_SP) | ((-(local_size >> 3) & 0x7f) << 15)));
1081          else {                  FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP) | (0 << 10)));
1082                  local_size -= (64 << 3);                  offs = (local_size - saved_regs_size) << (15 - 3);
1083                  if (local_size > 0xfff) {          } else {
1084                          FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));                  compiler->local_size += 2 * sizeof(sljit_sw);
1085                          local_size &= 0xfff;                  local_size -= saved_regs_size;
1086                  }                  saved_regs_size += 2 * sizeof(sljit_sw);
1087                  if (local_size)                  FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR)
1088                          FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));                          | RN(TMP_SP) | ((-(saved_regs_size >> 3) & 0x7f) << 15)));
1089                  FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR) | RN(TMP_SP) | (0x40 << 15)));                  offs = 2 << 15;
1090          }          }
1091    
         FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP)));  
   
1092          tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;          tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;
         offs = 2 << 15;  
1093          prev = -1;          prev = -1;
1094          for (i = SLJIT_S0; i >= tmp; i--) {          for (i = SLJIT_S0; i >= tmp; i--) {
1095                  if (prev == -1) {                  if (prev == -1) {
# Line 1124  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1114  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1114          if (prev != -1)          if (prev != -1)
1115                  FAIL_IF(push_inst(compiler, STRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));                  FAIL_IF(push_inst(compiler, STRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));
1116    
1117            if (compiler->local_size > (63 * sizeof(sljit_sw))) {
1118                    /* The local_size is already adjusted by the saved registers. */
1119                    if (local_size > 0xfff) {
1120                            FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));
1121                            local_size &= 0xfff;
1122                    }
1123                    if (local_size)
1124                            FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));
1125                    FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP) | (0 << 10)));
1126            }
1127    
1128          if (args >= 1)          if (args >= 1)
1129                  FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0) | RN(TMP_ZERO) | RM(SLJIT_R0)));                  FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0) | RN(TMP_ZERO) | RM(SLJIT_R0)));
1130          if (args >= 2)          if (args >= 2)
# Line 1134  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1135  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1135          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
1136  }  }
1137    
1138  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,
1139          sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,          sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
1140          sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)          sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
1141  {  {
1142          CHECK_ERROR_VOID();          CHECK_ERROR();
1143          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));
1144            set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
1145    
1146          compiler->options = options;          local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 0) + SLJIT_LOCALS_OFFSET;
1147          compiler->scratches = scratches;          local_size = (local_size + 15) & ~0xf;
1148          compiler->saveds = saveds;          if (local_size > (63 * sizeof(sljit_sw)))
1149          compiler->fscratches = fscratches;                  local_size += 2 * sizeof(sljit_sw);
1150          compiler->fsaveds = fsaveds;          compiler->local_size = local_size;
1151  #if (defined SLJIT_DEBUG && SLJIT_DEBUG)          return SLJIT_SUCCESS;
         compiler->logical_local_size = local_size;  
 #endif  
         compiler->locals_offset = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);  
         compiler->local_size = (compiler->locals_offset + local_size + 15) & ~15;  
1152  }  }
1153    
1154  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)
1155  {  {
1156          sljit_si local_size;          sljit_si local_size;
1157          sljit_si i, tmp, offs, prev;          sljit_si i, tmp, offs, prev, saved_regs_size;
1158    
1159          CHECK_ERROR();          CHECK_ERROR();
1160          check_sljit_emit_return(compiler, op, src, srcw);          CHECK(check_sljit_emit_return(compiler, op, src, srcw));
1161    
1162          FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));          FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
1163    
1164            local_size = compiler->local_size;
1165    
1166            saved_regs_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 0);
1167            if (local_size <= (63 * sizeof(sljit_sw)))
1168                    offs = (local_size - saved_regs_size) << (15 - 3);
1169            else {
1170                    saved_regs_size += 2 * sizeof(sljit_sw);
1171                    local_size -= saved_regs_size;
1172                    if (local_size > 0xfff) {
1173                            FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));
1174                            local_size &= 0xfff;
1175                    }
1176                    if (local_size)
1177                            FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));
1178                    local_size = saved_regs_size;
1179                    offs = 2 << 15;
1180            }
1181    
1182          tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;          tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;
         offs = 2 << 15;  
1183          prev = -1;          prev = -1;
1184          for (i = SLJIT_S0; i >= tmp; i--) {          for (i = SLJIT_S0; i >= tmp; i--) {
1185                  if (prev == -1) {                  if (prev == -1) {
# Line 1189  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1204  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1204          if (prev != -1)          if (prev != -1)
1205                  FAIL_IF(push_inst(compiler, LDRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));                  FAIL_IF(push_inst(compiler, LDRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));
1206    
1207          local_size = compiler->local_size;          FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR)
1208                    | RN(TMP_SP) | (((local_size >> 3) & 0x7f) << 15)));
         if (local_size <= (62 << 3))  
                 FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR)  
                         | RN(TMP_SP) | (((local_size >> 3) & 0x7f) << 15)));  
         else {  
                 FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR) | RN(TMP_SP) | (0x3e << 15)));  
                 local_size -= (62 << 3);  
                 if (local_size > 0xfff) {  
                         FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));  
                         local_size &= 0xfff;  
                 }  
                 if (local_size)  
                         FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));  
         }  
1209    
1210          FAIL_IF(push_inst(compiler, RET | RN(TMP_LR)));          FAIL_IF(push_inst(compiler, RET | RN(TMP_LR)));
1211          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
# Line 1218  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1220  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1220          sljit_ins inv_bits = (op & SLJIT_INT_OP) ? (1 << 31) : 0;          sljit_ins inv_bits = (op & SLJIT_INT_OP) ? (1 << 31) : 0;
1221    
1222          CHECK_ERROR();          CHECK_ERROR();
1223          check_sljit_emit_op0(compiler, op);          CHECK(check_sljit_emit_op0(compiler, op));
1224    
1225          op = GET_OPCODE(op);          op = GET_OPCODE(op);
1226          switch (op) {          switch (op) {
# Line 1226  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1228  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1228                  return push_inst(compiler, BRK);                  return push_inst(compiler, BRK);
1229          case SLJIT_NOP:          case SLJIT_NOP:
1230                  return push_inst(compiler, NOP);                  return push_inst(compiler, NOP);
1231          case SLJIT_UMUL:          case SLJIT_LUMUL:
1232          case SLJIT_SMUL:          case SLJIT_LSMUL:
1233                  FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));                  FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));
1234                  FAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));                  FAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));
1235                  return push_inst(compiler, (op == SLJIT_SMUL ? SMULH : UMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));                  return push_inst(compiler, (op == SLJIT_LUMUL ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
1236          case SLJIT_UDIV:          case SLJIT_LUDIV:
1237          case SLJIT_SDIV:          case SLJIT_LSDIV:
1238                  FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));                  FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));
1239                  FAIL_IF(push_inst(compiler, ((op == SLJIT_SDIV ? SDIV : UDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)));                  FAIL_IF(push_inst(compiler, ((op == SLJIT_LUDIV ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)));
1240                  FAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));                  FAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));
1241                  return push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));                  return push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
1242          }          }
# Line 1250  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1252  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1252          sljit_si op_flags = GET_ALL_FLAGS(op);          sljit_si op_flags = GET_ALL_FLAGS(op);
1253    
1254          CHECK_ERROR();          CHECK_ERROR();
1255          check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);          CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
1256          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1257          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1258    
# Line 1402  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1404  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1404          sljit_si dst_r, flags, mem_flags;          sljit_si dst_r, flags, mem_flags;
1405    
1406          CHECK_ERROR();          CHECK_ERROR();
1407          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));
1408          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1409          ADJUST_LOCAL_OFFSET(src1, src1w);          ADJUST_LOCAL_OFFSET(src1, src1w);
1410          ADJUST_LOCAL_OFFSET(src2, src2w);          ADJUST_LOCAL_OFFSET(src2, src2w);
# Line 1481  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1483  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1483    
1484  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)
1485  {  {
1486          check_sljit_get_register_index(reg);          CHECK_REG_INDEX(check_sljit_get_register_index(reg));
1487          return reg_map[reg];          return reg_map[reg];
1488  }  }
1489    
1490  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)
1491  {  {
1492          check_sljit_get_float_register_index(reg);          CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
1493          return reg;          return reg;
1494  }  }
1495    
# Line 1495  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1497  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1497          void *instruction, sljit_si size)          void *instruction, sljit_si size)
1498  {  {
1499          CHECK_ERROR();          CHECK_ERROR();
1500          check_sljit_emit_op_custom(compiler, instruction, size);          CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
         SLJIT_ASSERT(size == 4);  
1501    
1502          return push_inst(compiler, *(sljit_ins*)instruction);          return push_inst(compiler, *(sljit_ins*)instruction);
1503  }  }
# Line 1662  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1663  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1663          }          }
1664    
1665          switch (GET_OPCODE(op)) {          switch (GET_OPCODE(op)) {
1666          case SLJIT_MOVD:          case SLJIT_DMOV:
1667                  if (src != dst_r) {                  if (src != dst_r) {
1668                          if (dst_r != TMP_FREG1)                          if (dst_r != TMP_FREG1)
1669                                  FAIL_IF(push_inst(compiler, (FMOV ^ inv_bits) | VD(dst_r) | VN(src)));                                  FAIL_IF(push_inst(compiler, (FMOV ^ inv_bits) | VD(dst_r) | VN(src)));
# Line 1670  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1671  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1671                                  dst_r = src;                                  dst_r = src;
1672                  }                  }
1673                  break;                  break;
1674          case SLJIT_NEGD:          case SLJIT_DNEG:
1675                  FAIL_IF(push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(src)));                  FAIL_IF(push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(src)));
1676                  break;                  break;
1677          case SLJIT_ABSD:          case SLJIT_DABS:
1678                  FAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src)));                  FAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src)));
1679                  break;                  break;
1680          case SLJIT_CONVD_FROMS:          case SLJIT_CONVD_FROMS:
# Line 1695  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1696  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1696          sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0;          sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0;
1697    
1698          CHECK_ERROR();          CHECK_ERROR();
1699          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));
1700          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1701          ADJUST_LOCAL_OFFSET(src1, src1w);          ADJUST_LOCAL_OFFSET(src1, src1w);
1702          ADJUST_LOCAL_OFFSET(src2, src2w);          ADJUST_LOCAL_OFFSET(src2, src2w);
# Line 1714  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1715  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1715          }          }
1716    
1717          switch (GET_OPCODE(op)) {          switch (GET_OPCODE(op)) {
1718          case SLJIT_ADDD:          case SLJIT_DADD:
1719                  FAIL_IF(push_inst(compiler, (FADD ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));                  FAIL_IF(push_inst(compiler, (FADD ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
1720                  break;                  break;
1721          case SLJIT_SUBD:          case SLJIT_DSUB:
1722                  FAIL_IF(push_inst(compiler, (FSUB ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));                  FAIL_IF(push_inst(compiler, (FSUB ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
1723                  break;                  break;
1724          case SLJIT_MULD:          case SLJIT_DMUL:
1725                  FAIL_IF(push_inst(compiler, (FMUL ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));                  FAIL_IF(push_inst(compiler, (FMUL ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
1726                  break;                  break;
1727          case SLJIT_DIVD:          case SLJIT_DDIV:
1728                  FAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));                  FAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
1729                  break;                  break;
1730          }          }
# Line 1740  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1741  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1741  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)
1742  {  {
1743          CHECK_ERROR();          CHECK_ERROR();
1744          check_sljit_emit_fast_enter(compiler, dst, dstw);          CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
1745          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1746    
1747          /* For UNUSED dst. Uncommon, but possible. */          /* For UNUSED dst. Uncommon, but possible. */
# Line 1757  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1758  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1758  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)
1759  {  {
1760          CHECK_ERROR();          CHECK_ERROR();
1761          check_sljit_emit_fast_return(compiler, src, srcw);          CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
1762          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1763    
1764          if (FAST_IS_REG(src))          if (FAST_IS_REG(src))
# Line 1777  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1778  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1778  static sljit_uw get_cc(sljit_si type)  static sljit_uw get_cc(sljit_si type)
1779  {  {
1780          switch (type) {          switch (type) {
1781          case SLJIT_C_EQUAL:          case SLJIT_EQUAL:
1782          case SLJIT_C_MUL_NOT_OVERFLOW:          case SLJIT_MUL_NOT_OVERFLOW:
1783          case SLJIT_C_FLOAT_EQUAL:          case SLJIT_D_EQUAL:
1784                  return 0x1;                  return 0x1;
1785    
1786          case SLJIT_C_NOT_EQUAL:          case SLJIT_NOT_EQUAL:
1787          case SLJIT_C_MUL_OVERFLOW:          case SLJIT_MUL_OVERFLOW:
1788          case SLJIT_C_FLOAT_NOT_EQUAL:          case SLJIT_D_NOT_EQUAL:
1789                  return 0x0;                  return 0x0;
1790    
1791          case SLJIT_C_LESS:          case SLJIT_LESS:
1792          case SLJIT_C_FLOAT_LESS:          case SLJIT_D_LESS:
1793                  return 0x2;                  return 0x2;
1794    
1795          case SLJIT_C_GREATER_EQUAL:          case SLJIT_GREATER_EQUAL:
1796          case SLJIT_C_FLOAT_GREATER_EQUAL:          case SLJIT_D_GREATER_EQUAL:
1797                  return 0x3;                  return 0x3;
1798    
1799          case SLJIT_C_GREATER:          case SLJIT_GREATER:
1800          case SLJIT_C_FLOAT_GREATER:          case SLJIT_D_GREATER:
1801                  return 0x9;                  return 0x9;
1802    
1803          case SLJIT_C_LESS_EQUAL:          case SLJIT_LESS_EQUAL:
1804          case SLJIT_C_FLOAT_LESS_EQUAL:          case SLJIT_D_LESS_EQUAL:
1805                  return 0x8;                  return 0x8;
1806    
1807          case SLJIT_C_SIG_LESS:          case SLJIT_SIG_LESS:
1808                  return 0xa;                  return 0xa;
1809    
1810          case SLJIT_C_SIG_GREATER_EQUAL:          case SLJIT_SIG_GREATER_EQUAL:
1811                  return 0xb;                  return 0xb;
1812    
1813          case SLJIT_C_SIG_GREATER:          case SLJIT_SIG_GREATER:
1814                  return 0xd;                  return 0xd;
1815    
1816          case SLJIT_C_SIG_LESS_EQUAL:          case SLJIT_SIG_LESS_EQUAL:
1817                  return 0xc;                  return 0xc;
1818    
1819          case SLJIT_C_OVERFLOW:          case SLJIT_OVERFLOW:
1820          case SLJIT_C_FLOAT_UNORDERED:          case SLJIT_D_UNORDERED:
1821                  return 0x7;                  return 0x7;
1822    
1823          case SLJIT_C_NOT_OVERFLOW:          case SLJIT_NOT_OVERFLOW:
1824          case SLJIT_C_FLOAT_ORDERED:          case SLJIT_D_ORDERED:
1825                  return 0x6;                  return 0x6;
1826    
1827          default:          default:
# Line 1834  SLJIT_API_FUNC_ATTRIBUTE struct sljit_la Line 1835  SLJIT_API_FUNC_ATTRIBUTE struct sljit_la
1835          struct sljit_label *label;          struct sljit_label *label;
1836    
1837          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
1838          check_sljit_emit_label(compiler);          CHECK_PTR(check_sljit_emit_label(compiler));
1839    
1840          if (compiler->last_label && compiler->last_label->size == compiler->size)          if (compiler->last_label && compiler->last_label->size == compiler->size)
1841                  return compiler->last_label;                  return compiler->last_label;
# Line 1850  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1851  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1851          struct sljit_jump *jump;          struct sljit_jump *jump;
1852    
1853          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
1854          check_sljit_emit_jump(compiler, type);          CHECK_PTR(check_sljit_emit_jump(compiler, type));
1855    
1856          jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));          jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1857          PTR_FAIL_IF(!jump);          PTR_FAIL_IF(!jump);
# Line 1877  static SLJIT_INLINE struct sljit_jump* e Line 1878  static SLJIT_INLINE struct sljit_jump* e
1878          struct sljit_jump *jump;          struct sljit_jump *jump;
1879          sljit_ins inv_bits = (type & SLJIT_INT_OP) ? (1 << 31) : 0;          sljit_ins inv_bits = (type & SLJIT_INT_OP) ? (1 << 31) : 0;
1880    
1881          SLJIT_ASSERT((type & 0xff) == SLJIT_C_EQUAL || (type & 0xff) == SLJIT_C_NOT_EQUAL);          SLJIT_ASSERT((type & 0xff) == SLJIT_EQUAL || (type & 0xff) == SLJIT_NOT_EQUAL);
1882          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1883    
1884          jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));          jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
# Line 1895  static SLJIT_INLINE struct sljit_jump* e Line 1896  static SLJIT_INLINE struct sljit_jump* e
1896          }          }
1897          SLJIT_ASSERT(FAST_IS_REG(src));          SLJIT_ASSERT(FAST_IS_REG(src));
1898    
1899          if ((type & 0xff) == SLJIT_C_EQUAL)          if ((type & 0xff) == SLJIT_EQUAL)
1900                  inv_bits |= 1 << 24;                  inv_bits |= 1 << 24;
1901    
1902          PTR_FAIL_IF(push_inst(compiler, (CBZ ^ inv_bits) | (6 << 5) | RT(src)));          PTR_FAIL_IF(push_inst(compiler, (CBZ ^ inv_bits) | (6 << 5) | RT(src)));
# Line 1910  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1911  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1911          struct sljit_jump *jump;          struct sljit_jump *jump;
1912    
1913          CHECK_ERROR();          CHECK_ERROR();
1914          check_sljit_emit_ijump(compiler, type, src, srcw);          CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
1915          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1916    
1917          /* In ARM, we don't need to touch the arguments. */          /* In ARM, we don't need to touch the arguments. */
# Line 1941  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1942  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1942          sljit_ins cc;          sljit_ins cc;
1943    
1944          CHECK_ERROR();          CHECK_ERROR();
1945          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));
1946          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1947          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1948    
1949          if (dst == SLJIT_UNUSED)          if (dst == SLJIT_UNUSED)
1950                  return SLJIT_SUCCESS;                  return SLJIT_SUCCESS;
1951    
1952          cc = get_cc(type);          cc = get_cc(type & 0xff);
1953          dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;          dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
1954    
1955          if (GET_OPCODE(op) < SLJIT_ADD) {          if (GET_OPCODE(op) < SLJIT_ADD) {
# Line 1988  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co Line 1989  SLJIT_API_FUNC_ATTRIBUTE struct sljit_co
1989          sljit_si dst_r;          sljit_si dst_r;
1990    
1991          CHECK_ERROR_PTR();          CHECK_ERROR_PTR();
1992          check_sljit_emit_const(compiler, dst, dstw, init_value);          CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
1993          ADJUST_LOCAL_OFFSET(dst, dstw);          ADJUST_LOCAL_OFFSET(dst, dstw);
1994    
1995          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