Modified: tomcat/jk/trunk/native/iis/pcre/pcre_jit_compile.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/pcre/pcre_jit_compile.c?rev=1838867&r1=1838866&r2=1838867&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/pcre/pcre_jit_compile.c (original)
+++ tomcat/jk/trunk/native/iis/pcre/pcre_jit_compile.c Fri Aug 24 14:36:12 2018
@@ -164,7 +164,6 @@ typedef struct jit_arguments {
   const pcre_uchar *begin;
   const pcre_uchar *end;
   int *offsets;
-  pcre_uchar *uchar_ptr;
   pcre_uchar *mark_ptr;
   void *callout_data;
   /* Everything else after. */
@@ -214,7 +213,7 @@ enum control_types {
   type_then_trap = 1
 };
 
-typedef int (SLJIT_CALL *jit_function)(jit_arguments *args);
+typedef int (SLJIT_FUNC *jit_function)(jit_arguments *args);
 
 /* The following structure is the key data type for the recursive
 code generator. It is allocated by compile_matchingpath, and contains
@@ -489,9 +488,24 @@ typedef struct compare_context {
 /* Used for accessing the elements of the stack. */
 #define STACK(i)      ((i) * (int)sizeof(sljit_sw))
 
+#ifdef SLJIT_PREF_SHIFT_REG
+#if SLJIT_PREF_SHIFT_REG == SLJIT_R2
+/* Nothing. */
+#elif SLJIT_PREF_SHIFT_REG == SLJIT_R3
+#define SHIFT_REG_IS_R3
+#else
+#error "Unsupported shift register"
+#endif
+#endif
+
 #define TMP1          SLJIT_R0
+#ifdef SHIFT_REG_IS_R3
+#define TMP2          SLJIT_R3
+#define TMP3          SLJIT_R2
+#else
 #define TMP2          SLJIT_R2
 #define TMP3          SLJIT_R3
+#endif
 #define STR_PTR       SLJIT_S0
 #define STR_END       SLJIT_S1
 #define STACK_TOP     SLJIT_R1
@@ -520,13 +534,10 @@ the start pointers when the end of the c
 
 #if defined COMPILE_PCRE8
 #define MOV_UCHAR  SLJIT_MOV_U8
-#define MOVU_UCHAR SLJIT_MOVU_U8
 #elif defined COMPILE_PCRE16
 #define MOV_UCHAR  SLJIT_MOV_U16
-#define MOVU_UCHAR SLJIT_MOVU_U16
 #elif defined COMPILE_PCRE32
 #define MOV_UCHAR  SLJIT_MOV_U32
-#define MOVU_UCHAR SLJIT_MOVU_U32
 #else
 #error Unsupported compiling mode
 #endif
@@ -2383,12 +2394,25 @@ if (length < 8)
   }
 else
   {
-  GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START);
-  OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
-  loop = LABEL();
-  OP1(SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R0, 0);
-  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
-  JUMPTO(SLJIT_NOT_ZERO, loop);
+  if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | 
SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)) == 
SLJIT_SUCCESS)
+    {
+    GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START);
+    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
+    loop = LABEL();
+    sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, 
SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw));
+    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, loop);
+    }
+  else
+    {
+    GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START + sizeof(sljit_sw));
+    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
+    loop = LABEL();
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0);
+    OP2(SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw));
+    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, loop);
+    }
   }
 }
 
@@ -2421,12 +2445,25 @@ if (length < 8)
   }
 else
   {
-  GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw));
-  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
-  loop = LABEL();
-  OP1(SLJIT_MOVU, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0);
-  OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
-  JUMPTO(SLJIT_NOT_ZERO, loop);
+  if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | 
SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)) == SLJIT_SUCCESS)
+    {
+    GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw));
+    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
+    loop = LABEL();
+    sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, 
TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
+    OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, loop);
+    }
+  else
+    {
+    GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + 2 * sizeof(sljit_sw));
+    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
+    loop = LABEL();
+    OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP1, 0);
+    OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(sljit_sw));
+    OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, loop);
+    }
   }
 
 OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0);
@@ -2436,10 +2473,10 @@ if (common->control_head_ptr != 0)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
 OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), 
SLJIT_OFFSETOF(jit_arguments, stack));
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
-OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct 
sljit_stack, base));
+OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct 
sljit_stack, end));
 }
 
-static sljit_sw SLJIT_CALL do_search_mark(sljit_sw *current, const pcre_uchar 
*skip_arg)
+static sljit_sw SLJIT_FUNC do_search_mark(sljit_sw *current, const pcre_uchar 
*skip_arg)
 {
 while (current != NULL)
   {
@@ -2460,7 +2497,7 @@ while (current != NULL)
   SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]);
   current = (sljit_sw*)current[0];
   }
-return -1;
+return 0;
 }
 
 static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket)
@@ -2468,6 +2505,7 @@ static SLJIT_INLINE void copy_ovector(co
 DEFINE_COMPILER;
 struct sljit_label *loop;
 struct sljit_jump *early_quit;
+BOOL has_pre;
 
 /* At this point we can freely use all registers. */
 OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
@@ -2481,17 +2519,30 @@ if (common->mark_ptr != 0)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, 
mark_ptr), SLJIT_R2, 0);
 OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), 
SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int));
 OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), 
SLJIT_OFFSETOF(jit_arguments, begin));
-GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START);
+
+has_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, 
SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS;
+GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0));
+
 /* Unlikely, but possible */
 early_quit = CMP(SLJIT_EQUAL, SLJIT_R1, 0, SLJIT_IMM, 0);
 loop = LABEL();
-OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
-OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
+
+if (has_pre)
+  sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_S1, 
SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
+else
+  {
+  OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0);
+  OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
+  }
+
+OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, sizeof(int));
+OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_R0, 0);
 /* Copy the integer value to the output buffer */
 #if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
 OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT);
 #endif
-OP1(SLJIT_MOVU_S32, SLJIT_MEM1(SLJIT_R2), sizeof(int), SLJIT_S1, 0);
+
+OP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 0, SLJIT_S1, 0);
 OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
 JUMPTO(SLJIT_NOT_ZERO, loop);
 JUMPHERE(early_quit);
@@ -2499,14 +2550,29 @@ JUMPHERE(early_quit);
 /* Calculate the return value, which is the maximum ovector value. */
 if (topbracket > 1)
   {
-  GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * 
sizeof(sljit_sw));
-  OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
+  if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, 
SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))) == 
SLJIT_SUCCESS)
+    {
+    GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * 
sizeof(sljit_sw));
+    OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
 
-  /* OVECTOR(0) is never equal to SLJIT_S2. */
-  loop = LABEL();
-  OP1(SLJIT_MOVU, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), -(2 * 
(sljit_sw)sizeof(sljit_sw)));
-  OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
-  CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
+    /* OVECTOR(0) is never equal to SLJIT_S2. */
+    loop = LABEL();
+    sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_R2, 
SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw)));
+    OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
+    CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
+    }
+  else
+    {
+    GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + (topbracket - 1) * 2 * 
sizeof(sljit_sw));
+    OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
+
+    /* OVECTOR(0) is never equal to SLJIT_S2. */
+    loop = LABEL();
+    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), 0);
+    OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * 
(sljit_sw)sizeof(sljit_sw));
+    OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
+    CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
+    }
   OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_R1, 0);
   }
 else
@@ -5167,93 +5233,190 @@ OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0
 sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
-#define CHAR1 STR_END
-#define CHAR2 STACK_TOP
-
 static void do_casefulcmp(compiler_common *common)
 {
 DEFINE_COMPILER;
 struct sljit_jump *jump;
 struct sljit_label *label;
+int char1_reg;
+int char2_reg;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+if (sljit_get_register_index(TMP3) < 0)
+  {
+  char1_reg = STR_END;
+  char2_reg = STACK_TOP;
+  }
+else
+  {
+  char1_reg = TMP3;
+  char2_reg = RETURN_ADDR;
+  }
+
+sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-OP1(SLJIT_MOV, TMP3, 0, CHAR1, 0);
-OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, CHAR2, 0);
-OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
-OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 
-label = LABEL();
-OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1));
-OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
-jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0);
-OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
-JUMPTO(SLJIT_NOT_ZERO, label);
+if (char1_reg == STR_END)
+  {
+  OP1(SLJIT_MOV, TMP3, 0, char1_reg, 0);
+  OP1(SLJIT_MOV, RETURN_ADDR, 0, char2_reg, 0);
+  }
 
-JUMPHERE(jump);
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-OP1(SLJIT_MOV, CHAR1, 0, TMP3, 0);
-OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
-sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
-}
+if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, 
char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
+  {
+  label = LABEL();
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, 
SLJIT_MEM1(TMP1), IN_UCHARS(1));
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, 
SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
+  jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
+  OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
+  JUMPTO(SLJIT_NOT_ZERO, label);
+
+  JUMPHERE(jump);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+  }
+else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, 
char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
+  {
+  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
+  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+  label = LABEL();
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, 
SLJIT_MEM1(TMP1), IN_UCHARS(1));
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, 
SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
+  jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
+  OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
+  JUMPTO(SLJIT_NOT_ZERO, label);
 
