RPA Toolkit
Moving away from RPA_BXL... 3
[rpatk.git] / testrpa2 / rpacompiler-ruleloopcls.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 "rpastat.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);
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, RPA_MATCH_MULTIPLE);
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_var(rpa_compiler_t *co, rpastat_t *stat)
30 {
31         rpa_compiler_rule_begin_s(co, "rpa_match_var");
32
33         rpa_compiler_class_begin(co);
34         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
35         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
36         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'Z'));
37         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
38         rpa_compiler_class_end(co, RPA_MATCH_NONE);
39
40         rpa_compiler_class_begin(co);
41         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'a', 'z'));
42         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
43         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, 'A', 'Z'));
44         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
45         rvm_codegen_addins(co->cg, rvm_asm2(RPA_MATCHRNG_NAN, DA, XX, XX, '0', '9'));
46         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
47         rpa_compiler_class_end(co, RPA_MATCH_MULTIPLE);
48         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
49
50         rpa_compiler_rule_end(co);
51 }
52
53
54 void code_rpa_match_term(rpa_compiler_t *co, rpastat_t *stat)
55 {
56         rpa_compiler_rule_begin_s(co, "rpa_match_term");
57         rpa_compiler_altexp_begin(co);
58
59         rpa_compiler_branch_begin(co);
60         rpa_compiler_reference_nan_s(co, "rpa_match_num");
61         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
62         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
63
64         rpa_compiler_branch_begin(co);
65         rpa_compiler_reference_nan_s(co, "rpa_match_var");
66         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
67         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
68
69         rpa_compiler_branch_begin(co);
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
73         rpa_compiler_reference_nan_s(co, "rpa_match_xorexp");
74         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
75
76         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, ')'));
77         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
78
79         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
80
81
82         rpa_compiler_altexp_end(co, RPA_MATCH_NONE);
83
84         rpa_compiler_rule_end(co);
85 }
86
87
88 void code_rpa_match_mulop(rpa_compiler_t *co, rpastat_t *stat)
89 {
90         rpa_compiler_rule_begin_s(co, "rpa_match_mulop");
91
92         rpa_compiler_reference_nan_s(co, "rpa_match_mulexp");
93         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
94
95         rpa_compiler_class_begin(co);
96         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '*'));
97         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
98         rpa_compiler_class_end(co, RPA_MATCH_NONE);
99         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
100
101         rpa_compiler_reference_nan_s(co, "rpa_match_term");
102         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
103
104         rpa_compiler_rule_end(co);
105 }
106
107
108 void code_rpa_match_divop(rpa_compiler_t *co, rpastat_t *stat)
109 {
110         rpa_compiler_rule_begin_s(co, "rpa_match_divop");
111
112         rpa_compiler_reference_nan_s(co, "rpa_match_mulexp");
113         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
114
115         rpa_compiler_class_begin(co);
116         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '/'));
117         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BGRE, DA, XX, XX, 0));
118         rpa_compiler_class_end(co, RPA_MATCH_NONE);
119         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
120
121         rpa_compiler_reference_nan_s(co, "rpa_match_term");
122         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
123
124         rpa_compiler_rule_end(co);
125 }
126
127
128
129 void code_rpa_match_mulexp(rpa_compiler_t *co, rpastat_t *stat)
130 {
131         rpa_compiler_loop_begin_s(co, "rpa_match_mulexp");
132         rpa_compiler_altexp_begin(co);
133
134         rpa_compiler_branch_begin(co);
135         rpa_compiler_reference_nan_s(co, "rpa_match_mulop");
136         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
137         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
138
139         rpa_compiler_branch_begin(co);
140         rpa_compiler_reference_nan_s(co, "rpa_match_divop");
141         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
142         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
143
144
145         rpa_compiler_nonloopybranch_begin(co);
146         rpa_compiler_reference_nan_s(co, "rpa_match_term");
147         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
148         rpa_compiler_nonloopybranch_end(co, RPA_MATCH_NONE);
149
150         rpa_compiler_altexp_end(co, RPA_MATCH_NONE);
151         rpa_compiler_loop_end(co);
152 }
153
154
155 void code_rpa_match_addexp(rpa_compiler_t *co, rpastat_t *stat)
156 {
157         rpa_compiler_loop_begin_s(co, "rpa_match_addexp");
158         rpa_compiler_altexp_begin(co);
159
160         rpa_compiler_branch_begin(co);
161         rpa_compiler_reference_nan_s(co, "rpa_match_addexp");
162         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
163
164         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '-'));
165         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
166
167         rpa_compiler_reference_nan_s(co, "rpa_match_mulexp");
168         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
169         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
170
171
172         rpa_compiler_branch_begin(co);
173         rpa_compiler_reference_nan_s(co, "rpa_match_addexp");
174         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
175
176         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '+'));
177         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
178
179         rpa_compiler_reference_nan_s(co, "rpa_match_mulexp");
180         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
181         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
182
183
184         rpa_compiler_nonloopybranch_begin(co);
185         rpa_compiler_reference_nan_s(co, "rpa_match_mulexp");
186         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
187         rpa_compiler_nonloopybranch_end(co, RPA_MATCH_NONE);
188
189         rpa_compiler_altexp_end(co, RPA_MATCH_NONE);
190         rpa_compiler_loop_end(co);
191 }
192
193
194 void code_rpa_match_orexp(rpa_compiler_t *co, rpastat_t *stat)
195 {
196         rpa_compiler_loop_begin_s(co, "rpa_match_orexp");
197         rpa_compiler_altexp_begin(co);
198
199         rpa_compiler_branch_begin(co);
200         rpa_compiler_reference_nan_s(co, "rpa_match_orexp");
201         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
202
203         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '|'));
204         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
205
206         rpa_compiler_reference_nan_s(co, "rpa_match_addexp");
207         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
208         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
209
210         rpa_compiler_nonloopybranch_begin(co);
211         rpa_compiler_reference_nan_s(co, "rpa_match_addexp");
212         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
213         rpa_compiler_nonloopybranch_end(co, RPA_MATCH_NONE);
214
215         rpa_compiler_altexp_end(co, RPA_MATCH_NONE);
216         rpa_compiler_loop_end(co);
217 }
218
219
220 void code_rpa_match_andexp(rpa_compiler_t *co, rpastat_t *stat)
221 {
222         rpa_compiler_loop_begin_s(co, "rpa_match_andexp");
223         rpa_compiler_altexp_begin(co);
224
225         rpa_compiler_branch_begin(co);
226         rpa_compiler_reference_nan_s(co, "rpa_match_andexp");
227         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
228
229         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '&'));
230         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
231
232         rpa_compiler_reference_nan_s(co, "rpa_match_orexp");
233         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
234         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
235
236         rpa_compiler_nonloopybranch_begin(co);
237         rpa_compiler_reference_nan_s(co, "rpa_match_orexp");
238         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
239         rpa_compiler_nonloopybranch_end(co, RPA_MATCH_NONE);
240
241         rpa_compiler_altexp_end(co, RPA_MATCH_NONE);
242         rpa_compiler_loop_end(co);
243 }
244
245
246 void code_rpa_match_xorexp(rpa_compiler_t *co, rpastat_t *stat)
247 {
248         rpa_compiler_loop_begin_s(co, "rpa_match_xorexp");
249         rpa_compiler_altexp_begin(co);
250
251         rpa_compiler_branch_begin(co);
252         rpa_compiler_reference_nan_s(co, "rpa_match_xorexp");
253         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
254
255         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, '^'));
256         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
257
258         rpa_compiler_reference_nan_s(co, "rpa_match_andexp");
259         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
260         rpa_compiler_branch_end(co, RPA_MATCH_NONE);
261
262         rpa_compiler_nonloopybranch_begin(co);
263         rpa_compiler_reference_nan_s(co, "rpa_match_andexp");
264         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
265         rpa_compiler_nonloopybranch_end(co, RPA_MATCH_NONE);
266
267         rpa_compiler_altexp_end(co, RPA_MATCH_NONE);
268         rpa_compiler_loop_end(co);
269 }
270
271
272 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
273 {
274         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
275
276         rpa_compiler_exp_begin(co);
277
278         rpa_compiler_reference_nan_s(co, "rpa_match_xorexp");
279         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
280
281         rpa_compiler_exp_end(co, RPA_MATCH_NONE);
282
283
284 //      VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_NAN 'aloop'");
285 //      VMTEST_STATUS(co->cg, 0, "RPA_MNODE_NAN STATUS");
286 }
287
288
289 int main(int argc, char *argv[])
290 {
291         rvm_codelabel_t *err;
292         rpa_compiler_t *co;
293         rpastat_t *stat;
294         ruint mainoff;
295         rint i;
296         char teststr[] = "1*v23*z457/(((((((((((((89^233)))))))))*2)/33)+23)*457)/89+233*2/33*23*457/89+233*2/33*23*457/89+233*2/33*23*457/89+233*2/33*23*457/89+233*2/33|5&77^37 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
297 //      char teststr[] = "1/23+45##ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
298
299         co = rpa_compiler_create();
300         stat = rpa_stat_create(NULL, 4096);
301         rvm_cpu_addswitable(stat->cpu, "common_table", common_calltable);
302
303         mainoff = rvm_codegen_addins(co->cg, rvm_asml(RVM_NOP, XX, XX, XX, -1));
304
305         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R_TOP, DA, XX, -1));
306         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, FP, DA, XX, 0));
307         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, SP, DA, XX, 0));
308
309         rvm_codegen_addins(co->cg, rvm_asm(RPA_SHIFT, XX, XX, XX, 0));
310         code_rpa_matchmnode(co, stat);
311         rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xabc));
312         rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
313         code_rpa_match_xorexp(co, stat);
314         code_rpa_match_andexp(co, stat);
315         code_rpa_match_orexp(co, stat);
316         code_rpa_match_addexp(co, stat);
317         code_rpa_match_mulexp(co, stat);
318         code_rpa_match_divop(co, stat);
319         code_rpa_match_mulop(co, stat);
320         code_rpa_match_num(co, stat);
321         code_rpa_match_var(co, stat);
322         code_rpa_match_term(co, stat);
323
324         if (rvm_codegen_relocate(co->cg, &err) < 0) {
325                 r_printf("Unresolved symbol: %s\n", err->name->str);
326                 goto end;
327         }
328
329         for (i = 0; i < 1000; i++) {
330                 rpa_stat_init(stat, teststr, teststr, teststr+170);
331                 rpa_stat_cachedisable(stat, 0);
332
333                 rvm_cpu_exec(stat->cpu, rvm_codegen_getcode(co->cg, 0), mainoff);
334         }
335         for (i = 0; i < r_array_length(stat->records); i++) {
336                 rpa_record_dump(stat->records, i);
337         }
338
339         r_printf("(%s) Matched size: %s\n", argv[0], RVM_CPUREG_GETU(stat->cpu, R0) == 151 ? "PASSED" : "FAILED");
340         r_printf("(%s) Records size: %s(cache hits: %d)\n", argv[0], r_array_length(stat->records) == 500 ? "PASSED" : "FAILED", stat->cache->hit);
341
342 end:
343         rpa_stat_destroy(stat);
344         rpa_compiler_destroy(co);
345
346
347         r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
348         r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());
349         return 0;
350 }