RPA Toolkit
Refined the rpastat_t public interface. Added more API documentation.
[rpatk.git] / tests / testrpa / rpacompiler-rulealtrec.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 void code_rpa_match_num(rpa_compiler_t *co, rpastat_t *stat)
16 {
17         rpa_compiler_rule_begin_s(co, "rpa_match_num");
18
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));
24
25         rpa_compiler_rule_end(co);
26 }
27
28
29 void code_rpa_match_loopnum(rpa_compiler_t *co, rpastat_t *stat)
30 {
31         rpa_compiler_loop_begin_s(co, "rpa_match_loopnum");
32         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
33
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));
37
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);
44
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);
52
53         rpa_compiler_altexp_end(co);
54         rpa_compiler_loop_end(co);
55 }
56
57
58
59
60
61 void code_rpa_match_mathop(rpa_compiler_t *co, rpastat_t *stat)
62 {
63         rpa_compiler_rule_begin_s(co, "rpa_match_mathop");
64
65         rpa_compiler_altexp_begin(co, RPA_MATCH_NONE);
66
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);
75
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);
84
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);
93
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);
102
103         rpa_compiler_altexp_end(co);
104
105         rpa_compiler_rule_end(co);
106 }
107
108
109
110
111 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
112 {
113         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
114
115         rpa_compiler_exp_begin(co, RPA_MATCH_NONE);
116
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));
119
120         rpa_compiler_exp_end(co);
121
122
123 //      VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_NAN 'aloop'");
124 //      VMTEST_STATUS(co->cg, 0, "RPA_MNODE_NAN STATUS");
125 }
126
127
128 int main(int argc, char *argv[])
129 {
130         rvm_codelabel_t *err;
131         rpa_compiler_t *co;
132         rpastat_t *stat;
133         ruint mainoff;
134         rint i;
135         rarray_t *records = rpa_records_create();
136         char teststr[] = "123-4567ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
137
138         co = rpa_compiler_create();
139         stat = rpa_stat_create(NULL, 4096);
140         rvm_cpu_addswitable(stat->cpu, "common_table", common_calltable);
141
142         rpa_stat_init(stat, RPA_ENCODING_UTF8, teststr, teststr, teststr+30, records);
143
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));
149
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);
156
157         if (rvm_codegen_relocate(co->cg, &err) < 0) {
158                 r_printf("Unresolved symbol: %s\n", err->name->str);
159                 goto end;
160         }
161
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);
166         }
167
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);
169
170 end:
171         rpa_stat_destroy(stat);
172         rpa_compiler_destroy(co);
173         rpa_records_destroy(records);
174
175
176 //      r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
177 //      r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());
178         return 0;
179 }