-#define LCC_TABLE STACK_LIMIT
+  JUMPHERE(jump);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  }
+else
+  {
+  label = LABEL();
+  OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);
+  OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);
+  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
+  OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
+  JUMPTO(SLJIT_NOT_ZERO, label);
+
+  JUMPHERE(jump);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+  }
+
+if (char1_reg == STR_END)
+  {
+  OP1(SLJIT_MOV, char1_reg, 0, TMP3, 0);
+  OP1(SLJIT_MOV, char2_reg, 0, RETURN_ADDR, 0);
+  }
+
+sljit_emit_fast_return(compiler, TMP1, 0);
+}
 
 static void do_caselesscmp(compiler_common *common)
 {
 DEFINE_COMPILER;
 struct sljit_jump *jump;
 struct sljit_label *label;
+int char1_reg = STR_END;
+int char2_reg;
+int lcc_table;
+int opt_type = 0;
 
-sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
+if (sljit_get_register_index(TMP3) < 0)
+  {
+  char2_reg = STACK_TOP;
+  lcc_table = STACK_LIMIT;
+  }
+else
+  {
+  char2_reg = RETURN_ADDR;
+  lcc_table = TMP3;
+  }
+
+if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, 
char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
+  opt_type = 1;
+else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, 
char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
+  opt_type = 2;
+
+sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
 
-OP1(SLJIT_MOV, TMP3, 0, LCC_TABLE, 0);
-OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, CHAR1, 0);
-OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, CHAR2, 0);
-OP1(SLJIT_MOV, LCC_TABLE, 0, SLJIT_IMM, common->lcc);
-OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
-OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, char1_reg, 0);
+
+if (char2_reg == STACK_TOP)
+  {
+  OP1(SLJIT_MOV, TMP3, 0, char2_reg, 0);
+  OP1(SLJIT_MOV, RETURN_ADDR, 0, lcc_table, 0);
+  }
+
+OP1(SLJIT_MOV, lcc_table, 0, SLJIT_IMM, common->lcc);
+
+if (opt_type == 1)
+  {
+  label = LABEL();
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, 
SLJIT_MEM1(TMP1), IN_UCHARS(1));
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, 
SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
+  }
+else if (opt_type == 2)
+  {
+  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
+  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+  label = LABEL();
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, 
SLJIT_MEM1(TMP1), IN_UCHARS(1));
+  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, 
SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
+  }
+else
+  {
+  label = LABEL();
+  OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);
+  OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);
+  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
+  }
 
-label = LABEL();
-OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1));
-OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
 #ifndef COMPILE_PCRE8
-jump = CMP(SLJIT_GREATER, CHAR1, 0, SLJIT_IMM, 255);
+jump = CMP(SLJIT_GREATER, char1_reg, 0, SLJIT_IMM, 255);
 #endif
-OP1(SLJIT_MOV_U8, CHAR1, 0, SLJIT_MEM2(LCC_TABLE, CHAR1), 0);
+OP1(SLJIT_MOV_U8, char1_reg, 0, SLJIT_MEM2(lcc_table, char1_reg), 0);
 #ifndef COMPILE_PCRE8
 JUMPHERE(jump);
-jump = CMP(SLJIT_GREATER, CHAR2, 0, SLJIT_IMM, 255);
+jump = CMP(SLJIT_GREATER, char2_reg, 0, SLJIT_IMM, 255);
 #endif
-OP1(SLJIT_MOV_U8, CHAR2, 0, SLJIT_MEM2(LCC_TABLE, CHAR2), 0);
+OP1(SLJIT_MOV_U8, char2_reg, 0, SLJIT_MEM2(lcc_table, char2_reg), 0);
 #ifndef COMPILE_PCRE8
 JUMPHERE(jump);
 #endif
-jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0);
+
+if (opt_type == 0)
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
 OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
 JUMPTO(SLJIT_NOT_ZERO, label);
 
 JUMPHERE(jump);
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-OP1(SLJIT_MOV, LCC_TABLE, 0, TMP3, 0);
-OP1(SLJIT_MOV, CHAR1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
-OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
-sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
-}
+OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+
+if (opt_type == 2)
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 
-#undef LCC_TABLE
-#undef CHAR1
-#undef CHAR2
+if (char2_reg == STACK_TOP)
+  {
+  OP1(SLJIT_MOV, char2_reg, 0, TMP3, 0);
+  OP1(SLJIT_MOV, lcc_table, 0, RETURN_ADDR, 0);
+  }
+
+OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
+sljit_emit_fast_return(compiler, TMP1, 0);
+}
 
 #if defined SUPPORT_UTF && defined SUPPORT_UCP
 
-static const pcre_uchar * SLJIT_CALL do_utf_caselesscmp(pcre_uchar *src1, 
jit_arguments *args, pcre_uchar *end1)
+static const pcre_uchar * SLJIT_FUNC do_utf_caselesscmp(pcre_uchar *src1, 
pcre_uchar *src2, pcre_uchar *end1, pcre_uchar *end2)
 {
 /* This function would be ineffective to do in JIT level. */
 sljit_u32 c1, c2;
-const pcre_uchar *src2 = args->uchar_ptr;
-const pcre_uchar *end2 = args->end;
 const ucd_record *ur;
 const sljit_u32 *pp;
 
@@ -6776,32 +6939,37 @@ else
 #if defined SUPPORT_UTF && defined SUPPORT_UCP
 if (common->utf && *cc == OP_REFI)
   {
-  SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1 && TMP2 == SLJIT_R2);
+  SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1);
   if (ref)
-    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
+    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
   else
-    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
+    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
 
   if (withchecks)
-    jump = CMP(SLJIT_EQUAL, TMP1, 0, TMP2, 0);
+    jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_R2, 0);
 
-  /* Needed to save important temporary registers. */
+  /* No free saved registers so save data on stack. */
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
-  OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0);
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, 
uchar_ptr), STR_PTR, 0);
-  sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, 
SLJIT_FUNC_OFFSET(do_utf_caselesscmp));
+  OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0);
+  OP1(SLJIT_MOV, SLJIT_R3, 0, STR_END, 0);
+  sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | 
SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW), SLJIT_IMM, 
SLJIT_FUNC_OFFSET(do_utf_caselesscmp));
   OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
+
   if (common->mode == JIT_COMPILE)
     add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, SLJIT_RETURN_REG, 0, 
SLJIT_IMM, 1));
   else
     {
-    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, 
SLJIT_IMM, 0));
-    nopartial = CMP(SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);
+    OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_UNUSED, 0, 
SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);
+
+    add_jump(compiler, backtracks, JUMP(SLJIT_LESS));
+
+    nopartial = JUMP(SLJIT_NOT_EQUAL);
+    OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
     check_partial(common, FALSE);
     add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
     JUMPHERE(nopartial);
     }
-  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
   }
 else
 #endif /* SUPPORT_UTF && SUPPORT_UCP */
@@ -7125,7 +7293,7 @@ add_jump(compiler, &backtrack->topbacktr
 return cc + 1 + LINK_SIZE;
 }
 
-static int SLJIT_CALL do_callout(struct jit_arguments *arguments, 
PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector)
+static sljit_s32 SLJIT_FUNC do_callout(struct jit_arguments *arguments, 
PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector)
 {
 const pcre_uchar *begin = arguments->begin;
 int *offset_vector = arguments->offsets;
@@ -7207,18 +7375,17 @@ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOC
 /* SLJIT_R0 = arguments */
 OP1(SLJIT_MOV, SLJIT_R1, 0, STACK_TOP, 0);
 GET_LOCAL_BASE(SLJIT_R2, 0, OVECTOR_START);
-sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, 
SLJIT_FUNC_OFFSET(do_callout));
-OP1(SLJIT_MOV_S32, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0);
+sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(S32) | SLJIT_ARG1(SW) | 
SLJIT_ARG2(SW) | SLJIT_ARG3(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout));
 OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 free_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw));
 
 /* Check return value. */
-OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, 
SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
-add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER));
+OP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, 
SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
+add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32));
 if (common->forced_quit_label == NULL)
-  add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS 
*/);
+  add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS 
*/);
 else
-  JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->forced_quit_label);
+  JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->forced_quit_label);
 return cc + 2 + 2 * LINK_SIZE;
 }
 
@@ -10439,11 +10606,11 @@ if (opcode == OP_SKIP_ARG)
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
   OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, (sljit_sw)(current->cc + 2));
-  sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, 
SLJIT_FUNC_OFFSET(do_search_mark));
+  sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | 
SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_search_mark));
   OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 
   OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);
-  add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, 
SLJIT_IMM, -1));
+  add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, 
SLJIT_IMM, 0));
   return;
   }
 
@@ -11031,7 +11198,7 @@ if (!compiler)
 common->compiler = compiler;
 
 /* Main pcre_jit_exec entry. */
-sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, private_data_size);
+sljit_emit_enter(compiler, 0, SLJIT_ARG1(SW), 5, 5, 0, 0, private_data_size);
 
 /* Register init. */
 reset_ovector(common, (re->top_bracket + 1) * 2);
@@ -11044,8 +11211,8 @@ OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TM
 OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, 
end));
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, 
stack));
 OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, 
limit_match));
-OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct 
sljit_stack, base));
-OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct 
sljit_stack, limit));
+OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct 
sljit_stack, end));
+OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct 
sljit_stack, start));
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0);
 
@@ -11251,20 +11418,22 @@ common->quit_label = quit_label;
 set_jumps(common->stackalloc, LABEL());
 /* RETURN_ADDR is not a saved register. */
 sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
-OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0);
-OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, 
stack));
-OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top), 
STACK_TOP, 0);
-OP2(SLJIT_SUB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, 
limit), SLJIT_IMM, STACK_GROWTH_RATE);
 
-sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, 
SLJIT_FUNC_OFFSET(sljit_stack_resize));
-jump = CMP(SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
-OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, 
stack));
-OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct 
sljit_stack, top));
-OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct 
sljit_stack, limit));
-OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
-sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1);
+
+OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STACK_TOP, 0);
+OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
+OP2(SLJIT_SUB, SLJIT_R1, 0, STACK_LIMIT, 0, SLJIT_IMM, STACK_GROWTH_RATE);
+OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), 
SLJIT_OFFSETOF(jit_arguments, stack));
+OP1(SLJIT_MOV, STACK_LIMIT, 0, TMP2, 0);
+
+sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | 
SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));
+jump = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
+OP1(SLJIT_MOV, TMP2, 0, STACK_LIMIT, 0);
+OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_RETURN_REG, 0);
+OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
+sljit_emit_fast_return(compiler, TMP1, 0);
 
 /* Allocation failed. */
 JUMPHERE(jump);
@@ -11409,9 +11578,9 @@ union {
 sljit_u8 local_space[MACHINE_STACK_SIZE];
 struct sljit_stack local_stack;
 
-local_stack.max_limit = local_space;
-local_stack.limit = local_space;
-local_stack.base = local_space + MACHINE_STACK_SIZE;
+local_stack.min_start = local_space;
+local_stack.start = local_space;
+local_stack.end = local_space + MACHINE_STACK_SIZE;
 local_stack.top = local_space + MACHINE_STACK_SIZE;
 arguments->stack = &local_stack;
 convert_executable_func.executable_func = executable_func;
@@ -11529,7 +11698,7 @@ if ((options & PCRE_PARTIAL_HARD) != 0)
 else if ((options & PCRE_PARTIAL_SOFT) != 0)
   mode = JIT_PARTIAL_SOFT_COMPILE;
 
-if (functions->executable_funcs[mode] == NULL)
+if (functions == NULL || functions->executable_funcs[mode] == NULL)
   return PCRE_ERROR_JIT_BADOPTION;
 
 /* Sanity checks should be handled by pcre_exec. */

Modified: tomcat/jk/trunk/native/iis/pcre/pcregrep.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/pcre/pcregrep.c?rev=1838867&r1=1838866&r2=1838867&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/pcre/pcregrep.c (original)
+++ tomcat/jk/trunk/native/iis/pcre/pcregrep.c Fri Aug 24 14:36:12 2018
@@ -1387,8 +1387,8 @@ Returns:            nothing
 */
 
 static void
-do_after_lines(int lastmatchnumber, char *lastmatchrestart, char *endptr,
-  char *printname)
+do_after_lines(unsigned long int lastmatchnumber, char *lastmatchrestart,
+  char *endptr, char *printname)
 {
 if (after_context > 0 && lastmatchnumber > 0)
   {
@@ -1398,7 +1398,7 @@ if (after_context > 0 && lastmatchnumber
     int ellength;
     char *pp = lastmatchrestart;
     if (printname != NULL) fprintf(stdout, "%s-", printname);
-    if (number) fprintf(stdout, "%d-", lastmatchnumber++);
+    if (number) fprintf(stdout, "%lu-", lastmatchnumber++);
     pp = end_of_line(pp, endptr, &ellength);
     FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout);
     lastmatchrestart = pp;
@@ -1502,11 +1502,11 @@ static int
 pcregrep(void *handle, int frtype, char *filename, char *printname)
 {
 int rc = 1;
-int linenumber = 1;
-int lastmatchnumber = 0;
-int count = 0;
 int filepos = 0;
 int offsets[OFFSET_SIZE];
+unsigned long int linenumber = 1;
+unsigned long int lastmatchnumber = 0;
+unsigned long int count = 0;
 char *lastmatchrestart = NULL;
 char *ptr = main_buffer;
 char *endptr;
@@ -1609,7 +1609,7 @@ while (ptr < endptr)
 
   if (endlinelength == 0 && t == main_buffer + bufsize)
     {
-    fprintf(stderr, "pcregrep: line %d%s%s is too long for the internal 
buffer\n"
+    fprintf(stderr, "pcregrep: line %lu%s%s is too long for the internal 
buffer\n"
                     "pcregrep: check the --buffer-size option\n",
                     linenumber,
                     (filename == NULL)? "" : " of file ",
@@ -1747,7 +1747,7 @@ while (ptr < endptr)
           prevoffsets[1] = offsets[1];
 
           if (printname != NULL) fprintf(stdout, "%s:", printname);
-          if (number) fprintf(stdout, "%d:", linenumber);
+          if (number) fprintf(stdout, "%lu:", linenumber);
 
           /* Handle --line-offsets */
 
@@ -1862,7 +1862,7 @@ while (ptr < endptr)
           {
           char *pp = lastmatchrestart;
           if (printname != NULL) fprintf(stdout, "%s-", printname);
-          if (number) fprintf(stdout, "%d-", lastmatchnumber++);
+          if (number) fprintf(stdout, "%lu-", lastmatchnumber++);
           pp = end_of_line(pp, endptr, &ellength);
           FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout);
           lastmatchrestart = pp;
@@ -1902,7 +1902,7 @@ while (ptr < endptr)
           int ellength;
           char *pp = p;
           if (printname != NULL) fprintf(stdout, "%s-", printname);
-          if (number) fprintf(stdout, "%d-", linenumber - linecount--);
+          if (number) fprintf(stdout, "%lu-", linenumber - linecount--);
           pp = end_of_line(pp, endptr, &ellength);
           FWRITE(p, 1, pp - p, stdout);
           p = pp;
@@ -1916,7 +1916,7 @@ while (ptr < endptr)
         endhyphenpending = TRUE;
 
       if (printname != NULL) fprintf(stdout, "%s:", printname);
-      if (number) fprintf(stdout, "%d:", linenumber);
+      if (number) fprintf(stdout, "%lu:", linenumber);
 
       /* In multiline mode, we want to print to the end of the line in which
       the end of the matched string is found, so we adjust linelength and the
@@ -2112,7 +2112,7 @@ if (count_only && !quiet)
     {
     if (printname != NULL && filenames != FN_NONE)
       fprintf(stdout, "%s:", printname);
-    fprintf(stdout, "%d\n", count);
+    fprintf(stdout, "%lu\n", count);
     }
   }
 
@@ -2234,7 +2234,7 @@ if (isdirectory(pathname))
 
   if (dee_action == dee_RECURSE)
     {
-    char buffer[1024];
+    char buffer[2048];
     char *nextfile;
     directory_type *dir = opendirectory(pathname);
 
@@ -2249,7 +2249,14 @@ if (isdirectory(pathname))
     while ((nextfile = readdirectory(dir)) != NULL)
       {
       int frc;
-      sprintf(buffer, "%.512s%c%.128s", pathname, FILESEP, nextfile);
+      int fnlength = strlen(pathname) + strlen(nextfile) + 2;
+      if (fnlength > 2048)
+        {
+        fprintf(stderr, "pcre2grep: recursive filename is too long\n");
+        rc = 2;
+        break;
+        }
+      sprintf(buffer, "%s%c%s", pathname, FILESEP, nextfile);
       frc = grep_or_recurse(buffer, dir_recurse, FALSE);
       if (frc > 1) rc = frc;
        else if (frc == 0 && rc == 1) rc = 0;
@@ -2520,7 +2527,14 @@ if ((popts & PO_FIXED_STRINGS) != 0)
     }
   }
 
-sprintf(buffer, "%s%.*s%s", prefix[popts], patlen, ps, suffix[popts]);
+if (snprintf(buffer, PATBUFSIZE, "%s%.*s%s", prefix[popts], patlen, ps,
+      suffix[popts]) > PATBUFSIZE)
+  {
+  fprintf(stderr, "pcregrep: Buffer overflow while compiling \"%s\"\n",
+    ps);
+  return FALSE;
+  }
+
 p->compiled = pcre_compile(buffer, options, &error, &errptr, pcretables);
 if (p->compiled != NULL) return TRUE;
 
@@ -2756,8 +2770,15 @@ for (i = 1; i < argc; i++)
         int arglen = (argequals == NULL || equals == NULL)?
           (int)strlen(arg) : (int)(argequals - arg);
 
-        sprintf(buff1, "%.*s", baselen, op->long_name);
-        sprintf(buff2, "%s%.*s", buff1, fulllen - baselen - 2, opbra + 1);
+        if (snprintf(buff1, sizeof(buff1), "%.*s", baselen, op->long_name) >
+              (int)sizeof(buff1) ||
+            snprintf(buff2, sizeof(buff2), "%s%.*s", buff1,
+              fulllen - baselen - 2, opbra + 1) > (int)sizeof(buff2))
+          {
+          fprintf(stderr, "pcregrep: Buffer overflow when parsing %s option\n",
+            op->long_name);
+          pcregrep_exit(2);
+          }
 
         if (strncmp(arg, buff1, arglen) == 0 ||
            strncmp(arg, buff2, arglen) == 0)

Modified: tomcat/jk/trunk/native/iis/pcre/pcreposix.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/pcre/pcreposix.c?rev=1838867&r1=1838866&r2=1838867&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/pcre/pcreposix.c (original)
+++ tomcat/jk/trunk/native/iis/pcre/pcreposix.c Fri Aug 24 14:36:12 2018
@@ -6,7 +6,7 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2017 University of Cambridge
+           Copyright (c) 1997-2018 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -389,8 +389,8 @@ if (rc >= 0)
     {
     for (i = 0; i < (size_t)rc; i++)
       {
-      pmatch[i].rm_so = ovector[i*2] + so;
-      pmatch[i].rm_eo = ovector[i*2+1] + so;
+      pmatch[i].rm_so = (ovector[i*2] < 0)? -1 : ovector[i*2] + so;
+      pmatch[i].rm_eo = (ovector[i*2+1] < 0)? -1: ovector[i*2+1] + so;
       }
     if (allocated_ovector) free(ovector);
     for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;

Modified: tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfig.h
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfig.h?rev=1838867&r1=1838866&r2=1838867&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfig.h (original)
+++ tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfig.h Fri Aug 24 14:36:12 2018
@@ -108,8 +108,10 @@
 
 /* Force cdecl calling convention even if a better calling
    convention (e.g. fastcall) is supported by the C compiler.
-   If this option is enabled, C functions without
-   SLJIT_CALL can also be called from JIT code. */
+   If this option is disabled (this is the default), functions
+   called from JIT should be defined with SLJIT_FUNC attribute.
+   Standard C functions can still be called by using the
+   SLJIT_CALL_CDECL jump type. */
 #ifndef SLJIT_USE_CDECL_CALLING_CONVENTION
 /* Disabled by default */
 #define SLJIT_USE_CDECL_CALLING_CONVENTION 0

Modified: tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfigInternal.h
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfigInternal.h?rev=1838867&r1=1838866&r2=1838867&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfigInternal.h (original)
+++ tomcat/jk/trunk/native/iis/pcre/sljit/sljitConfigInternal.h Fri Aug 24 
14:36:12 2018
@@ -60,11 +60,13 @@
                        a single precision floating point array by index
      SLJIT_F64_SHIFT : the shift required to apply when accessing
                        a double precision floating point array by index
+     SLJIT_PREF_SHIFT_REG : x86 systems prefers ecx for shifting by register
+                            the scratch register index of ecx is stored in 
this variable
      SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + 
SLJIT_LOCALS_OFFSET)
      SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this 
offset to the return address
 
    Other macros:
-     SLJIT_CALL : C calling convention define for both calling JIT form C and 
C callbacks for JIT
+     SLJIT_FUNC : calling convention attribute for both calling JIT form C and 
C calling back from JIT
      SLJIT_W(number) : defining 64 bit constants on 64 bit architectures 
(compiler independent helper)
 */
 
@@ -145,17 +147,23 @@
 #define SLJIT_CONFIG_UNSUPPORTED 1
 #endif
 
-#else /* !_WIN32 */
+#else /* _WIN32 */
 
 #if defined(_M_X64) || defined(__x86_64__)
 #define SLJIT_CONFIG_X86_64 1
+#elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || 
defined(__thumb2__)
+#define SLJIT_CONFIG_ARM_THUMB2 1
+#elif (defined(_M_ARM) && _M_ARM >= 7)
+#define SLJIT_CONFIG_ARM_V7 1
 #elif defined(_ARM_)
 #define SLJIT_CONFIG_ARM_V5 1
+#elif defined(_M_ARM64) || defined(__aarch64__)
+#define SLJIT_CONFIG_ARM_64 1
 #else
 #define SLJIT_CONFIG_X86_32 1
 #endif
 
-#endif /* !WIN32 */
+#endif /* !_WIN32 */
 #endif /* SLJIT_CONFIG_AUTO */
 
 #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
@@ -322,6 +330,11 @@
        sparc_cache_flush((from), (to))
 #define SLJIT_CACHE_FLUSH_OWN_IMPL 1
 
+#elif defined _WIN32
+
+#define SLJIT_CACHE_FLUSH(from, to) \
+       FlushInstructionCache(GetCurrentProcess(), (char*)(from), (char*)(to) - 
(char*)(from))
+
 #else
 
 /* Calls __ARM_NR_cacheflush on ARM-Linux. */
@@ -369,12 +382,18 @@ typedef int sljit_sw;
 #define SLJIT_64BIT_ARCHITECTURE 1
 #define SLJIT_WORD_SHIFT 3
 #ifdef _WIN32
+#ifdef __GNUC__
+/* These types do not require windows.h */
+typedef unsigned long long sljit_uw;
+typedef long long sljit_sw;
+#else
 typedef unsigned __int64 sljit_uw;
 typedef __int64 sljit_sw;
-#else
+#endif
+#else /* !_WIN32 */
 typedef unsigned long int sljit_uw;
 typedef long int sljit_sw;
-#endif
+#endif /* _WIN32 */
 #endif
 
 typedef sljit_uw sljit_p;
@@ -471,44 +490,44 @@ typedef double sljit_f64;
 /* Calling convention of functions generated by SLJIT or called from the 
generated code. */
 
/*****************************************************************************************/
 
-#ifndef SLJIT_CALL
+#ifndef SLJIT_FUNC
 
 #if (defined SLJIT_USE_CDECL_CALLING_CONVENTION && 
SLJIT_USE_CDECL_CALLING_CONVENTION)
 
 /* Force cdecl. */
-#define SLJIT_CALL
+#define SLJIT_FUNC
 
 #elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
 
 #if defined(__GNUC__) && !defined(__APPLE__)
 
-#define SLJIT_CALL __attribute__ ((fastcall))
+#define SLJIT_FUNC __attribute__ ((fastcall))
 #define SLJIT_X86_32_FASTCALL 1
 
 #elif defined(_MSC_VER)
 
-#define SLJIT_CALL __fastcall
+#define SLJIT_FUNC __fastcall
 #define SLJIT_X86_32_FASTCALL 1
 
 #elif defined(__BORLANDC__)
 
-#define SLJIT_CALL __msfastcall
+#define SLJIT_FUNC __msfastcall
 #define SLJIT_X86_32_FASTCALL 1
 
 #else /* Unknown compiler. */
 
 /* The cdecl attribute is the default. */
-#define SLJIT_CALL
+#define SLJIT_FUNC
 
 #endif
 
 #else /* Non x86-32 architectures. */
 
-#define SLJIT_CALL
+#define SLJIT_FUNC
 
 #endif /* SLJIT_CONFIG_X86_32 */
 
-#endif /* !SLJIT_CALL */
+#endif /* !SLJIT_FUNC */
 
 #ifndef SLJIT_INDIRECT_CALL
 #if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined 
SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \
@@ -557,24 +576,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 
 #define SLJIT_NUMBER_OF_REGISTERS 12
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 9
-#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
 #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
-#else
-/* Maximum 3 arguments are passed on the stack, +1 for double alignment. */
-#define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
-#endif /* SLJIT_X86_32_FASTCALL */
+#define SLJIT_PREF_SHIFT_REG SLJIT_R2
 
 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
 
-#ifndef _WIN64
 #define SLJIT_NUMBER_OF_REGISTERS 13
+#ifndef _WIN64
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
 #define SLJIT_LOCALS_OFFSET_BASE 0
-#else
-#define SLJIT_NUMBER_OF_REGISTERS 13
+#else /* _WIN64 */
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
 #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
-#endif /* _WIN64 */
+#endif /* !_WIN64 */
+#define SLJIT_PREF_SHIFT_REG SLJIT_R3
 
 #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined 
SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
 
@@ -590,13 +605,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 
 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
 
-#define SLJIT_NUMBER_OF_REGISTERS 25
+#define SLJIT_NUMBER_OF_REGISTERS 26
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
-#define SLJIT_LOCALS_OFFSET_BASE (2 * sizeof(sljit_sw))
+#define SLJIT_LOCALS_OFFSET_BASE 0
 
 #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
 
-#define SLJIT_NUMBER_OF_REGISTERS 22
+#define SLJIT_NUMBER_OF_REGISTERS 23
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)
 #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw))
@@ -622,8 +637,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_
 #define SLJIT_NUMBER_OF_REGISTERS 18
 #define SLJIT_NUMBER_OF_SAVED_REGISTERS 14
 #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
-/* Add +1 for double alignment. */
-#define SLJIT_LOCALS_OFFSET_BASE ((23 + 1) * sizeof(sljit_sw))
+/* saved registers (16), return struct pointer (1), space for 6 argument words 
(1),
+   4th double arg (2), double alignment (1). */
+#define SLJIT_LOCALS_OFFSET_BASE ((16 + 1 + 6 + 2 + 1) * sizeof(sljit_sw))
 #endif
 
 #elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)

Modified: tomcat/jk/trunk/native/iis/pcre/sljit/sljitLir.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/pcre/sljit/sljitLir.c?rev=1838867&r1=1838866&r2=1838867&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/pcre/sljit/sljitLir.c (original)
+++ tomcat/jk/trunk/native/iis/pcre/sljit/sljitLir.c Fri Aug 24 14:36:12 2018
@@ -26,6 +26,13 @@
 
 #include "sljitLir.h"
 
+#ifdef _WIN32
+
+/* For SLJIT_CACHE_FLUSH, which can expand to FlushInstructionCache. */
+#include <windows.h>
+
+#endif /* _WIN32 */
+
 #if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
 
 /* These libraries are needed for the macros below. */
@@ -97,8 +104,13 @@
 #define GET_ALL_FLAGS(op) \
        ((op) & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK))
 
+#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
 #define TYPE_CAST_NEEDED(op) \
-       (((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S16) || ((op) >= 
SLJIT_MOVU_U8 && (op) <= SLJIT_MOVU_S16))
+       ((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S32)
+#else
+#define TYPE_CAST_NEEDED(op) \
+       ((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S16)
+#endif
 
 #define BUF_SIZE       4096
 
@@ -118,16 +130,19 @@
 /* When reg can be unused. */
 #define SLOW_IS_REG(reg)       ((reg) > 0 && (reg) <= REG_MASK)
 
+/* Mask for argument types. */
+#define SLJIT_DEF_MASK ((1 << SLJIT_DEF_SHIFT) - 1)
+
 /* Jump flags. */
 #define JUMP_LABEL     0x1
 #define JUMP_ADDR      0x2
 /* SLJIT_REWRITABLE_JUMP is 0x1000. */
 
 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
-#      define PATCH_MB 0x4
-#      define PATCH_MW 0x8
+#      define PATCH_MB         0x4
+#      define PATCH_MW         0x8
 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-#      define PATCH_MD 0x10
+#      define PATCH_MD         0x10
 #endif
 #endif
 
@@ -591,6 +606,19 @@ static SLJIT_INLINE void reverse_buf(str
        compiler->buf = prev;
 }
 
+static SLJIT_INLINE sljit_s32 get_arg_count(sljit_s32 arg_types)
+{
+       sljit_s32 arg_count = 0;
+
+       arg_types >>= SLJIT_DEF_SHIFT;
+       while (arg_types) {
+               arg_count++;
+               arg_types >>= SLJIT_DEF_SHIFT;
+       }
+
+       return arg_count;
+}
+
 static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler,
        sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 
saveds,
        sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
@@ -664,80 +692,106 @@ static SLJIT_INLINE void set_const(struc
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
 
 #define FUNCTION_CHECK_IS_REG(r) \
-       (((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) || \
-       ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))
+       (((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \
+       || ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))
 
-#define FUNCTION_CHECK_IS_REG_OR_UNUSED(r) \
-       ((r) == SLJIT_UNUSED || \
-       ((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) || \
-       ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))
+#define FUNCTION_CHECK_IS_FREG(fr) \
+       (((fr) >= SLJIT_FR0 && (fr) < (SLJIT_FR0 + compiler->fscratches)) \
+       || ((fr) > (SLJIT_FS0 - compiler->fsaveds) && (fr) <= SLJIT_FS0))
 
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-#define CHECK_NOT_VIRTUAL_REGISTER(p) \
-       CHECK_ARGUMENT((p) < SLJIT_R3 || (p) > SLJIT_R6);
+#define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8)
 #else
-#define CHECK_NOT_VIRTUAL_REGISTER(p)
+#define CHECK_IF_VIRTUAL_REGISTER(p) 0
 #endif
 
-#define FUNCTION_CHECK_SRC(p, i) \
-       CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1); \
-       if (FUNCTION_CHECK_IS_REG(p)) \
-               CHECK_ARGUMENT((i) == 0); \
-       else if ((p) == SLJIT_IMM) \
-               ; \
-       else if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
-               CHECK_ARGUMENT((i) >= 0 && (i) < compiler->logical_local_size); 
\
-       else { \
-               CHECK_ARGUMENT((p) & SLJIT_MEM); \
-               CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG_OR_UNUSED((p) & 
REG_MASK)); \
-               CHECK_NOT_VIRTUAL_REGISTER((p) & REG_MASK); \
-               if ((p) & OFFS_REG_MASK) { \
-                       CHECK_ARGUMENT(((p) & REG_MASK) != SLJIT_UNUSED); \
-                       CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(OFFS_REG(p))); \
-                       CHECK_NOT_VIRTUAL_REGISTER(OFFS_REG(p)); \
-                       CHECK_ARGUMENT(!((i) & ~0x3)); \
-               } \
-               CHECK_ARGUMENT(!((p) & ~(SLJIT_MEM | REG_MASK | 
OFFS_REG_MASK))); \
+static sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, 
sljit_s32 p, sljit_sw i)
+{
+       if (compiler->scratches == -1 || compiler->saveds == -1)
+               return 0;
+
+       if (!(p & SLJIT_MEM))
+               return 0;
+
+       if (!((p & REG_MASK) == SLJIT_UNUSED || FUNCTION_CHECK_IS_REG(p & 
REG_MASK)))
+               return 0;
+
+       if (CHECK_IF_VIRTUAL_REGISTER(p & REG_MASK))
+               return 0;
+
+       if (p & OFFS_REG_MASK) {
+               if ((p & REG_MASK) == SLJIT_UNUSED)
+                       return 0;
+
+               if (!(FUNCTION_CHECK_IS_REG(OFFS_REG(p))))
+                       return 0;
+
+               if (CHECK_IF_VIRTUAL_REGISTER(OFFS_REG(p)))
+                       return 0;
+
+               if ((i & ~0x3) != 0)
+                       return 0;
        }
 
+       return (p & ~(SLJIT_MEM | REG_MASK | OFFS_REG_MASK)) == 0;
+}
+
+#define FUNCTION_CHECK_SRC_MEM(p, i) \
+       CHECK_ARGUMENT(function_check_src_mem(compiler, p, i));
+
+static sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 
p, sljit_sw i)
+{
+       if (compiler->scratches == -1 || compiler->saveds == -1)
+               return 0;
+
+       if (FUNCTION_CHECK_IS_REG(p))
+               return (i == 0);
+
+       if (p == SLJIT_IMM)
+               return 1;
+
+       if (p == SLJIT_MEM1(SLJIT_SP))
+               return (i >= 0 && i < compiler->logical_local_size);
+
+       return function_check_src_mem(compiler, p, i);
+}
+
+#define FUNCTION_CHECK_SRC(p, i) \
+       CHECK_ARGUMENT(function_check_src(compiler, p, i));
+
+static sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 
p, sljit_sw i, sljit_s32 unused)
+{
+       if (compiler->scratches == -1 || compiler->saveds == -1)
+               return 0;
+
+       if (FUNCTION_CHECK_IS_REG(p) || ((unused) && (p) == SLJIT_UNUSED))
+               return (i == 0);
+
+       if (p == SLJIT_MEM1(SLJIT_SP))
+               return (i >= 0 && i < compiler->logical_local_size);
+
+       return function_check_src_mem(compiler, p, i);
+}
+
 #define FUNCTION_CHECK_DST(p, i, unused) \
-       CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1); \
-       if (FUNCTION_CHECK_IS_REG(p) || ((unused) && (p) == SLJIT_UNUSED)) \
-               CHECK_ARGUMENT((i) == 0); \
-       else if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
-               CHECK_ARGUMENT((i) >= 0 && (i) < compiler->logical_local_size); 
\
-       else { \
-               CHECK_ARGUMENT((p) & SLJIT_MEM); \
-               CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG_OR_UNUSED((p) & 
REG_MASK)); \
-               CHECK_NOT_VIRTUAL_REGISTER((p) & REG_MASK); \
-               if ((p) & OFFS_REG_MASK) { \
-                       CHECK_ARGUMENT(((p) & REG_MASK) != SLJIT_UNUSED); \
-                       CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(OFFS_REG(p))); \
-                       CHECK_NOT_VIRTUAL_REGISTER(OFFS_REG(p)); \
-                       CHECK_ARGUMENT(!((i) & ~0x3)); \
-               } \
-               CHECK_ARGUMENT(!((p) & ~(SLJIT_MEM | REG_MASK | 
OFFS_REG_MASK))); \
-       }
+       CHECK_ARGUMENT(function_check_dst(compiler, p, i, unused));
+
+static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, 
sljit_sw i)
+{
+       if (compiler->scratches == -1 || compiler->saveds == -1)
+               return 0;
+
+       if (FUNCTION_CHECK_IS_FREG(p))
+               return (i == 0);
+
+       if (p == SLJIT_MEM1(SLJIT_SP))
+               return (i >= 0 && i < compiler->logical_local_size);
+
+       return function_check_src_mem(compiler, p, i);
+}
 
 #define FUNCTION_FCHECK(p, i) \
