[Pcre-svn] [1290] code/trunk: Recursive control verb priorit…

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [1290] code/trunk: Recursive control verb priority is removed from JIT.
Revision: 1290
          http://vcs.pcre.org/viewvc?view=rev&revision=1290
Author:   zherczeg
Date:     2013-03-16 18:45:51 +0000 (Sat, 16 Mar 2013)


Log Message:
-----------
Recursive control verb priority is removed from JIT.

Modified Paths:
--------------
    code/trunk/pcre_jit_compile.c
    code/trunk/pcre_jit_test.c


Modified: code/trunk/pcre_jit_compile.c
===================================================================
--- code/trunk/pcre_jit_compile.c    2013-03-16 14:37:24 UTC (rev 1289)
+++ code/trunk/pcre_jit_compile.c    2013-03-16 18:45:51 UTC (rev 1290)
@@ -196,23 +196,14 @@
   struct stub_list *next;
 } stub_list;


-enum bytecode_flag_types {
- flag_optimized_cbracket = 1,
- flag_then_start = 2,
-};
-
enum frame_types {
no_frame = -1,
no_stack = -2
};

enum control_types {
- type_commit = 0,
- type_prune = 1,
- type_skip = 2,
- type_skip_arg = 3,
- type_mark = 4,
- type_then_trap = 5
+ type_mark = 0,
+ type_then_trap = 1
};

typedef int (SLJIT_CALL *jit_function)(jit_arguments *args);
@@ -985,11 +976,11 @@

     case OP_THEN_ARG:
     common->has_then = TRUE;
+    common->control_head_ptr = 1;
     /* Fall through. */


     case OP_PRUNE_ARG:
     common->needs_start_ptr = TRUE;
-    common->control_head_ptr = 1;
     /* Fall through. */


     case OP_MARK:
@@ -1003,12 +994,12 @@


     case OP_THEN:
     common->has_then = TRUE;
+    common->control_head_ptr = 1;
     /* Fall through. */


     case OP_PRUNE:
     case OP_SKIP:
     common->needs_start_ptr = TRUE;
-    common->control_head_ptr = 1;
     cc += 1;
     break;


@@ -1288,14 +1279,6 @@
     cc += 1 + LINK_SIZE + IMM2_SIZE;
     break;


-    case OP_PRUNE:
-    case OP_SKIP:
-    case OP_SKIP_ARG:
-    case OP_COMMIT:
-    if (common->control_head_ptr != 0)
-      *needs_control_head = TRUE;
-    /* Fall through. */
-
     default:
     stack_restore = TRUE;
     /* Fall through. */
@@ -2105,46 +2088,25 @@
 OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0);
 if (common->mark_ptr != 0)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr, SLJIT_IMM, 0);
-SLJIT_ASSERT(common->control_head_ptr != 0);
-OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr, SLJIT_IMM, 0);
+if (common->control_head_ptr != 0)
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), 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_LOCALS_REG), common->start_ptr);
 OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, base));
 }


-static sljit_sw SLJIT_CALL do_check_control_chain(sljit_sw *current)
+static sljit_sw SLJIT_CALL do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg)
 {
-sljit_sw return_value = 0;
-const pcre_uchar *skip_arg = NULL;
-
-SLJIT_ASSERT(current != NULL);
-do
+while (current != NULL)
   {
   switch (current[-2])
     {
-    case type_commit:
-    /* Commit overwrites all. */
-    return -1;
-
-    case type_prune:
     case type_then_trap:
     break;


-    case type_skip:
-    /* Overwrites prune, but not other skips. */
-    if (return_value == 0 && skip_arg == NULL)
-      return_value = current[-3];
-    break;
-
-    case type_skip_arg:
-    if (return_value == 0 && skip_arg == NULL)
-      skip_arg = (pcre_uchar *)current[-3];
-    break;
-
     case type_mark:
-    if (return_value == 0 && skip_arg != NULL)
-      if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[-3]) == 0)
-        return_value = current[-4];
+    if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[-3]) == 0)
+      return current[-4];
     break;


     default:
@@ -2153,28 +2115,21 @@
     }
   current = (sljit_sw*)current[-1];
   }
-while (current != NULL);
-return (return_value != 0 || skip_arg == NULL) ? return_value : -2;
+return -1;
 }


 static sljit_sw SLJIT_CALL do_search_then_trap(sljit_sw *current, sljit_sw start)
 {
 do
   {
+  SLJIT_ASSERT(current != NULL);
   switch (current[-2])
     {
-    case type_commit:
-    /* Commit overwrites all. */
-    return 0;
-
     case type_then_trap:
     if (current[-3] == start)
       return (sljit_sw)current;
     break;


-    case type_prune:
-    case type_skip:
-    case type_skip_arg:
     case type_mark:
     break;


@@ -2183,7 +2138,6 @@
     break;
     }
   current = (sljit_sw*)current[-1];
-  SLJIT_ASSERT(current != NULL);
   }
 while (TRUE);
 }
@@ -7296,21 +7250,15 @@
 pcre_uchar opcode = *cc;
 pcre_uchar *ccend = cc + 1;


-SLJIT_ASSERT(common->control_head_ptr != 0 || *cc == OP_COMMIT);
-
if (opcode == OP_PRUNE_ARG || opcode == OP_SKIP_ARG || opcode == OP_THEN_ARG)
ccend += 2 + cc[1];

PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);

