Mercurial > lcfOS
diff python/target/instructionselector.py @ 290:7b38782ed496
File moves
author | Windel Bouwman |
---|---|
date | Sun, 24 Nov 2013 11:24:15 +0100 |
parents | python/instructionselector.py@02385f62f250 |
children | 6753763d3bec |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/target/instructionselector.py Sun Nov 24 11:24:15 2013 +0100 @@ -0,0 +1,59 @@ +import ir +import irmach +from irmach import AbstractInstruction as makeIns +import target + +def genTemps(): + n = 900 + while True: + yield ir.Temp('t{}'.format(n)) + n = n + 1 + + +class InstructionSelector: + """ + Base instruction selector. This class must be overridden by + backends. + """ + def __init__(self): + self.temps = genTemps() + + def newTmp(self): + return self.temps.__next__() + + def munchFunction(self, f, frame): + # Entry point for instruction selection + assert isinstance(f, ir.Function) + self.targets = {} + # Enter a frame per function: + self.frame = frame + # First define labels: + for bb in f.Blocks: + itgt = makeIns(target.Label(bb.name)) + self.targets[bb] = itgt + # Generate code for all blocks: + for bb in f.Blocks: + self.emit2(self.targets[bb]) + for i in bb.Instructions: + self.munchStm(i) + self.munchStm(ir.Move(self.frame.rv, f.return_value)) + + def move(self, dst, src): + raise NotImplementedError('Not target implemented') + + def emit(self, *args, **kwargs): + """ Abstract instruction emitter """ + i = makeIns(*args, **kwargs) + return self.emit2(i) + + def emit2(self, i): + self.frame.instructions.append(i) + return i + + def munchStm(self, s): + """ Implement this in the target specific back-end """ + raise NotImplementedError() + + def munchExpr(self, e): + """ Implement this in the target specific back-end """ + raise NotImplementedError()