-       CHECK_ARGUMENT(compiler->fscratches != -1 && compiler->fsaveds != -1); \
-       if (((p) >= SLJIT_FR0 && (p) < (SLJIT_FR0 + compiler->fscratches)) || \
-                       ((p) > (SLJIT_FS0 - compiler->fsaveds) && (p) <= 
SLJIT_FS0)) \
-               CHECK_ARGUMENT(i == 0); \
-       else if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
-               CHECK_ARGUMENT((i) >= 0 && (i) < compiler->logical_local_size); 
\
-       else { \
-               CHECK_ARGUMENT((p) & SLJIT_MEM); \
-               CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG_OR_UNUSED((p) & 
REG_MASK)); \
-               CHECK_NOT_VIRTUAL_REGISTER((p) & REG_MASK); \
-               if ((p) & OFFS_REG_MASK) { \
-                       CHECK_ARGUMENT(((p) & REG_MASK) != SLJIT_UNUSED); \
-                       CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(OFFS_REG(p))); \
-                       CHECK_NOT_VIRTUAL_REGISTER(OFFS_REG(p)); \
-                       CHECK_ARGUMENT(((p) & OFFS_REG_MASK) != 
TO_OFFS_REG(SLJIT_SP) && !(i & ~0x3)); \
-               } \
-               CHECK_ARGUMENT(!((p) & ~(SLJIT_MEM | REG_MASK | 
OFFS_REG_MASK))); \
-       }
+       CHECK_ARGUMENT(function_fcheck(compiler, p, i));
 
 #endif /* SLJIT_ARGUMENT_CHECKS */
 