-if (opcode == OP_SKIP || opcode == OP_SKIP_ARG)
+if (opcode == OP_SKIP)
{
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr);
- allocate_stack(common, 3);
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr, STACK_TOP, 0);
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, *cc == OP_SKIP ? type_skip : type_skip_arg);
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), (opcode == OP_SKIP) ? STR_PTR : SLJIT_IMM, (opcode == OP_SKIP) ? 0 : (sljit_sw)(cc + 2));
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
+ allocate_stack(common, 1);
+ OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
return ccend;
}

@@ -7322,15 +7270,6 @@
OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);
}

-if (common->control_head_ptr != 0 && ((opcode != OP_THEN && opcode != OP_THEN_ARG) || common->then_trap == NULL))
- {
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr);
- allocate_stack(common, 2);
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr, STACK_TOP, 0);
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, *cc == OP_COMMIT ? type_commit : type_prune);
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);
- }
-
return ccend;
}

@@ -8409,10 +8348,9 @@
DEFINE_COMPILER;
pcre_uchar opcode = *current->cc;

-SLJIT_ASSERT(common->control_head_ptr != 0);
-
if ((opcode == OP_THEN || opcode == OP_THEN_ARG) && common->then_trap != NULL)
{
+ SLJIT_ASSERT(common->control_head_ptr != 0);
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr);
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, STACK_TOP, 0);
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, common->then_trap->start);
@@ -8431,24 +8369,34 @@
return;
}

-if (!common->local_exit)
+if (common->local_exit)
   {
+  if (common->quit_label == NULL)
+    add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));
+  else
+    JUMPTO(SLJIT_JUMP, common->quit_label);
+  return;
+  }
+
+if (opcode == OP_SKIP_ARG)
+  {
+  SLJIT_ASSERT(common->control_head_ptr != 0);
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, STACK_TOP, 0);
-  sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_check_control_chain));
+  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));
   OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0);


OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);
add_jump(compiler, &common->reset_match, CMP(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, -1));
-
- OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);
+ return;
}

-/* Commit or in recurse or accept. */
-if (common->quit_label == NULL)
- add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));
+if (opcode == OP_SKIP)
+ OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
else
- JUMPTO(SLJIT_JUMP, common->quit_label);
+ OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_IMM, 0);
+add_jump(compiler, &common->reset_match, JUMP(SLJIT_JUMP));
}

 static SLJIT_INLINE void compile_then_trap_backtrackingpath(compiler_common *common, struct backtrack_common *current)
@@ -8632,42 +8580,10 @@
     case OP_PRUNE:
     case OP_PRUNE_ARG:
     case OP_SKIP:
+    case OP_SKIP_ARG:
     compile_control_verb_backtrackingpath(common, current);
     break;


-    case OP_SKIP_ARG:
-    if (!common->local_exit)
-      {
-      SLJIT_ASSERT(common->control_head_ptr != 0);
-      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr);
-      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, STACK_TOP, 0);
-      sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_check_control_chain));
-      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0);
-
-      OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);
-      add_jump(compiler, &common->reset_match, CMP(SLJIT_C_LESS, STR_PTR, 0, SLJIT_IMM, -2));
-
-      /* May not find suitable mark. */
-      OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);
-      if (common->quit_label == NULL)
-        add_jump(compiler, &common->quit, CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_IMM, -1));
-      else
-        CMPTO(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_IMM, -1, common->quit_label);
-
-      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
-      free_stack(common, 3);
-      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->control_head_ptr, TMP1, 0);
-      }
-    else
-      {
-      /* In recurse or accept. */
-      if (common->quit_label == NULL)
-        add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));
-      else
-        JUMPTO(SLJIT_JUMP, common->quit_label);
-      }
-    break;
-
     case OP_COMMIT:
     if (!common->local_exit)
       OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);


Modified: code/trunk/pcre_jit_test.c
===================================================================
--- code/trunk/pcre_jit_test.c    2013-03-16 14:37:24 UTC (rev 1289)
+++ code/trunk/pcre_jit_test.c    2013-03-16 18:45:51 UTC (rev 1290)
@@ -708,7 +708,7 @@
     { MUA, 0, "(a)(a)(a)(a)(a)(a)(a)(a)(*PRUNE)b|(a)", "aaaaaaaa" },
     { MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|", "a" },
     { MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|m", "a" },
-    { MUA, 0 | F_NOMATCH, "a(*COMMIT)(*PRUNE)d|bc", "abc" },
+    { MUA, 0, "a(*COMMIT)(*PRUNE)d|bc", "abc" },
     { MUA, 0, "(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
     { MUA, 0 | F_NOMATCH, "(*COMMIT)(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
     { MUA, 0, "(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
@@ -737,7 +737,7 @@
     { MUA, 0 | F_NOMATCH, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcm" },
     { MUA, 0, "((?:a(*THEN)|aab)c|a+)+m", "aabcaabcnmaabcaabcm" },
     { MUA, 0, "((?:a|aab)(*THEN)c|a+)+m", "aam" },
-    { MUA, 0 | F_NOMATCH, "((?:a(*COMMIT)|aab)(*THEN)c|a+)+m", "aam" },
+    { MUA, 0, "((?:a(*COMMIT)|aab)(*THEN)c|a+)+m", "aam" },


     /* Deep recursion. */
     { MUA, 0, "((((?:(?:(?:\\w)+)?)*|(?>\\w)+?)+|(?>\\w)?\?)*)?\\s", "aaaaa+ " },