RPA Toolkit
work on RVM based parser - RPA2
[rpatk.git] / rpa2 / rpacompiler.c
1 #include "rmem.h"
2 #include "rpacompiler.h"
3
4
5 void rpacompiler_mnode_nan(rpa_compiler_t *co)
6 {
7         rvm_codegen_addlabel_s(co->cg, "rpacompiler_mnode_nan");
8         rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, R_WHT, XX, XX, 0));
9 }
10
11
12 void rpacompiler_mnode_opt(rpa_compiler_t *co)
13 {
14         rvm_codegen_addlabel_s(co->cg, "rpacompiler_mnode_opt");
15         rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, LR, XX, XX, 0));
16         rvm_codegen_addins(co->cg, rvm_asm(RVM_BXL, R_WHT, XX, XX, 0));
17         rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
18         rvm_codegen_addins(co->cg, rvm_asml(RVM_CMP, R0, DA, XX, 0));
19         rvm_codegen_addins(co->cg, rvm_asm(RVM_BXGRE, LR, XX, XX, 0));
20         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, 0));
21         rvm_codegen_addins(co->cg, rvm_asm(RVM_CMP, R0, R0, XX, 0));
22         rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
23 }
24
25
26 void rpacompiler_mnode_mul(rpa_compiler_t *co)
27 {
28         rvm_codegen_addlabel_s(co->cg, "rpacompiler_mnode_mul");
29         rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, LR, XX, XX, 0));
30         rvm_codegen_addins(co->cg, rvm_asm(RVM_BXL, R_WHT, XX, XX, 0));
31         rvm_codegen_addins(co->cg, rvm_asml(RVM_CMP, R0, DA, XX, 0));
32         rvm_codegen_addins(co->cg, rvm_asm(RVM_BGRE, DA, XX, XX, 2));
33         rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, PC, XX, XX, 0));
34         rvm_codegen_addins(co->cg, rvm_asm(RVM_CLR, R1, XX, XX, 0));
35         rvm_codegen_addins(co->cg, rvm_asm(RVM_ADD, R0, R0, R1, 0));
36         rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R0, XX, XX, 0));
37         rvm_codegen_addins(co->cg, rvm_asm(RVM_BXL, R_WHT, XX, XX, 0));
38         rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
39         rvm_codegen_addins(co->cg, rvm_asml(RVM_CMP, R0, DA, XX, 0));
40         rvm_codegen_addins(co->cg, rvm_asm(RVM_BGRE, DA, XX, XX, -5));
41         rvm_codegen_addins(co->cg, rvm_asm(RVM_ADDS, R0, R1, DA, 0));
42         rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, PC, XX, XX, 0));
43 }
44
45
46 void rpacompiler_mnode_mop(rpa_compiler_t *co)
47 {
48         rvm_codegen_addlabel_s(co->cg, "rpacompiler_mnode_mop");
49         rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, LR, XX, XX, 0));
50         rvm_codegen_addins(co->cg, rvm_asm(RVM_BXL, R_WHT, XX, XX, 0));
51         rvm_codegen_addins(co->cg, rvm_asml(RVM_CMP, R0, DA, XX, 0));
52         rvm_codegen_addins(co->cg, rvm_asm(RVM_BGRE, DA, XX, XX, 4));
53         rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, 0));
54         rvm_codegen_addins(co->cg, rvm_asml(RVM_CMP, R0, R0, XX, 0));
55         rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, PC, XX, XX, 0));
56         rvm_codegen_addins(co->cg, rvm_asm(RVM_CLR, R1, XX, XX, 0));
57         rvm_codegen_addins(co->cg, rvm_asm(RVM_ADD, R0, R0, R1, 0));
58         rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R0, XX, XX, 0));
59         rvm_codegen_addins(co->cg, rvm_asm(RVM_BXL, R_WHT, XX, XX, 0));
60         rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
61         rvm_codegen_addins(co->cg, rvm_asml(RVM_CMP, R0, DA, XX, 0));
62         rvm_codegen_addins(co->cg, rvm_asm(RVM_BGRE, DA, XX, XX, -5));
63         rvm_codegen_addins(co->cg, rvm_asm(RVM_ADDS, R0, R1, DA, 0));
64         rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, PC, XX, XX, 0));
65 }
66
67
68 rpa_compiler_t *rpa_compiler_create()
69 {
70         rpa_compiler_t *co;
71
72         co = r_malloc(sizeof(*co));
73         r_memset(co, 0, sizeof(*co));
74         co->cg = rvm_codegen_create();
75         co->scope = rvm_scope_create();
76         rpacompiler_mnode_nan(co);
77         rpacompiler_mnode_opt(co);
78         rpacompiler_mnode_mul(co);
79         rpacompiler_mnode_mop(co);
80         return co;
81 }
82
83
84 void rpa_compiler_destroy(rpa_compiler_t *co)
85 {
86         if (co) {
87                 rvm_codegen_destroy(co->cg);
88                 rvm_scope_destroy(co->scope);
89         }
90         r_free(co);
91 }