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 }