RPA Toolkit
Support for conditional instructions is conditional now. Implemented a few performanc...
authorMartin Stoilov <martin@rpasearch.com>
Thu, 21 Apr 2011 05:49:23 +0000 (22:49 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Thu, 21 Apr 2011 05:49:23 +0000 (22:49 -0700)
rpa2/rpacache.c
rpa2/rpacompiler.c
rpa2/rpaparser.c
rpa2/rpastat.c
rpa2/rpavm.c
rpa2/rpavm.h
rvm/rvmcpu.c

index a1e80b4..8adc5b7 100644 (file)
@@ -38,7 +38,7 @@ void rpa_cache_set(rpacache_t *cache, rlong top, rlong ruleid, rlong ret, rlong
 {
        rulong bucket = RPA_MCACHE_BUCKET(top, ruleid);
 
-       if (ret <= 0 || cache->disalbled)
+       if (cache->disalbled)
                return;
        cache->entry[bucket].ruleid = ruleid;
        cache->entry[bucket].top = top;
index f89688d..71833c7 100644 (file)
@@ -381,7 +381,7 @@ rint rpa_compiler_rule_begin(rpa_compiler_t *co, const rchar *name, ruint namesi
        exp.dataidx = rpa_compiler_addblob(co, exp.start, ruleuid, flags, name, namesize);
 
        rvm_codegen_addins(co->cg, rvm_asm(RPA_CHECKCACHE, DA, R_TOP, XX, exp.start));
-       rvm_codegen_addins(co->cg, rvm_asm(RVM_BXGRE, LR, XX, XX, 0));
+       rvm_codegen_addins(co->cg, rvm_asm(RVM_BXNEQ, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R_REC, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, LR, XX, XX, 0));
@@ -417,8 +417,9 @@ rint rpa_compiler_rule_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
-//     rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
+       rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_OTP, R_TOP, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
+       rvm_codegen_addins(co->cg, rvm_asml(RPA_SETCACHE, DA, R_REC, R_REC, exp.start));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
        return 0;
 }
index fe6fd44..f3a5825 100644 (file)
@@ -1,4 +1,5 @@
 #include "rmem.h"
+#include "rvmcodegen.h"
 #include "rstring.h"
 #include "rpaparser.h"
 
@@ -412,7 +413,6 @@ static void rpa_production_regexchar(rpa_parser_t *pa)
        rpa_compiler_t *co = pa->co;
        rpa_compiler_rule_begin_s(co, "regexchar");
 
-       rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ' '));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '~'));
@@ -459,8 +459,6 @@ static void rpa_production_regexchar(rpa_parser_t *pa)
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '\n'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
-       rpa_compiler_class_end(co);
-       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rpa_compiler_reference_nan_s(co, "char");
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
 
@@ -564,10 +562,7 @@ static void rpa_production_clschar(rpa_parser_t *pa)
        rpa_compiler_rulepref_set_ruleuid_flags_s(co, "clschar", RPA_PRODUCTION_CLSCHAR, RPA_RFLAG_EMITRECORD);
        rpa_compiler_rule_begin_s(co, "clschar");
 
-       rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rpa_production_clschars(pa);
-       rpa_compiler_class_end(co);
-       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rpa_compiler_rule_end(co);
@@ -581,10 +576,10 @@ static void rpa_production_beginchar(rpa_parser_t *pa)
        rpa_compiler_rulepref_set_ruleuid_flags_s(co, "beginchar", RPA_PRODUCTION_BEGINCHAR, RPA_RFLAG_EMITRECORD);
        rpa_compiler_rule_begin_s(co, "beginchar");
 
-       rpa_compiler_class_begin(co, RPA_MATCH_NONE);
+//     rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rpa_production_clschars(pa);
-       rpa_compiler_class_end(co);
-       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
+//     rpa_compiler_class_end(co);
+//     rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
 
@@ -599,10 +594,10 @@ static void rpa_production_endchar(rpa_parser_t *pa)
        rpa_compiler_rulepref_set_ruleuid_flags_s(co, "endchar", RPA_PRODUCTION_ENDCHAR, RPA_RFLAG_EMITRECORD);
        rpa_compiler_rule_begin_s(co, "endchar");
 
-       rpa_compiler_class_begin(co, RPA_MATCH_NONE);
+//     rpa_compiler_class_begin(co, RPA_MATCH_NONE);
        rpa_production_clschars(pa);
