10 #include "rpacompiler.h"
11 #include "rpastatpriv.h"
15 void code_rpa_match_num(rpa_compiler_t *co, rpastat_t *stat)
17 rpa_compiler_rule_begin_s(co, "rpa_match_num");
19 rpa_compiler_class_begin(co, RPA_MATCH_MULTIPLE);
20 rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
21 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
22 rpa_compiler_class_end(co);
23 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
25 rpa_compiler_rule_end(co);
29 void code_rpa_match_loopnum(rpa_compiler_t *co, rpastat_t *stat)
31 rpa_compiler_loop_begin_s(co, "rpa_match_loopnum");
32 rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
34 rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
35 rpa_compiler_reference_nan_s(co, "rpa_match_loopnum");
36 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
38 rpa_compiler_class_begin(co, RPA_MATCH_NONE);
39 rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
40 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
41 rpa_compiler_class_end(co);
42 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
43 rpa_compiler_branch_end(co);
45 rpa_compiler_nonloopybranch_begin(co, RPA_MATCH_NONE);
46 rpa_compiler_class_begin(co, RPA_MATCH_NONE);
47 rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
48 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
49 rpa_compiler_class_end(co);
50 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
51 rpa_compiler_nonloopybranch_end(co);
53 rpa_compiler_altexp_end(co);
54 rpa_compiler_loop_end(co);
61 void code_rpa_match_mathop(rpa_compiler_t *co, rpastat_t *stat)
63 rpa_compiler_rule_begin_s(co, "rpa_match_mathop");
65 rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
67 rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
68 rpa_compiler_reference_nan_s(co, "rpa_match_num");
69 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
70 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '*'));
71 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
72 rpa_compiler_reference_nan_s(co, "rpa_match_num");
73 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
74 rpa_compiler_branch_end(co);
76 rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
77 rpa_compiler_reference_nan_s(co, "rpa_match_num");
78 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
79 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '/'));
80 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
81 rpa_compiler_reference_nan_s(co, "rpa_match_num");
82 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
83 rpa_compiler_branch_end(co);
85 rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
86 rpa_compiler_reference_nan_s(co, "rpa_match_num");
87 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
88 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '+'));
89 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
90 rpa_compiler_reference_nan_s(co, "rpa_match_num");
91 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
92 rpa_compiler_branch_end(co);
94 rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
95 rpa_compiler_reference_nan_s(co, "rpa_match_num");
96 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
97 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
98 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
99 rpa_compiler_reference_nan_s(co, "rpa_match_num");
100 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
101 rpa_compiler_branch_end(co);
103 rpa_compiler_altexp_end(co);
105 rpa_compiler_rule_end(co);
111 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
113 rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
115 rpa_compiler_exp_begin(co, RPA_MATCH_NONE);
117 rpa_compiler_reference_nan_s(co, "rpa_match_mathop");
118 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
120 rpa_compiler_exp_end(co);
123 // VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_NAN 'aloop'");
124 // VMTEST_STATUS(co->cg, 0, "RPA_MNODE_NAN STATUS");
128 int main(int argc, char *argv[])
130 rvm_codelabel_t *err;
135 rarray_t *records = rpa_records_create();
136 char teststr[] = "123-4567ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
138 co = rpa_compiler_create();
139 stat = rpa_stat_create(NULL, 4096);
140 rvm_cpu_addswitable(stat->cpu, "common_table", common_calltable);
142 rpa_stat_init(stat, RPA_ENCODING_UTF8, teststr, teststr, teststr+30, records);
144 mainoff = rvm_codegen_addins(co->cg, rvm_asml(RVM_NOP, XX, XX, XX, -1));
145 rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R_TOP, DA, XX, -1));
146 rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, FP, DA, XX, 0));
147 rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, SP, DA, XX, 0));
148 rvm_codegen_addins(co->cg, rvm_asm(RPA_SHIFT, XX, XX, XX, 0));
150 code_rpa_matchmnode(co, stat);
151 rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xabc));
152 rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
153 code_rpa_match_num(co, stat);
154 code_rpa_match_loopnum(co, stat);
155 code_rpa_match_mathop(co, stat);
157 if (rvm_codegen_relocate(co->cg, &err) < 0) {
158 r_printf("Unresolved symbol: %s\n", err->name->str);
162 rpa_stat_cachedisable(stat, 0);
163 rvm_cpu_exec(stat->cpu, rvm_codegen_getcode(co->cg, 0), mainoff);
164 for (i = 0; i < r_array_length(records); i++) {
165 rpa_record_dump(records, i);
168 r_printf("(%s) Matched size: %s(cache hits: %d)\n", argv[0], RVM_CPUREG_GETU(stat->cpu, R0) == 8 ? "PASSED" : "FAILED", stat->cache->hit);
171 rpa_stat_destroy(stat);
172 rpa_compiler_destroy(co);
173 rpa_records_destroy(records);
176 // r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
177 // r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());