@@ -758,64 +812,72 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_comp
 #      define SLJIT_PRINT_D    ""
 #endif
 
-#define sljit_verbose_reg(compiler, r) \
-       do { \
-               if ((r) < (SLJIT_R0 + compiler->scratches)) \
-                       fprintf(compiler->verbose, "r%d", (r) - SLJIT_R0); \
-               else if ((r) != SLJIT_SP) \
-                       fprintf(compiler->verbose, "s%d", 
SLJIT_NUMBER_OF_REGISTERS - (r)); \
-               else \
-                       fprintf(compiler->verbose, "sp"); \
-       } while (0)
+static void sljit_verbose_reg(struct sljit_compiler *compiler, sljit_s32 r)
+{
+       if (r < (SLJIT_R0 + compiler->scratches))
+               fprintf(compiler->verbose, "r%d", r - SLJIT_R0);
+       else if (r != SLJIT_SP)
+               fprintf(compiler->verbose, "s%d", SLJIT_NUMBER_OF_REGISTERS - 
r);
+       else
+               fprintf(compiler->verbose, "sp");
+}
 
-#define sljit_verbose_param(compiler, p, i) \
-       if ((p) & SLJIT_IMM) \
-               fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i)); \
-       else if ((p) & SLJIT_MEM) { \
-               if ((p) & REG_MASK) { \
-                       fputc('[', compiler->verbose); \
-                       sljit_verbose_reg(compiler, (p) & REG_MASK); \
-                       if ((p) & OFFS_REG_MASK) { \
-                               fprintf(compiler->verbose, " + "); \
-                               sljit_verbose_reg(compiler, OFFS_REG(p)); \
-                               if (i) \
-                                       fprintf(compiler->verbose, " * %d", 1 
<< (i)); \
-                       } \
-                       else if (i) \
-                               fprintf(compiler->verbose, " + %" SLJIT_PRINT_D 
"d", (i)); \
-                       fputc(']', compiler->verbose); \
-               } \
-               else \
-                       fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", 
(i)); \
-       } else if (p) \
-               sljit_verbose_reg(compiler, p); \
-       else \
+static void sljit_verbose_freg(struct sljit_compiler *compiler, sljit_s32 r)
+{
+       if (r < (SLJIT_FR0 + compiler->fscratches))
+               fprintf(compiler->verbose, "fr%d", r - SLJIT_FR0);
+       else
+               fprintf(compiler->verbose, "fs%d", 
SLJIT_NUMBER_OF_FLOAT_REGISTERS - r);
+}
+
+static void sljit_verbose_param(struct sljit_compiler *compiler, sljit_s32 p, 
sljit_sw i)
+{
+       if ((p) & SLJIT_IMM)
+               fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i));
+       else if ((p) & SLJIT_MEM) {
+               if ((p) & REG_MASK) {
+                       fputc('[', compiler->verbose);
+                       sljit_verbose_reg(compiler, (p) & REG_MASK);
+                       if ((p) & OFFS_REG_MASK) {
+                               fprintf(compiler->verbose, " + ");
+                               sljit_verbose_reg(compiler, OFFS_REG(p));
+                               if (i)
+                                       fprintf(compiler->verbose, " * %d", 1 
<< (i));
+                       }
+                       else if (i)
+                               fprintf(compiler->verbose, " + %" SLJIT_PRINT_D 
"d", (i));
+                       fputc(']', compiler->verbose);
+               }
+               else
+                       fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", 
(i));
+       } else if (p)
+               sljit_verbose_reg(compiler, p);
+       else
                fprintf(compiler->verbose, "unused");
