|
@@ -19,7 +19,7 @@ fn eval(dn: &DfgNode) -> String {
|
|
|
format!("mem[OFF({})]", off)
|
|
|
},
|
|
|
DfgNode::Add(a, b) => {
|
|
|
- format!("({}) + ({})", eval(a), eval(b))
|
|
|
+ format!("{} + {}", eval(a), eval(b))
|
|
|
},
|
|
|
DfgNode::Multiply(a, b) => {
|
|
|
format!("({}) * ({})", eval(a), eval(b))
|
|
@@ -33,21 +33,28 @@ fn eval(dn: &DfgNode) -> String {
|
|
|
pub fn transpile_dfg(dfg: &optimize::DfgOptimizer) -> String {
|
|
|
let mut formatter = Formatter::new();
|
|
|
formatter.add_line(r#"#include <stdio.h>
|
|
|
- #include <stdlib.h>
|
|
|
- #include <string.h>
|
|
|
- #include <inttypes.h>
|
|
|
-
|
|
|
- #define OFF(X) (ptr + (uint16_t) (X))
|
|
|
-
|
|
|
- int main() {
|
|
|
- uint8_t* mem = (uint8_t*) calloc(0x10000, 1);
|
|
|
- uint16_t ptr = 0;"#);
|
|
|
+#include <stdlib.h>
|
|
|
+#include <string.h>
|
|
|
+#include <inttypes.h>
|
|
|
+
|
|
|
+#define OFF(X) (ptr + (uint16_t) (X))
|
|
|
+
|
|
|
+int main() {
|
|
|
+ uint8_t* mem = (uint8_t*) calloc(0x10000, 1);
|
|
|
+ uint16_t ptr = 0;"#);
|
|
|
formatter.indent();
|
|
|
+ generate_dfg(&dfg.cfg, &mut formatter);
|
|
|
+ formatter.unindent();
|
|
|
+ formatter.add_line("}");
|
|
|
+
|
|
|
+ formatter.get_code()
|
|
|
+}
|
|
|
|
|
|
- for &stmt in &dfg.cfg {
|
|
|
+fn generate_dfg(cfg: &Vec<DfInstr>, formatter: &mut Formatter) {
|
|
|
+ for stmt in cfg {
|
|
|
match stmt {
|
|
|
DfInstr::MovePtr(off) => {
|
|
|
- formatter.add_line(&format!("ptr += {}", off));
|
|
|
+ formatter.add_line(&format!("ptr += {};", off));
|
|
|
},
|
|
|
DfInstr::WriteMem(off, val) => {
|
|
|
formatter.add_line(&format!("mem[OFF({})] = {};", off, eval(val)));
|
|
@@ -55,17 +62,15 @@ pub fn transpile_dfg(dfg: &optimize::DfgOptimizer) -> String {
|
|
|
DfInstr::Print(val) => {
|
|
|
formatter.add_line(&format!("putchar({});", eval(val)));
|
|
|
},
|
|
|
- DfInstr::Loop(val) => {
|
|
|
+ DfInstr::Loop(_val, instrs) => {
|
|
|
formatter.add_line("while(mem[OFF(0)]) {");
|
|
|
formatter.indent();
|
|
|
-
|
|
|
+ generate_dfg(&instrs, formatter);
|
|
|
formatter.unindent();
|
|
|
formatter.add_line("}");
|
|
|
},
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- formatter.get_code()
|
|
|
}
|
|
|
|
|
|
|