RPA Toolkit
55e115a97f226af470f4f739df1e6be0aba245fb
[rpatk.git] / tests / testrpa / rpacompiler-rulerec.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <sys/types.h>
6 #include <fcntl.h>
7 #include <unistd.h>
8 #include <sys/mman.h>
9 #include "rmem.h"
10 #include "rpacompiler.h"
11 #include "rpastatpriv.h"
12 #include "common.h"
13
14
15
16 void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
17 {
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);
26 }
27
28
29 void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
30 {
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);
39 }
40
41
42 void code_rpa_match_abcorxyz(rpa_compiler_t *co, rpastat_t *stat)
43 {
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);
50
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);
55
56         rpa_compiler_altexp_end(co);
57         rpa_compiler_rule_end(co);
58 }
59
60
61 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
62 {
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");
67 }
68
69
70 int main(int argc, char *argv[])
71 {
72         rvm_codelabel_t *err;
73         rpa_compiler_t *co;
74         rpastat_t *stat;
75         ruint mainoff;
76         rint i;
77         rarray_t *records = rpa_records_create();
78         char teststr[] = "abcabcxyzabc";
79
80         co = rpa_compiler_create();
81         stat = rpa_stat_create(NULL, 4096);
82         rvm_cpu_addswitable(stat->cpu, "common_table", common_calltable);
83
84         rpa_stat_init(stat, teststr, teststr, teststr+12, records);
85
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));
91
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);
98
99         if (rvm_codegen_relocate(co->cg, &err) < 0) {
100                 r_printf("Unresolved symbol: %s\n", err->name->str);
101                 goto end;
102         }
103
104         rvm_cpu_exec(stat->cpu, rvm_codegen_getcode(co->cg, 0), mainoff);
105
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)
110                         r_printf("START ");
111                 if (rec->type & RPA_RECORD_MATCH)
112                         r_printf("MATCH ");
113                 if (rec->type & RPA_RECORD_END)
114                         r_printf("END ");
115                 r_printf("%s(%d) %d, %d\n", rec->rule, rec->type, rec->top, rec->size);
116         }
117
118 end:
119         rpa_stat_destroy(stat);
120         rpa_compiler_destroy(co);
121         rpa_records_destroy(records);
122
123         r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
124         r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());
125         return 0;
126 }