RPA Toolkit
4915d1786d4b2c28bd591899a9f70002124d544e
[rpatk.git] / testrpa2 / rpacompiler-exp.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
16 void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
17 {
18         rpa_compiler_rule_begin_s(co, "rpa_matchabc");
19         rpa_compiler_exp_begin(co);
20         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'a'));
21         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
22         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'b'));
23         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
24         rpa_compiler_exp_end(co, RPA_MATCH_NONE);
25         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'c'));
26         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
27         rpa_compiler_rule_end(co);
28 }
29
30
31 void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
32 {
33         rpa_compiler_rule_begin_s(co, "rpa_matchxyz");
34         rpa_compiler_exp_begin(co);
35         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'x'));
36         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
37         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'y'));
38         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
39         rpa_compiler_exp_end(co, RPA_MATCH_NONE);
40         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'z'));
41         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, RPA_COMPILER_CURRENTEXP(co)->endidx, rvm_asm(RVM_BLES, DA, XX, XX, 0));
42         rpa_compiler_rule_end(co);
43 }
44
45 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
46 {
47         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
48         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchabc", rvm_asm(RPA_BXLWHT, R_MNODE_NAN, DA, XX, 0));
49         VMTEST_REG(co->cg, 0, 3, "RPA_MNODE_NAN 'abc'");
50         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_NAN STATUS");
51
52         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
53         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchxyz", rvm_asm(RPA_BXLWHT, R_MNODE_NAN, DA, XX, 0));
54         VMTEST_REG(co->cg, 0, -1, "RPA_MNODE_NAN 'xyz'");
55         VMTEST_STATUS(co->cg, RVM_STATUS_N, "RPA_MNODE_NAN STATUS");
56
57         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
58         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchabc", rvm_asm(RPA_BXLWHT, R_MNODE_OPT, DA, XX, 0));
59         VMTEST_REG(co->cg, 0, 3, "RPA_MNODE_OPT 'abc'");
60         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_OPT STATUS");
61
62         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
63         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchxyz", rvm_asm(RPA_BXLWHT, R_MNODE_OPT, DA, XX, 0));
64         VMTEST_REG(co->cg, 0, 0, "RPA_MNODE_OPT 'xyz'");
65         VMTEST_STATUS(co->cg, RVM_STATUS_Z, "RPA_MNODE_OPT STATUS");
66
67         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
68         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchabc", rvm_asm(RPA_BXLWHT, R_MNODE_MUL, DA, XX, 0));
69         VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_MUL 'abc'");
70         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_MUL STATUS");
71
72         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
73         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchxyz", rvm_asm(RPA_BXLWHT, R_MNODE_MUL, DA, XX, 0));
74         VMTEST_REG(co->cg, 0, -1, "RPA_MNODE_MUL 'xyz'");
75         VMTEST_STATUS(co->cg, RVM_STATUS_N, "RPA_MNODE_MUL STATUS");
76
77         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
78         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchabc", rvm_asm(RPA_BXLWHT, R_MNODE_MOP, DA, XX, 0));
79         VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_MOP 'abc'");
80         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_MOP STATUS");
81
82         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
83         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchxyz", rvm_asm(RPA_BXLWHT, R_MNODE_MOP, DA, XX, 0));
84         VMTEST_REG(co->cg, 0, 0, "RPA_MNODE_MOP 'xyz'");
85         VMTEST_STATUS(co->cg, RVM_STATUS_Z, "RPA_MNODE_MOP STATUS");
86
87
88 }
89
90
91 int main(int argc, char *argv[])
92 {
93         rvm_codelabel_t *err;
94         rpa_compiler_t *co;
95         rpastat_t *stat;
96         ruint mainoff;
97         char teststr[] = "abcabcabcabc";
98
99         co = rpa_compiler_create();
100         stat = rpa_stat_create(4096);
101         rvm_cpu_addswitable(stat->cpu, common_calltable);
102
103         rpa_stat_init(stat, teststr, teststr, teststr+12);
104
105         mainoff = rvm_codegen_addins(co->cg, rvm_asml(RVM_NOP, XX, XX, XX, -1));
106         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R_TOP, DA, XX, -1));
107         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, FP, DA, XX, 0));
108         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, SP, DA, XX, 0));
109
110         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_nan", rvm_asm(RVM_MOV, R_MNODE_NAN, DA, XX, 0));
111         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_mul", rvm_asm(RVM_MOV, R_MNODE_MUL, DA, XX, 0));
112         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_opt", rvm_asm(RVM_MOV, R_MNODE_OPT, DA, XX, 0));
113         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_mop", rvm_asm(RVM_MOV, R_MNODE_MOP, DA, XX, 0));
114
115         rvm_codegen_addins(co->cg, rvm_asm(RPA_SHIFT, XX, XX, XX, 0));
116         code_rpa_matchmnode(co, stat);
117         rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xabc));
118         rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
119         code_rpa_matchabc(co, stat);
120         code_rpa_matchxyz(co, stat);
121
122         if (rvm_codegen_relocate(co->cg, &err) < 0) {
123                 r_printf("Unresolved symbol: %s\n", err->name->str);
124                 goto end;
125         }
126
127         rvm_cpu_exec_debug(stat->cpu, rvm_codegen_getcode(co->cg, 0), mainoff);
128
129 end:
130         rpa_stat_destroy(stat);
131         rpa_compiler_destroy(co);
132
133
134         r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
135         r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());
136         return 0;
137 }