diff modules/il.tp @ 203:56b2100d9fff

Add code for converting IL into x86 machine code
author Mike Pavone <pavone@retrodev.com>
date Wed, 28 Aug 2013 01:05:45 -0700
parents 49bca6487178
children 2308336790d4
line wrap: on
line diff
--- a/modules/il.tp	Wed Aug 28 01:05:29 2013 -0700
+++ b/modules/il.tp	Wed Aug 28 01:05:45 2013 -0700
@@ -412,20 +412,22 @@
 				}
 			}
 		}
-		save <- :regs :scope{
+		save <- :regs :_scope{
 			#{
 				opcode <- { _save }
 				numops <- { 0 }
 				name <- { _names get: _save }
+				tosave <- { regs }
+				scope <- { _scope }
 				string <- {
-					block <- scope join: "\n\t"
-					if: (scope length) > 0 {
+					block <- _scope join: "\n\t"
+					if: (_scope length) > 0 {
 						block <- "\n\t" . block . "\n"
 					}
 					name . " " . (regs join: " ") . " {" . block . "}"
 				}
 				to2OpInst <- {
-					save: regs (to2Op: scope)
+					save: regs (to2Op: _scope)
 				}
 			}
 		}
@@ -609,7 +611,26 @@
 			}
 		}
 
+		toBackend <- :program :backend {
+			prepped <- program map: :fun {
+				backend adjustIL: fun
+			}
+			labels <- prepped map: :_ {
+				backend label
+			}
+			outprog <- #[]
+			foreach: prepped :name instarr {
+				outprog append: (labels get: name)
+				foreach: instarr :_ inst {
+					backend convertIL: inst to: outprog withLabels: labels
+				}
+			}
+			outprog
+		}
+
 		main <- {
+			prog <- dict linear
+
 			fib <- #[
 				sub: 2 (arg: 0) (reg: 0) q
 				skipIf: ge #[
@@ -626,17 +647,13 @@
 			foreach: fib :idx inst {
 				print: (string: inst) . "\n"
 			}
-			print: "\n\nUsage:\n\n"
-			fiba <- allocRegs: fib withSource: (x86 regSource)
-			print: "\n\nAfter Assignment:\n\n"
-			foreach: fiba :idx inst {
-				print: (string: inst) . "\n"
-			}
-			fib2 <- to2Op: fiba
-			print: "\n\n2-Operand:\n\n"
-			foreach: fib2 :idx inst {
-				print: (string: inst) . "\n"
-			}
+			prog set: "fib" fib
+
+			mprog <- prog toBackend: x86
+			ba <- bytearray executableFromBytes: mprog
+			res <- ba runWithArg: 30u64
+			print: (string: res) . "\n"
+			0
 		}
 	}
 }