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