+}
 
-#define sljit_verbose_fparam(compiler, p, i) \
-       if ((p) & SLJIT_MEM) { \
-               if ((p) & REG_MASK) { \
-                       fputc('[', compiler->verbose); \
-                       sljit_verbose_reg(compiler, (p) & REG_MASK); \
-                       if ((p) & OFFS_REG_MASK) { \
-                               fprintf(compiler->verbose, " + "); \
-                               sljit_verbose_reg(compiler, OFFS_REG(p)); \
-                               if (i) \
-                                       fprintf(compiler->verbose, "%d", 1 << 
(i)); \
-                       } \
-                       else if (i) \
-                               fprintf(compiler->verbose, "%" SLJIT_PRINT_D 
"d", (i)); \
-                       fputc(']', compiler->verbose); \
-               } \
-               else \
-                       fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", 
(i)); \
-       } \
-       else { \
-               if ((p) < (SLJIT_FR0 + compiler->fscratches)) \
-                       fprintf(compiler->verbose, "fr%d", (p) - SLJIT_FR0); \
-               else \
-                       fprintf(compiler->verbose, "fs%d", 
SLJIT_NUMBER_OF_FLOAT_REGISTERS - (p)); \
+static void sljit_verbose_fparam(struct sljit_compiler *compiler, sljit_s32 p, 
sljit_sw i)
+{
+       if ((p) & SLJIT_MEM) {
+               if ((p) & REG_MASK) {
+                       fputc('[', compiler->verbose);
+                       sljit_verbose_reg(compiler, (p) & REG_MASK);
+                       if ((p) & OFFS_REG_MASK) {
+                               fprintf(compiler->verbose, " + ");
+                               sljit_verbose_reg(compiler, OFFS_REG(p));
+                               if (i)
+                                       fprintf(compiler->verbose, "%d", 1 << 
(i));
+                       }
+                       else if (i)
+                               fprintf(compiler->verbose, " + %" SLJIT_PRINT_D 
"d", (i));
+                       fputc(']', compiler->verbose);
+               }
+               else
+                       fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", 
(i));
        }
+       else
+               sljit_verbose_freg(compiler, p);
+}
 
 static const char* op0_names[] = {
        (char*)"breakpoint", (char*)"nop", (char*)"lmul.uw", (char*)"lmul.sw",
@@ -864,7 +926,11 @@ static char* jump_names[] = {
        (char*)"greater", (char*)"less_equal",
        (char*)"unordered", (char*)"ordered",
        (char*)"jump", (char*)"fast_call",
-       (char*)"call0", (char*)"call1", (char*)"call2", (char*)"call3"
+       (char*)"call", (char*)"call.cdecl"
+};
+
+static char* call_arg_names[] = {
+       (char*)"void", (char*)"sw", (char*)"uw", (char*)"s32", (char*)"u32", 
(char*)"f32", (char*)"f64"
 };
 
 #endif /* SLJIT_VERBOSE */
@@ -897,53 +963,104 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 }
 
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_enter(struct 
sljit_compiler *compiler,
-       sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 
saveds,
+       sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 
saveds,
        sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
 {
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+       sljit_s32 types, arg_count, curr_type;
+#endif
+
        SLJIT_UNUSED_ARG(compiler);
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
        CHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT));
-       CHECK_ARGUMENT(args >= 0 && args <= 3);
        CHECK_ARGUMENT(scratches >= 0 && scratches <= 
SLJIT_NUMBER_OF_REGISTERS);
        CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);
        CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
-       CHECK_ARGUMENT(args <= saveds);
        CHECK_ARGUMENT(fscratches >= 0 && fscratches <= 
SLJIT_NUMBER_OF_FLOAT_REGISTERS);
        CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= 
SLJIT_NUMBER_OF_FLOAT_REGISTERS);
        CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
        CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
+       CHECK_ARGUMENT((arg_types & SLJIT_DEF_MASK) == 0);
+
+       types = (arg_types >> SLJIT_DEF_SHIFT);
+       arg_count = 0;
+       while (types != 0 && arg_count < 3) {
+               curr_type = (types & SLJIT_DEF_MASK);
+               CHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == 
SLJIT_ARG_TYPE_UW);
+               arg_count++;
+               types >>= SLJIT_DEF_SHIFT;
+       }
+       CHECK_ARGUMENT(arg_count <= saveds && types == 0);
+
        compiler->last_flags = 0;
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
-       if (SLJIT_UNLIKELY(!!compiler->verbose))
-               fprintf(compiler->verbose, "  enter options:none args:%d 
scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n",
-                       args, scratches, saveds, fscratches, fsaveds, 
local_size);
+       if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+               fprintf(compiler->verbose, "  enter options:%s args[", (options 
& SLJIT_F64_ALIGNMENT) ? "f64_align" : "");
+
+               arg_types >>= SLJIT_DEF_SHIFT;
+               while (arg_types) {
+                       fprintf(compiler->verbose, "%s", 
call_arg_names[arg_types & SLJIT_DEF_MASK]);
+                       arg_types >>= SLJIT_DEF_SHIFT;
+                       if (arg_types)
+                               fprintf(compiler->verbose, ",");
+               }
+
+               fprintf(compiler->verbose, "] scratches:%d saveds:%d 
fscratches:%d fsaveds:%d local_size:%d\n",
+                       scratches, saveds, fscratches, fsaveds, local_size);
+       }
 #endif
        CHECK_RETURN_OK;
 }
 
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_set_context(struct 
sljit_compiler *compiler,
-       sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 
saveds,
+       sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 
saveds,
        sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+       sljit_s32 types, arg_count, curr_type;
+#endif
+
+       SLJIT_UNUSED_ARG(compiler);
+
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
        CHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT));
-       CHECK_ARGUMENT(args >= 0 && args <= 3);
        CHECK_ARGUMENT(scratches >= 0 && scratches <= 
SLJIT_NUMBER_OF_REGISTERS);
        CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);
        CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
-       CHECK_ARGUMENT(args <= saveds);
        CHECK_ARGUMENT(fscratches >= 0 && fscratches <= 
SLJIT_NUMBER_OF_FLOAT_REGISTERS);
        CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= 
SLJIT_NUMBER_OF_FLOAT_REGISTERS);
        CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
        CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
+
+       types = (arg_types >> SLJIT_DEF_SHIFT);
+       arg_count = 0;
+       while (types != 0 && arg_count < 3) {
+               curr_type = (types & SLJIT_DEF_MASK);
+               CHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == 
SLJIT_ARG_TYPE_UW);
+               arg_count++;
+               types >>= SLJIT_DEF_SHIFT;
+       }
+       CHECK_ARGUMENT(arg_count <= saveds && types == 0);
+
        compiler->last_flags = 0;
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
-       if (SLJIT_UNLIKELY(!!compiler->verbose))
-               fprintf(compiler->verbose, "  set_context options:none args:%d 
scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n",
-                       args, scratches, saveds, fscratches, fsaveds, 
local_size);
+       if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+               fprintf(compiler->verbose, "  set_context options:%s args[", 
(options & SLJIT_F64_ALIGNMENT) ? "f64_align" : "");
+
+               arg_types >>= SLJIT_DEF_SHIFT;
+               while (arg_types) {
+                       fprintf(compiler->verbose, "%s", 
call_arg_names[arg_types & SLJIT_DEF_MASK]);
+                       arg_types >>= SLJIT_DEF_SHIFT;
+                       if (arg_types)
+                               fprintf(compiler->verbose, ",");
+               }
+
+               fprintf(compiler->verbose, "] scratches:%d saveds:%d 
fscratches:%d fsaveds:%d local_size:%d\n",
+                       scratches, saveds, fscratches, fsaveds, local_size);
+       }
 #endif
        CHECK_RETURN_OK;
 }
