10 #include "rpacompiler.h"
11 #include "rpastatpriv.h"
16 void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
18 rpa_compiler_rule_begin_s(co, "rpa_matchabc");
19 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'a'));
20 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
21 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'b'));
22 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
23 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'c'));
24 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_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
31 rpa_compiler_rule_begin_s(co, "rpa_matchxyz");
32 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'x'));
33 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
34 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'y'));
35 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
36 rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'z'));
37 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_rule_end(co);
42 void code_rpa_match_abcorxyz(rpa_compiler_t *co, rpastat_t *stat)
44 rpa_compiler_rule_begin_s(co, "rpa_match_abcorxyz");
45 rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
46 rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
47 rpa_compiler_reference_nan_s(co, "rpa_matchxyz");
48 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
49 rpa_compiler_branch_end(co);
51 rpa_compiler_branch_begin(co, RPA_MATCH_NONE);
52 rpa_compiler_reference_nan_s(co, "rpa_matchabc");
53 rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
54 rpa_compiler_branch_end(co);
56 rpa_compiler_altexp_end(co);
57 rpa_compiler_rule_end(co);
61 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
63 rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
64 rpa_compiler_reference_mul_s(co, "rpa_match_abcorxyz");
65 VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_MUL 'abcorxyz'");
66 VMTEST_STATUS(co->cg, 0, "RPA_MNODE_MUL STATUS");
70 int main(int argc, char *argv[])
77 rarray_t *records = rpa_records_create();
78 char teststr[] = "abcabcxyzabc";
80 co = rpa_compiler_create();
81 stat = rpa_stat_create(NULL, 4096);
82 rvm_cpu_addswitable(stat->cpu, "common_table", common_calltable);
84 rpa_stat_init(stat, teststr, teststr, teststr+12, records);
86 mainoff = rvm_codegen_addins(co->cg, rvm_asml(RVM_NOP, XX, XX, XX, -1));
87 rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R_TOP, DA, XX, -1));
88 rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, FP, DA, XX, 0));
89 rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, SP, DA, XX, 0));
90 rvm_codegen_addins(co->cg, rvm_asm(RPA_SHIFT, XX, XX, XX, 0));
92 code_rpa_matchmnode(co, stat);
93 rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xabc));
94 rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
95 code_rpa_matchabc(co, stat);
96 code_rpa_matchxyz(co, stat);
97 code_rpa_match_abcorxyz(co, stat);
99 if (rvm_codegen_relocate(co->cg, &err) < 0) {
100 r_printf("Unresolved symbol: %s\n", err->name->str);
104 rvm_cpu_exec(stat->cpu, rvm_codegen_getcode(co->cg, 0), mainoff);
106 for (i = 0; i < r_array_length(records); i++) {
107 rparecord_t *rec = (rparecord_t *)r_array_slot(records, i);
108 r_printf("%3d : ", i);
109 if (rec->type & RPA_RECORD_START)
111 if (rec->type & RPA_RECORD_MATCH)
113 if (rec->type & RPA_RECORD_END)
115 r_printf("%s(%d) %d, %d\n", rec->rule, rec->type, rec->top, rec->size);
119 rpa_stat_destroy(stat);
120 rpa_compiler_destroy(co);
121 rpa_records_destroy(records);
123 r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
124 r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());