Mercurial > repos > tabletprog
comparison 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 |
comparison
equal
deleted
inserted
replaced
202:cea671c4056c | 203:56b2100d9fff |
---|---|
410 to2OpInst <- { | 410 to2OpInst <- { |
411 skipIf: _cond (to2Op: _toskip) | 411 skipIf: _cond (to2Op: _toskip) |
412 } | 412 } |
413 } | 413 } |
414 } | 414 } |
415 save <- :regs :scope{ | 415 save <- :regs :_scope{ |
416 #{ | 416 #{ |
417 opcode <- { _save } | 417 opcode <- { _save } |
418 numops <- { 0 } | 418 numops <- { 0 } |
419 name <- { _names get: _save } | 419 name <- { _names get: _save } |
420 tosave <- { regs } | |
421 scope <- { _scope } | |
420 string <- { | 422 string <- { |
421 block <- scope join: "\n\t" | 423 block <- _scope join: "\n\t" |
422 if: (scope length) > 0 { | 424 if: (_scope length) > 0 { |
423 block <- "\n\t" . block . "\n" | 425 block <- "\n\t" . block . "\n" |
424 } | 426 } |
425 name . " " . (regs join: " ") . " {" . block . "}" | 427 name . " " . (regs join: " ") . " {" . block . "}" |
426 } | 428 } |
427 to2OpInst <- { | 429 to2OpInst <- { |
428 save: regs (to2Op: scope) | 430 save: regs (to2Op: _scope) |
429 } | 431 } |
430 } | 432 } |
431 } | 433 } |
432 | 434 |
433 allocRegs:withSource <- :instarr:regSrc { | 435 allocRegs:withSource <- :instarr:regSrc { |
607 } | 609 } |
608 } | 610 } |
609 } | 611 } |
610 } | 612 } |
611 | 613 |
614 toBackend <- :program :backend { | |
615 prepped <- program map: :fun { | |
616 backend adjustIL: fun | |
617 } | |
618 labels <- prepped map: :_ { | |
619 backend label | |
620 } | |
621 outprog <- #[] | |
622 foreach: prepped :name instarr { | |
623 outprog append: (labels get: name) | |
624 foreach: instarr :_ inst { | |
625 backend convertIL: inst to: outprog withLabels: labels | |
626 } | |
627 } | |
628 outprog | |
629 } | |
630 | |
612 main <- { | 631 main <- { |
632 prog <- dict linear | |
633 | |
613 fib <- #[ | 634 fib <- #[ |
614 sub: 2 (arg: 0) (reg: 0) q | 635 sub: 2 (arg: 0) (reg: 0) q |
615 skipIf: ge #[ | 636 skipIf: ge #[ |
616 return: 1 q | 637 return: 1 q |
617 ] | 638 ] |
624 ] | 645 ] |
625 print: "Original:\n\n" | 646 print: "Original:\n\n" |
626 foreach: fib :idx inst { | 647 foreach: fib :idx inst { |
627 print: (string: inst) . "\n" | 648 print: (string: inst) . "\n" |
628 } | 649 } |
629 print: "\n\nUsage:\n\n" | 650 prog set: "fib" fib |
630 fiba <- allocRegs: fib withSource: (x86 regSource) | 651 |
631 print: "\n\nAfter Assignment:\n\n" | 652 mprog <- prog toBackend: x86 |
632 foreach: fiba :idx inst { | 653 ba <- bytearray executableFromBytes: mprog |
633 print: (string: inst) . "\n" | 654 res <- ba runWithArg: 30u64 |
634 } | 655 print: (string: res) . "\n" |
635 fib2 <- to2Op: fiba | 656 0 |
636 print: "\n\n2-Operand:\n\n" | |
637 foreach: fib2 :idx inst { | |
638 print: (string: inst) . "\n" | |
639 } | |
640 } | 657 } |
641 } | 658 } |
642 } | 659 } |