10 #include "rpacompiler.h"
16 void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
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);
31 void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
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);
45 void code_rpa_matchmnode(rpa_compiler_t *co, rpastat_t *stat)
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");
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");
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");
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");
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");
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");
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");
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");
91 int main(int argc, char *argv[])
97 char teststr[] = "abcabcabcabc";
99 co = rpa_compiler_create();
100 stat = rpa_stat_create(4096);
101 rvm_cpu_addswitable(stat->cpu, common_calltable);
103 rpa_stat_init(stat, teststr, teststr, teststr+12);
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));
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));
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);
122 if (rvm_codegen_relocate(co->cg, &err) < 0) {
123 r_printf("Unresolved symbol: %s\n", err->name->str);
127 rvm_cpu_exec_debug(stat->cpu, rvm_codegen_getcode(co->cg, 0), mainoff);
130 rpa_stat_destroy(stat);
131 rpa_compiler_destroy(co);
134 r_printf("Max alloc mem: %ld\n", r_debug_get_maxmem());
135 r_printf("Leaked mem: %ld\n", r_debug_get_allocmem());