-       rpa_compiler_class_end(co);
-       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
+//     rpa_compiler_class_end(co);
+//     rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHSPCHR_NAN, DA, XX, XX, '.'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
        rpa_compiler_rule_end(co);
@@ -842,12 +837,12 @@ static void rpa_production_hex(rpa_parser_t *pa)
        rpa_compiler_rule_begin_s(co, "hex");
 
        rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
+       rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
+       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'f'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'F'));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
-       rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
-       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
        rpa_compiler_class_end(co);
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
 
index 436b3e8..2e4dc9c 100644 (file)
@@ -268,6 +268,9 @@ rint rpa_stat_matchspchr(rpastat_t *stat, rssize_t top, rulong wc)
                return 0;
 
        switch (wc) {
+               case '.':
+                       return 1;
+                       break;
                case 't':
                        wc = '\t';
                        break;
@@ -277,9 +280,6 @@ rint rpa_stat_matchspchr(rpastat_t *stat, rssize_t top, rulong wc)
                case 'n':
                        wc = '\n';
                        break;
-               case '.':
-                       return 1;
-                       break;
                default:
                        break;
        };
index ad74284..cb429a4 100644 (file)
@@ -4,32 +4,6 @@
 #include "rmem.h"
 
 
-//static void rpavm_swi_shift(rvmcpu_t *cpu, rvm_asmins_t *ins)
-//{
-//     rpastat_t *stat = (rpastat_t *)cpu->userdata1;
-//     rlong tp = RVM_CPUREG_GETL(cpu, R_TOP);
-//     rpainput_t * ptp = &stat->instack[tp];
-//
-//     if (ptp->eof)
-//             return;
-//     ptp++;
-//     tp++;
-//     if (tp >= (rlong)stat->ip.serial) {
-//             rint inc = 0;
-//             ptp->input = stat->ip.input;
-//             if (ptp->input < stat->end) {
-//                     inc = r_utf8_mbtowc(&ptp->wc, (const ruchar*)stat->ip.input, (const ruchar*)stat->end);
-//                     stat->ip.input += inc;
-//                     stat->ip.serial += 1;
-//                     ptp->eof = 0;
-//             } else {
-//                     ptp->wc = (ruint32)-1;
-//                     ptp->eof = 1;
-//             }
-//     }
-//     RVM_CPUREG_SETL(cpu, R_TOP, tp);
-//}
-
 static void rpavm_swi_shift(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
        rpastat_t *stat = (rpastat_t *)cpu->userdata1;
@@ -39,164 +13,136 @@ static void rpavm_swi_shift(rvmcpu_t *cpu, rvm_asmins_t *ins)
                RVM_CPUREG_SETL(cpu, R_TOP, top);
 }
 
