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