@@ -994,6 +1111,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 {
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
        FUNCTION_CHECK_SRC(src, srcw);
+       CHECK_ARGUMENT(src != SLJIT_IMM);
        compiler->last_flags = 0;
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
@@ -1052,9 +1170,6 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
        case SLJIT_MOV:
        case SLJIT_MOV_U32:
        case SLJIT_MOV_P:
-       case SLJIT_MOVU:
-       case SLJIT_MOVU_U32:
-       case SLJIT_MOVU_P:
                /* Nothing allowed */
                CHECK_ARGUMENT(!(op & (SLJIT_I32_OP | SLJIT_SET_Z | 
VARIABLE_FLAG_MASK)));
                break;
@@ -1067,28 +1182,17 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
        FUNCTION_CHECK_DST(dst, dstw, 1);
        FUNCTION_CHECK_SRC(src, srcw);
 
-       if (GET_OPCODE(op) >= SLJIT_NOT)
+       if (GET_OPCODE(op) >= SLJIT_NOT) {
+               CHECK_ARGUMENT(src != SLJIT_IMM);
                compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP 
| SLJIT_SET_Z));
-       else if (GET_OPCODE(op) >= SLJIT_MOVU) {
-               CHECK_ARGUMENT(!(src & SLJIT_MEM) || (src & REG_MASK) != 
SLJIT_SP);
-               CHECK_ARGUMENT(!(dst & SLJIT_MEM) || (dst & REG_MASK) != 
SLJIT_SP);
-               if ((src & REG_MASK) != SLJIT_UNUSED) {
-                       CHECK_ARGUMENT((src & REG_MASK) != (dst & REG_MASK) && 
(src & REG_MASK) != OFFS_REG(dst));
-                       CHECK_ARGUMENT((src & OFFS_REG_MASK) == SLJIT_UNUSED || 
srcw == 0);
-               }
-               if ((dst & REG_MASK) != SLJIT_UNUSED) {
-                       CHECK_ARGUMENT((dst & REG_MASK) != OFFS_REG(src));
-                       CHECK_ARGUMENT((dst & OFFS_REG_MASK) == SLJIT_UNUSED || 
dstw == 0);
-               }
-               compiler->last_flags = 0;
        }
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
        if (SLJIT_UNLIKELY(!!compiler->verbose)) {
-               if (GET_OPCODE(op) <= SLJIT_MOVU_P)
+               if (GET_OPCODE(op) <= SLJIT_MOV_P)
                {
-                       fprintf(compiler->verbose, "  mov%s%s%s ", 
(GET_OPCODE(op) >= SLJIT_MOVU) ? "u" : "",
-                               !(op & SLJIT_I32_OP) ? "" : "32", (op != 
SLJIT_MOV32 && op != SLJIT_MOVU32) ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] 
: "");
+                       fprintf(compiler->verbose, "  mov%s%s ", !(op & 
SLJIT_I32_OP) ? "" : "32",
+                               (op != SLJIT_MOV32) ? op1_names[GET_OPCODE(op) 
- SLJIT_OP1_BASE] : "");
                }
                else
                {
@@ -1417,9 +1521,8 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
        CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | 
SLJIT_I32_OP)));
        CHECK_ARGUMENT((type & 0xff) != GET_FLAG_TYPE(SLJIT_SET_CARRY) && (type 
& 0xff) != (GET_FLAG_TYPE(SLJIT_SET_CARRY) + 1));
-       CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= 
SLJIT_CALL3);
+       CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= 
SLJIT_FAST_CALL);
        CHECK_ARGUMENT((type & 0xff) < SLJIT_JUMP || !(type & SLJIT_I32_OP));
-       CHECK_ARGUMENT((type & 0xff) <= SLJIT_CALL0 || ((type & 0xff) - 
SLJIT_CALL0) <= compiler->scratches);
 
        if ((type & 0xff) < SLJIT_JUMP) {
                if ((type & 0xff) <= SLJIT_NOT_ZERO)
@@ -1439,6 +1542,63 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
        CHECK_RETURN_OK;
 }
 
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_call(struct 
sljit_compiler *compiler, sljit_s32 type,
+       sljit_s32 arg_types)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+       sljit_s32 i, types, curr_type, scratches, fscratches;
+
+       CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
+       CHECK_ARGUMENT((type & 0xff) == SLJIT_CALL || (type & 0xff) == 
SLJIT_CALL_CDECL);
+
+       types = arg_types;
+       scratches = 0;
+       fscratches = 0;
+       for (i = 0; i < 5; i++) {
+               curr_type = (types & SLJIT_DEF_MASK);
+               CHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64);
+               if (i > 0) {
+                       if (curr_type == 0) {
+                               break;
+                       }
+                       if (curr_type >= SLJIT_ARG_TYPE_F32)
+                               fscratches++;
+                       else
+                               scratches++;
+               } else {
+                       if (curr_type >= SLJIT_ARG_TYPE_F32) {
+                               CHECK_ARGUMENT(compiler->fscratches > 0);
+                       } else if (curr_type >= SLJIT_ARG_TYPE_SW) {
+                               CHECK_ARGUMENT(compiler->scratches > 0);
+                       }
+               }
+               types >>= SLJIT_DEF_SHIFT;
+       }
+       CHECK_ARGUMENT(compiler->scratches >= scratches);
+       CHECK_ARGUMENT(compiler->fscratches >= fscratches);
+       CHECK_ARGUMENT(types == 0);
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+       if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+               fprintf(compiler->verbose, "  %s%s ret[%s", jump_names[type & 
0xff],
+                       !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", 
call_arg_names[arg_types & SLJIT_DEF_MASK]);
+
+               arg_types >>= SLJIT_DEF_SHIFT;
+               if (arg_types) {
+                       fprintf(compiler->verbose, "], args[");
+                       do {
+                               fprintf(compiler->verbose, "%s", 
call_arg_names[arg_types & SLJIT_DEF_MASK]);
+                               arg_types >>= SLJIT_DEF_SHIFT;
+                               if (arg_types)
+                                       fprintf(compiler->verbose, ",");
+                       } while (arg_types);
+               }
+               fprintf(compiler->verbose, "]\n");
+       }
+#endif
+       CHECK_RETURN_OK;
+}
+
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmp(struct 
sljit_compiler *compiler, sljit_s32 type,
        sljit_s32 src1, sljit_sw src1w,
        sljit_s32 src2, sljit_sw src2w)
@@ -1488,20 +1648,16 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
        CHECK_RETURN_OK;
 }
 
-static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_ijump(struct 
sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_ijump(struct 
sljit_compiler *compiler, sljit_s32 type,
+       sljit_s32 src, sljit_sw srcw)
 {
-#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-       compiler->last_flags = 0;
-#endif
-
        if (SLJIT_UNLIKELY(compiler->skip_checks)) {
                compiler->skip_checks = 0;
                CHECK_RETURN_OK;
        }
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
-       CHECK_ARGUMENT(type >= SLJIT_JUMP && type <= SLJIT_CALL3);
-       CHECK_ARGUMENT(type <= SLJIT_CALL0 || (type - SLJIT_CALL0) <= 
compiler->scratches);
+       CHECK_ARGUMENT(type >= SLJIT_JUMP && type <= SLJIT_FAST_CALL);
        FUNCTION_CHECK_SRC(src, srcw);
 #endif
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
@@ -1514,6 +1670,66 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
        CHECK_RETURN_OK;
 }
 
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_icall(struct 
sljit_compiler *compiler, sljit_s32 type,
+       sljit_s32 arg_types,
+       sljit_s32 src, sljit_sw srcw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+       sljit_s32 i, types, curr_type, scratches, fscratches;
+
+       CHECK_ARGUMENT(type == SLJIT_CALL || type == SLJIT_CALL_CDECL);
+       FUNCTION_CHECK_SRC(src, srcw);
+
+       types = arg_types;
+       scratches = 0;
+       fscratches = 0;
+       for (i = 0; i < 5; i++) {
+               curr_type = (types & SLJIT_DEF_MASK);
+               CHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64);
+               if (i > 0) {
+                       if (curr_type == 0) {
+                               break;
+                       }
+                       if (curr_type >= SLJIT_ARG_TYPE_F32)
+                               fscratches++;
+                       else
+                               scratches++;
+               } else {
+                       if (curr_type >= SLJIT_ARG_TYPE_F32) {
+                               CHECK_ARGUMENT(compiler->fscratches > 0);
+                       } else if (curr_type >= SLJIT_ARG_TYPE_SW) {
+                               CHECK_ARGUMENT(compiler->scratches > 0);
+                       }
+               }
+               types >>= SLJIT_DEF_SHIFT;
+       }
+       CHECK_ARGUMENT(compiler->scratches >= scratches);
+       CHECK_ARGUMENT(compiler->fscratches >= fscratches);
+       CHECK_ARGUMENT(types == 0);
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+       if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+               fprintf(compiler->verbose, "  i%s%s ret[%s", jump_names[type & 
0xff],
+                       !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", 
call_arg_names[arg_types & SLJIT_DEF_MASK]);
+
+               arg_types >>= SLJIT_DEF_SHIFT;
+               if (arg_types) {
+                       fprintf(compiler->verbose, "], args[");
+                       do {
+                               fprintf(compiler->verbose, "%s", 
call_arg_names[arg_types & SLJIT_DEF_MASK]);
+                               arg_types >>= SLJIT_DEF_SHIFT;
+                               if (arg_types)
+                                       fprintf(compiler->verbose, ",");
+                       } while (arg_types);
+               }
+               fprintf(compiler->verbose, "], ");
+               sljit_verbose_param(compiler, src, srcw);
+               fprintf(compiler->verbose, "\n");
+       }
+#endif
+       CHECK_RETURN_OK;
+}
+
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct 
sljit_compiler *compiler, sljit_s32 op,
        sljit_s32 dst, sljit_sw dstw,
        sljit_s32 type)
