Mercurial > repos > tabletprog
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 } } }