-static void rpavm_matchchr_do(rvmcpu_t *cpu, rvm_asmins_t *ins, rword flags)
+
+static void rpavm_swi_matchchr_nan(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
        rpastat_t *stat = (rpastat_t *)cpu->userdata1;
        rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
        rword matched = 0;
 
-       if (flags == RPA_MATCH_OPTIONAL) {
-               if (rpa_stat_matchchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched = 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_Z;
-               RVM_CPUREG_SETU(cpu, R0, matched);
-       } else if (flags == RPA_MATCH_MULTIPLE) {
-               while (rpa_stat_matchchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched += 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_N;
-               RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
-       } else if (flags == RPA_MATCH_MULTIOPT) {
-               while (rpa_stat_matchchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched += 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_Z;
-               RVM_CPUREG_SETU(cpu, R0, matched );
-       } else {
-               if (rpa_stat_matchchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched = 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_N;
-               RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
+       if (rpa_stat_matchchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched = 1;
        }
+       cpu->status = matched ? 0 : RVM_STATUS_N;
+       RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
 }
 
 
-static void rpavm_matchspchr_do(rvmcpu_t *cpu, rvm_asmins_t *ins, rword flags)
+static void rpavm_swi_matchchr_opt(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
        rpastat_t *stat = (rpastat_t *)cpu->userdata1;
        rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
        rword matched = 0;
 
-       if (flags == RPA_MATCH_OPTIONAL) {
-               if (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched = 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_Z;
-               RVM_CPUREG_SETU(cpu, R0, matched);
-       } else if (flags == RPA_MATCH_MULTIPLE) {
-               while (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched += 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_N;
-               RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
-       } else if (flags == RPA_MATCH_MULTIOPT) {
-               while (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched += 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_Z;
-               RVM_CPUREG_SETU(cpu, R0, matched );
-       } else {
-               if (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched = 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_N;
-               RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
+       if (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched = 1;
        }
-}
-
-
-static void rpavm_swi_matchchr_nan(rvmcpu_t *cpu, rvm_asmins_t *ins)
-{
-       rpavm_matchchr_do(cpu, ins, RPA_MATCH_NONE);
-}
-
-
-static void rpavm_swi_matchchr_opt(rvmcpu_t *cpu, rvm_asmins_t *ins)
-{
-       rpavm_matchchr_do(cpu, ins, RPA_MATCH_OPTIONAL);
+       cpu->status = matched ? 0 : RVM_STATUS_Z;
+       RVM_CPUREG_SETU(cpu, R0, matched);
 }
 
 
 static void rpavm_swi_matchchr_mul(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchchr_do(cpu, ins, RPA_MATCH_MULTIPLE);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
+       rword matched = 0;
+
+       while (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched += 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_N;
+       RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
 }
 
 
 static void rpavm_swi_matchchr_mop(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchchr_do(cpu, ins, RPA_MATCH_MULTIOPT);
-}
-
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
+       rword matched = 0;
 
+       while (rpa_stat_matchchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched += 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_Z;
+       RVM_CPUREG_SETU(cpu, R0, matched );
+}
 
 
 static void rpavm_swi_matchspchr_nan(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchspchr_do(cpu, ins, RPA_MATCH_NONE);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
+       rword matched = 0;
+
+       if (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched = 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_N;
+       RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
 }
 
 
 static void rpavm_swi_matchspchr_opt(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchspchr_do(cpu, ins, RPA_MATCH_OPTIONAL);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
+       rword matched = 0;
+
+       if (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched = 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_Z;
+       RVM_CPUREG_SETU(cpu, R0, matched);
+
 }
 
 
 static void rpavm_swi_matchspchr_mul(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchspchr_do(cpu, ins, RPA_MATCH_MULTIPLE);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
+       rword matched = 0;
+
+       while (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched += 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_N;
+       RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
+
 }
 
 
 static void rpavm_swi_matchspchr_mop(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchspchr_do(cpu, ins, RPA_MATCH_MULTIOPT);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rword wc = RVM_CPUREG_GETU(cpu, ins->op1);
+       rword matched = 0;
+
+       while (rpa_stat_matchspchr(stat, RVM_CPUREG_GETL(cpu, R_TOP), wc) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched += 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_Z;
+       RVM_CPUREG_SETU(cpu, R0, matched );
 }
 
 
-static void rpavm_matchrng_do(rvmcpu_t *cpu, rvm_asmins_t *ins, rword flags)
+static void rpavm_swi_matchrng_peek(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
        rpastat_t *stat = (rpastat_t *)cpu->userdata1;
        rpair_t pr = RVM_CPUREG_GETPAIR(cpu, ins->op1);
        rword matched = 0;
 
-       if (flags == RPA_MATCH_OPTIONAL) {
-               if (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched = 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_Z;
-               RVM_CPUREG_SETU(cpu, R0, matched);
-       } else if (flags == RPA_MATCH_MULTIPLE) {
-               while (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched += 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_N;
-               RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
-       } else if (flags == RPA_MATCH_MULTIOPT) {
-               while (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched += 1;
-               }
-               cpu->status = matched ? 0 : RVM_STATUS_Z;
-               RVM_CPUREG_SETU(cpu, R0, matched );
-       } else {
-               if (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
-                       rpavm_swi_shift(cpu, ins);
-                       matched = 1;
-               }
+       if (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) <= 0) {
                cpu->status = matched ? 0 : RVM_STATUS_N;
                RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
        }
@@ -205,25 +151,61 @@ static void rpavm_matchrng_do(rvmcpu_t *cpu, rvm_asmins_t *ins, rword flags)
 
 static void rpavm_swi_matchrng_nan(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchrng_do(cpu, ins, RPA_MATCH_NONE);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rpair_t pr = RVM_CPUREG_GETPAIR(cpu, ins->op1);
+       rword matched = 0;
+
+       if (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched = 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_N;
+       RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
 }
 
 
 static void rpavm_swi_matchrng_opt(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchrng_do(cpu, ins, RPA_MATCH_OPTIONAL);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rpair_t pr = RVM_CPUREG_GETPAIR(cpu, ins->op1);
+       rword matched = 0;
+
+       if (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched = 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_Z;
+       RVM_CPUREG_SETU(cpu, R0, matched);
 }
 
 
 static void rpavm_swi_matchrng_mul(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchrng_do(cpu, ins, RPA_MATCH_MULTIPLE);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rpair_t pr = RVM_CPUREG_GETPAIR(cpu, ins->op1);
+       rword matched = 0;
+
+       while (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched += 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_N;
+       RVM_CPUREG_SETU(cpu, R0, matched ? matched : (rword)-1);
 }
 
 
 static void rpavm_swi_matchrng_mop(rvmcpu_t *cpu, rvm_asmins_t *ins)
 {
-       rpavm_matchrng_do(cpu, ins, RPA_MATCH_MULTIOPT);
+       rpastat_t *stat = (rpastat_t *)cpu->userdata1;
+       rpair_t pr = RVM_CPUREG_GETPAIR(cpu, ins->op1);
+       rword matched = 0;
+
+       while (rpa_stat_matchrng(stat, RVM_CPUREG_GETL(cpu, R_TOP), pr.p1, pr.p2) > 0) {
+               rpavm_swi_shift(cpu, ins);
+               matched += 1;
+       }
+       cpu->status = matched ? 0 : RVM_STATUS_Z;
+       RVM_CPUREG_SETU(cpu, R0, matched );
 }
 
 
@@ -397,15 +379,14 @@ static void rpavm_swi_setcache(rvmcpu_t *cpu, rvm_asmins_t *ins)
        if (stat->cache->disalbled)
                return;
 
-       if (!RVM_STATUS_GETBIT(cpu, RVM_STATUS_N) && !RVM_STATUS_GETBIT(cpu, RVM_STATUS_Z) && r0 > 0) {
+       if (r0 > 0 && prevrec != endrec) {
                prec = (rparecord_t *)r_array_slot(stat->records, prevrec);
                startrec = prec->next;
                prec = (rparecord_t *)r_array_slot(stat->records, startrec);
 //             r_printf("Set the cache for: %s (%ld, %ld), top = %ld, ret = %ld, ruleid=%ld\n", prec->rule, startrec, endrec, prec->top, r0, ruleid);
-               if (prevrec != endrec)
-                       rpa_cache_set(stat->cache, top, ruleid, r0, startrec, endrec);
-               else
-                       rpa_cache_set(stat->cache, top, ruleid, r0, 0, 0);
+               rpa_cache_set(stat->cache, top, ruleid, r0, startrec, endrec);
+       } else {
+               rpa_cache_set(stat->cache, top, ruleid, r0, 0, 0);
        }
 }
 
@@ -421,20 +402,26 @@ static void rpavm_swi_checkcache(rvmcpu_t *cpu, rvm_asmins_t *ins)
        if (entry) {
 //             rparecord_t *prec = (rparecord_t *)r_array_slot(stat->records, entry->startrec);
 //             r_printf("Hit the cache for: %s (%ld, %ld), r0 = %ld\n", prec->rule, entry->startrec, entry->endrec, entry->ret);
-               rparecord_t *crec = (rparecord_t *)r_array_slot(stat->records, RVM_CPUREG_GETL(cpu, R_REC));
 
-               if (entry->startrec) {
+               r0 = entry->ret;
+               if (entry->startrec != entry->endrec) {
+                       rparecord_t *crec = (rparecord_t *)r_array_slot(stat->records, RVM_CPUREG_GETL(cpu, R_REC));
                        crec->next = entry->startrec;
                        RVM_CPUREG_SETL(cpu, R_REC, entry->endrec);
                }
-               r0 = entry->ret;
-               top += r0;
-               RVM_CPUREG_SETU(cpu, R_TOP, top);
+               if (r0 > 0) {
+                       top += r0;
+                       RVM_CPUREG_SETU(cpu, R_TOP, top);
+               }
        }
 
        RVM_STATUS_CLRALL(cpu);
        RVM_CPUREG_SETU(cpu, R0, r0);
        RVM_STATUS_UPDATE(cpu, RVM_STATUS_Z, !r0);
+       if (r0 < 0 && entry) {
+               RVM_STATUS_UPDATE(cpu, RVM_STATUS_N, (r0 < 0));
+//             r_printf("Hit the cache for: %ld, r0 = %ld\n", entry->ruleid, entry->ret);
+       }
 }
 
 
@@ -469,6 +456,7 @@ static rvm_switable_t rpavm_swi_table[] = {
                {"RPA_MATCHRNG_OPT", rpavm_swi_matchrng_opt},
                {"RPA_MATCHRNG_MUL", rpavm_swi_matchrng_mul},
                {"RPA_MATCHRNG_MOP", rpavm_swi_matchrng_mop},
+               {"RPA_MATCHRNG_PEEK", rpavm_swi_matchrng_peek},
                {"RPA_MATCHSPCHR_NAN", rpavm_swi_matchspchr_nan},
                {"RPA_MATCHSPCHR_OPT", rpavm_swi_matchspchr_opt},
                {"RPA_MATCHSPCHR_MUL", rpavm_swi_matchspchr_mul},
index 53293c0..3188beb 100644 (file)
@@ -36,22 +36,23 @@ extern "C" {
 #define RPA_MATCHRNG_OPT       RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 5))
 #define RPA_MATCHRNG_MUL       RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 6))
 #define RPA_MATCHRNG_MOP       RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 7))
-
-#define RPA_MATCHSPCHR_NAN     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 8))
-#define RPA_MATCHSPCHR_OPT     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 9))
-#define RPA_MATCHSPCHR_MUL     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 10))
-#define RPA_MATCHSPCHR_MOP     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 11))
-
-#define RPA_SHIFT                      RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 12))
-#define RPA_SETCACHE           RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 13))
-#define RPA_CHECKCACHE         RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 14))
-
-#define RPA_EMITSTART          RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 15))
-#define RPA_EMITEND                    RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 16))
-#define RPA_EMITHEAD           RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 17))
-#define RPA_EMITTAIL           RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 18))
-#define RPA_GETNEXTREC         RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 19))
-#define RPA_PRNINFO                    RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 20))
+#define RPA_MATCHRNG_PEEK      RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 8))
+
+#define RPA_MATCHSPCHR_NAN     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 9))
+#define RPA_MATCHSPCHR_OPT     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 10))
+#define RPA_MATCHSPCHR_MUL     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 11))
+#define RPA_MATCHSPCHR_MOP     RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 12))
+
+#define RPA_SHIFT                      RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 13))
+#define RPA_SETCACHE           RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 14))
+#define RPA_CHECKCACHE         RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 15))
+
+#define RPA_EMITSTART          RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 16))
+#define RPA_EMITEND                    RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 17))
+#define RPA_EMITHEAD           RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 18))
+#define RPA_EMITTAIL           RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 19))
+#define RPA_GETNEXTREC         RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 20))
+#define RPA_PRNINFO                    RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 21))
 #define RPA_MATCHCHRINSTR_NAN  RVM_OPSWI(RVM_SWI_ID(RPAVM_SWI_TABLEID, 21))
 
 
index f6825c8..c49e529 100644 (file)
@@ -1952,6 +1952,7 @@ rint rvm_cpu_exec(rvmcpu_t *cpu, rvm_asmins_t *prog, rword off)
                if (pi->da) {
                        *regda = pi->data;
                }
+#if RVM_CONDITIONAL_INSTRUCTIONS
                if (pi->cond) {
                        switch (pi->cond) {
                        case RVM_CEXEC_GRE:
@@ -1982,8 +1983,11 @@ rint rvm_cpu_exec(rvmcpu_t *cpu, rvm_asmins_t *prog, rword off)
                                goto skipexec;
                        };
                }
+#endif
                ops[pi->opcode](cpu, pi);
+#if RVM_CONDITIONAL_INSTRUCTIONS
 skipexec:
+#endif
                RVM_REG_INCIP(regpc, 1);
        } while (!cpu->abort);
        if (cpu->error)
@@ -2007,6 +2011,7 @@ rint rvm_cpu_exec_debug(rvmcpu_t *cpu, rvm_asmins_t *prog, rword off)
                if (pi->da) {
                        *regda = pi->data;
                }
+#if RVM_CONDITIONAL_INSTRUCTIONS
                if (pi->cond) {
                        switch (pi->cond) {
                        case RVM_CEXEC_GRE:
@@ -2037,10 +2042,13 @@ rint rvm_cpu_exec_debug(rvmcpu_t *cpu, rvm_asmins_t *prog, rword off)
                                goto skipexec;
                        };
                }
+#endif
                ops[pi->opcode](cpu, pi);
                r_printf("%7ld :", ++line);
                rvm_cpu_dumpregs(cpu, pi);
+#if RVM_CONDITIONAL_INSTRUCTIONS
 skipexec:
+#endif
                RVM_REG_INCIP(regpc, 1);
        } while (!cpu->abort);
        if (cpu->error)