@@ -1558,9 +1774,12 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
        CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP)));
        CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= 
SLJIT_ORDERED_F64);
+
+       CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1);
        CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg & ~SLJIT_I32_OP));
        if (src != SLJIT_IMM) {
                CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src));
+               CHECK_ARGUMENT(srcw == 0);
        }
 
        if ((type & 0xff) <= SLJIT_NOT_ZERO)
@@ -1573,7 +1792,7 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
        if (SLJIT_UNLIKELY(!!compiler->verbose)) {
                fprintf(compiler->verbose, "  cmov%s %s%s, ",
-                       !(dst_reg & SLJIT_I32_OP) ? "" : ".i",
+                       !(dst_reg & SLJIT_I32_OP) ? "" : "32",
                        jump_names[type & 0xff], JUMP_POSTFIX(type));
                sljit_verbose_reg(compiler, dst_reg & ~SLJIT_I32_OP);
                fprintf(compiler->verbose, ", ");
@@ -1584,8 +1803,75 @@ static SLJIT_INLINE CHECK_RETURN_TYPE ch
        CHECK_RETURN_OK;
 }
 
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem(struct 
sljit_compiler *compiler, sljit_s32 type,
+       sljit_s32 reg,
+       sljit_s32 mem, sljit_sw memw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+       CHECK_ARGUMENT((type & 0xff) >= SLJIT_MOV && (type & 0xff) <= 
SLJIT_MOV_P);
+       CHECK_ARGUMENT(!(type & SLJIT_I32_OP) || ((type & 0xff) != SLJIT_MOV && 
(type & 0xff) != SLJIT_MOV_U32 && (type & 0xff) != SLJIT_MOV_P));
+       CHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST));
+       CHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != 
(SLJIT_MEM_PRE | SLJIT_MEM_POST));
+       CHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | 
SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0);
+
+       FUNCTION_CHECK_SRC_MEM(mem, memw);
+       CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
+
+       CHECK_ARGUMENT((mem & REG_MASK) != SLJIT_UNUSED && (mem & REG_MASK) != 
reg);
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+       if (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) {
+               if (sljit_emit_mem(compiler, type | SLJIT_MEM_SUPP, reg, mem, 
memw) == SLJIT_ERR_UNSUPPORTED)
+                       fprintf(compiler->verbose, "  //");
+
+               fprintf(compiler->verbose, "  mem%s.%s%s%s ",
+                       !(type & SLJIT_I32_OP) ? "" : "32",
+                       (type & SLJIT_MEM_STORE) ? "st" : "ld",
+                       op1_names[(type & 0xff) - SLJIT_OP1_BASE],
+                       (type & SLJIT_MEM_PRE) ? ".pre" : ".post");
+               sljit_verbose_reg(compiler, reg);
+               fprintf(compiler->verbose, ", ");
+               sljit_verbose_param(compiler, mem, memw);
+               fprintf(compiler->verbose, "\n");
+       }
+#endif
+       CHECK_RETURN_OK;
+}
+
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem(struct 
sljit_compiler *compiler, sljit_s32 type,
+       sljit_s32 freg,
+       sljit_s32 mem, sljit_sw memw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+       CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64);
+       CHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST));
+       CHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != 
(SLJIT_MEM_PRE | SLJIT_MEM_POST));
+       CHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | 
SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0);
+
+       FUNCTION_CHECK_SRC_MEM(mem, memw);
+       CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg));
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+       if (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) {
+               if (sljit_emit_fmem(compiler, type | SLJIT_MEM_SUPP, freg, mem, 
memw) == SLJIT_ERR_UNSUPPORTED)
+                       fprintf(compiler->verbose, "  //");
+
+               fprintf(compiler->verbose, "  fmem.%s%s%s ",
+                       (type & SLJIT_MEM_STORE) ? "st" : "ld",
+                       !(type & SLJIT_I32_OP) ? ".f64" : ".f32",
+                       (type & SLJIT_MEM_PRE) ? ".pre" : ".post");
+               sljit_verbose_freg(compiler, freg);
+               fprintf(compiler->verbose, ", ");
+               sljit_verbose_param(compiler, mem, memw);
+               fprintf(compiler->verbose, "\n");
+       }
+#endif
+       CHECK_RETURN_OK;
+}
+
 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct 
sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
 {
+       /* Any offset is allowed. */
        SLJIT_UNUSED_ARG(offset);
 
 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
@@ -1856,7 +2142,51 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
        return sljit_emit_jump(compiler, type);
 }
 
-#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
+#if !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
+       && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
+       && !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler 
*compiler, sljit_s32 type,
+       sljit_s32 reg,
+       sljit_s32 mem, sljit_sw memw)
+{
+       SLJIT_UNUSED_ARG(compiler);
+       SLJIT_UNUSED_ARG(type);
+       SLJIT_UNUSED_ARG(reg);
+       SLJIT_UNUSED_ARG(mem);
+       SLJIT_UNUSED_ARG(memw);
+
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));
+
+       return SLJIT_ERR_UNSUPPORTED;
+}
+
+#endif
+
+#if !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
+       && !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler 
*compiler, sljit_s32 type,
+       sljit_s32 freg,
+       sljit_s32 mem, sljit_sw memw)
+{
+       SLJIT_UNUSED_ARG(compiler);
+       SLJIT_UNUSED_ARG(type);
+       SLJIT_UNUSED_ARG(freg);
+       SLJIT_UNUSED_ARG(mem);
+       SLJIT_UNUSED_ARG(memw);
+
+       CHECK_ERROR();
+       CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));
+
+       return SLJIT_ERR_UNSUPPORTED;
+}
+
+#endif
+
+#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
+       && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler 
*compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
 {
@@ -1941,12 +2271,12 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler 
*compiler,
-       sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 
saveds,
+       sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 
saveds,
        sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
 {
        SLJIT_UNUSED_ARG(compiler);
        SLJIT_UNUSED_ARG(options);
-       SLJIT_UNUSED_ARG(args);
+       SLJIT_UNUSED_ARG(arg_types);
        SLJIT_UNUSED_ARG(scratches);
        SLJIT_UNUSED_ARG(saveds);
        SLJIT_UNUSED_ARG(fscratches);
@@ -1957,12 +2287,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler 
*compiler,
-       sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 
saveds,
+       sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 
saveds,
        sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
 {
        SLJIT_UNUSED_ARG(compiler);
        SLJIT_UNUSED_ARG(options);
-       SLJIT_UNUSED_ARG(args);
+       SLJIT_UNUSED_ARG(arg_types);
        SLJIT_UNUSED_ARG(scratches);
        SLJIT_UNUSED_ARG(saveds);
        SLJIT_UNUSED_ARG(fscratches);
@@ -2107,6 +2437,16 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
        return NULL;
 }
 
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct 
sljit_compiler *compiler, sljit_s32 type,
+       sljit_s32 arg_types)
+{
+       SLJIT_UNUSED_ARG(compiler);
+       SLJIT_UNUSED_ARG(type);
+       SLJIT_UNUSED_ARG(arg_types);
+       SLJIT_UNREACHABLE();
+       return NULL;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct 
sljit_compiler *compiler, sljit_s32 type,
        sljit_s32 src1, sljit_sw src1w,
        sljit_s32 src2, sljit_sw src2w)
@@ -2159,6 +2499,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
        return SLJIT_ERR_UNSUPPORTED;
 }
 
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler 
*compiler, sljit_s32 type,
+       sljit_s32 arg_types,
+       sljit_s32 src, sljit_sw srcw)
+{
+       SLJIT_UNUSED_ARG(compiler);
+       SLJIT_UNUSED_ARG(type);
+       SLJIT_UNUSED_ARG(arg_types);
+       SLJIT_UNUSED_ARG(src);
+       SLJIT_UNUSED_ARG(srcw);
+       SLJIT_UNREACHABLE();
+       return SLJIT_ERR_UNSUPPORTED;
+}
+
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler 
*compiler, sljit_s32 op,
        sljit_s32 dst, sljit_sw dstw,
        sljit_s32 type)
@@ -2184,6 +2537,28 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit
        SLJIT_UNREACHABLE();
        return SLJIT_ERR_UNSUPPORTED;
 }
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler 
*compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw)
+{
+       SLJIT_UNUSED_ARG(compiler);
+       SLJIT_UNUSED_ARG(type);
+       SLJIT_UNUSED_ARG(reg);
+       SLJIT_UNUSED_ARG(mem);
+       SLJIT_UNUSED_ARG(memw);
+       SLJIT_UNREACHABLE();
+       return SLJIT_ERR_UNSUPPORTED;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler 
*compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw)
+{
+       SLJIT_UNUSED_ARG(compiler);
+       SLJIT_UNUSED_ARG(type);
+       SLJIT_UNUSED_ARG(freg);
+       SLJIT_UNUSED_ARG(mem);
+       SLJIT_UNUSED_ARG(memw);
+       SLJIT_UNREACHABLE();
+       return SLJIT_ERR_UNSUPPORTED;
+}
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler 
*compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
 {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to