RPA Toolkit
fe75381dbd3da01835f74f64b41df021fde01916
[rpatk.git] / testrpa2 / rpavm-mnode.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         rulong ruleidx;
19         const rchar *rule = "rpa_matchabc";
20         const rchar *ruleend = "rpa_matchabc_end";
21
22         ruleidx = rvm_codegen_addstring_s(co->cg, NULL, rule);
23         rvm_codegen_addlabel_s(co->cg, rule);
24
25         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITSTART, DA, R_TOP, XX, 0));
26         rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSHM, DA, XX, XX, BIT(R_TOP)|BIT(R_WHT)|BIT(LR)));
27
28         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'a'));
29         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_BRANCH, ruleend, rvm_asm(RVM_BLES, DA, XX, XX, 0));
30         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'b'));
31         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_BRANCH, ruleend, rvm_asm(RVM_BLES, DA, XX, XX, 0));
32         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'c'));
33         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_BRANCH, ruleend, rvm_asm(RVM_BLES, DA, XX, XX, 0));
34
35         rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R1)|BIT(R_WHT)|BIT(LR)));
36         rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
37         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITEND, DA, R1, R0, 0));
38         rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
39         rvm_codegen_addlabel_s(co->cg, ruleend);
40         rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R_TOP)|BIT(R_WHT)|BIT(LR)));
41         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, -1));
42         rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
43 }
44
45
46 void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
47 {
48         rulong ruleidx;
49         const rchar *rule = "rpa_matchxyz";
50         const rchar *ruleend = "rpa_matchxyz_end";
51
52         ruleidx = rvm_codegen_addstring_s(co->cg, NULL, rule);
53         rvm_codegen_addlabel_s(co->cg, rule);
54
55         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITSTART, DA, R_TOP, XX, 0));
56         rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSHM, DA, XX, XX, BIT(R_TOP)|BIT(R_WHT)|BIT(LR)));
57
58         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'x'));
59         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_BRANCH, ruleend, rvm_asm(RVM_BLES, DA, XX, XX, 0));
60         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'y'));
61         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_BRANCH, ruleend, rvm_asm(RVM_BLES, DA, XX, XX, 0));
62         rvm_codegen_addins(co->cg, rvm_asm(RPA_MATCHCHR_NAN, DA, XX, XX, 'z'));
63         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_BRANCH, ruleend, rvm_asm(RVM_BLES, DA, XX, XX, 0));
64
65         rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R1)|BIT(R_WHT)|BIT(LR)));
66         rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
67         rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITEND, DA, R1, R0, 0));
68         rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
69         rvm_codegen_addlabel_s(co->cg, ruleend);
70         rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R_TOP)|BIT(R_WHT)|BIT(LR)));
71         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, -1));
72         rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
73 }
74
75 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
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_BXLNAN, DA, XX, XX, 0));
79         VMTEST_REG(co->cg, 0, 3, "RPA_MNODE_NAN 'abc'");
80         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_NAN 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_BXLNAN, DA, XX, XX, 0));
84         VMTEST_REG(co->cg, 0, -1, "RPA_MNODE_NAN 'xyz'");
85         VMTEST_STATUS(co->cg, RVM_STATUS_N, "RPA_MNODE_NAN STATUS");
86
87
88         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
89         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchabc", rvm_asm(RPA_BXLOPT, DA, XX, XX, 0));
90         VMTEST_REG(co->cg, 0, 3, "RPA_MNODE_OPT 'abc'");
91         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_OPT STATUS");
92
93         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
94         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchxyz", rvm_asm(RPA_BXLOPT, DA, XX, XX, 0));
95         VMTEST_REG(co->cg, 0, 0, "RPA_MNODE_OPT 'xyz'");
96         VMTEST_STATUS(co->cg, RVM_STATUS_Z, "RPA_MNODE_OPT STATUS");
97
98         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
99         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchabc", rvm_asm(RPA_BXLMUL, DA, XX, XX, 0));
100         VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_MUL 'abc'");
101         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_MUL STATUS");
102
103         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
104         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchxyz", rvm_asm(RPA_BXLMUL, DA, XX, XX, 0));
105         VMTEST_REG(co->cg, 0, -1, "RPA_MNODE_MUL 'xyz'");
106         VMTEST_STATUS(co->cg, RVM_STATUS_N, "RPA_MNODE_MUL STATUS");
107
108         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
109         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchabc", rvm_asm(RPA_BXLMOP, DA, XX, XX, 0));
110         VMTEST_REG(co->cg, 0, 12, "RPA_MNODE_MOP 'abc'");
111         VMTEST_STATUS(co->cg, 0, "RPA_MNODE_MOP STATUS");
112
113         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, DA, XX, 0));
114         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpa_matchxyz", rvm_asm(RPA_BXLMOP, DA, XX, XX, 0));
115         VMTEST_REG(co->cg, 0, 0, "RPA_MNODE_MOP 'xyz'");
116         VMTEST_STATUS(co->cg, RVM_STATUS_Z, "RPA_MNODE_MOP STATUS");
117 }
118
119
120 int main(int argc, char *argv[])
121 {
122         rvm_codelabel_t *err;
123         rpa_compiler_t *co;
124         rpastat_t *stat;
125         ruint mainoff;
126         char teststr[] = "abcabcabcabc";
127
128         co = rpa_compiler_create();
129         stat = rpa_stat_create(NULL, 4096);
130         rvm_cpu_addswitable(stat->cpu, "common_table", common_calltable);
131
132         rpa_stat_init(stat, teststr, teststr, teststr+12);
133
134         mainoff = rvm_codegen_addins(co->cg, rvm_asml(RVM_NOP, XX, XX, XX, -1));
135         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R_TOP, DA, XX, -1));
136         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, FP, DA, XX, 0));
137         rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, SP, DA, XX, 0));
138
139         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_nan", rvm_asm(RPA_SETBXLNAN, DA, XX, XX, 0));
140         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_mul", rvm_asm(RPA_SETBXLMUL, DA, XX, XX, 0));
141         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_opt", rvm_asm(RPA_SETBXLOPT, DA, XX, XX, 0));
142         rvm_codegen_addrelocins_s(co->cg, RVM_RELOC_JUMP, "rpacompiler_mnode_mop", rvm_asm(RPA_SETBXLMOP, DA, XX, XX, 0));
143
144         rvm_codegen_addins(co->cg, rvm_asm(RPA_SHIFT, XX, XX, XX, 0));
145         code_rpa_matchmnode(co, stat);
146         rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xabc));
147         rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
148         code_rpa_matchabc(co, stat);
149         code_rpa_matchxyz(co, stat);
150
151         if (rvm_codegen_relocate(co->cg, &err) < 0) {
152                 r_printf("Unresolved symbol: %s\n", err->name->str);
153                 goto end;
154         }
155
156         rvm_cpu_exec(stat->cpu, rvm_codegen_getcode(co->cg, 0), mainoff);
157
158 end:
159         rpa_stat_destroy(stat);
160         rpa_compiler_destroy(co);
161
162
163         r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
164         r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());
165         return 0;
166 }