diff python/x86.py @ 158:9683a4cd848f

Added some functions for code generation
author Windel Bouwman
date Fri, 08 Mar 2013 16:52:44 +0100
parents 8f3924b6076e
children 10330be89bc2
line wrap: on
line diff
--- a/python/x86.py	Sun Mar 03 18:14:35 2013 +0100
+++ b/python/x86.py	Fri Mar 08 16:52:44 2013 +0100
@@ -1,9 +1,53 @@
 import ppci
+import ir
+
+class AsmLabel:
+   def __init__(self, lab):
+      self.lab = lab
+   def __repr__(self):
+      return '{0}:'.format(self.lab)
+
+class Op:
+   def __init__(self, op, a, b):
+      self.op = op
+      self.a = a
+      self.b = b
+   def __repr__(self):
+      return '{0} {1}, {2}'.format(self.op, self.a, self.b)
 
 class X86CodeGen:
    def __init__(self, diag):
       self.diag = diag
 
+   def emit(self, i):
+      self.asm.append(i)
+
    def genBin(self, i):
-      print(i)
+      self.asm = []
+      self.genModule(i)
 
+   def genModule(self, m):
+      for g in m.Globals:
+         self.emit(AsmLabel(g.name))
+         # Ignore types for now ..
+         self.emit('dw 0')
+      for f in m.Functions:
+         self.genFunction(f)
+   def genFunction(self, f):
+      self.emit('global {0}'.format(f.name))
+      self.emit(AsmLabel(f.name))
+      for bb in f.BasicBlocks:
+         self.genBB(bb)
+   def genBB(self, bb):
+      for i in bb.Instructions:
+         self.genIns(i)
+   def genIns(self, i):
+      if type(i) is ir.BinaryOperator:
+         if i.operation == 'fadd':
+            r = 'rax'
+            self.emit(Op('add', r, '11'))
+      elif type(i) is ir.RetInstruction:
+         self.emit('ret')
+      else:
+         print('Unknown ins', i)
+