def __init__(self, addr, branches, arg=None, base_value=0): self.name = 'switch-highlevel' if not arg: self.arg = placeholders.A else: self.arg = arg self.addr = addr self.branches = branches self.jtAddr = JumpTableAddress(addr.offset(1)) self.base_value = base_value
def __init__(self, addr, branches, arg=None, base_value=0): self.name = "switch-highlevel" if not arg: self.arg = placeholders.A else: self.arg = arg self.addr = addr self.branches = branches self.jtAddr = JumpTableAddress(addr.offset(1)) self.base_value = base_value
class Switch(Instruction): def __init__(self, addr, branches, arg=None, base_value=0): self.name = "switch-highlevel" if not arg: self.arg = placeholders.A else: self.arg = arg self.addr = addr self.branches = branches self.jtAddr = JumpTableAddress(addr.offset(1)) self.base_value = base_value def valueForBranch(self, i): return Constant(self.base_value + i) def render(self, renderer): renderer.newInstruction(self.addr) renderer.instructionName("switch") renderer.add(" (") self.arg.render(renderer) renderer.add(", ") self.jtAddr.render(renderer) renderer.add(") {") for (i, b) in enumerate(self.branches): renderer.newInstruction(self.addr) renderer.instructionName("case") renderer.add(" ") self.valueForBranch(i).render(renderer) renderer.add(":") with renderer.indent(): b.render(renderer) renderer.newInstruction(self.addr) renderer.add("}") def getInstructions(self, out): for b in self.branches: b.getInstructions(out) out.add(self) def optimizedWithContext(self, ctx): arg = self.arg.optimizedWithContext(ctx) base_value = self.base_value from . import operator if isinstance(arg, operator.Sub) and arg.right.value is not None: base_value += arg.right.value arg = arg.left branches = [b.optimizedWithContext(ctx.clone()) for b in self.branches] for b in self.branches: for w in b.getDependencySet().writes: ctx.setValueComplex(w) return Switch(self.addr, branches, arg, base_value) def getDependencies(self, needed): deps = self.arg.getDependencies() for b in self.branches: deps |= b.getDependencies(needed) return deps def getDependencySet(self): deps = DependencySet() for b in self.branches: deps = dependParallel(b.getDependencySet(), deps) return DependencySet(deps.reads | self.arg.getDependencies(), deps.writes) def optimizeDependencies(self, needed): branches = [b.optimizeDependencies(needed) for b in self.branches] return Switch(self.addr, branches, self.arg, self.base_value)
class Switch(Instruction): def __init__(self, addr, branches, arg=None, base_value=0): self.name = 'switch-highlevel' if not arg: self.arg = placeholders.A else: self.arg = arg self.addr = addr self.branches = branches self.jtAddr = JumpTableAddress(addr.offset(1)) self.base_value = base_value def valueForBranch(self, i): return Constant(self.base_value + i) def render(self, renderer): renderer.newInstruction(self.addr) renderer.instructionName('switch') renderer.add(' (') self.arg.render(renderer) renderer.add(', ') self.jtAddr.render(renderer) renderer.add(') {') for (i, b) in enumerate(self.branches): renderer.newInstruction(self.addr) renderer.instructionName('case') renderer.add(' ') self.valueForBranch(i).render(renderer) renderer.add(':') with renderer.indent(): b.render(renderer) renderer.newInstruction(self.addr) renderer.add('}') def getInstructions(self, out): for b in self.branches: b.getInstructions(out) out.add(self) def optimizedWithContext(self, ctx): arg = self.arg.optimizedWithContext(ctx) base_value = self.base_value from . import operator if isinstance(arg, operator.Sub) and arg.right.value is not None: base_value += arg.right.value arg = arg.left branches = [b.optimizedWithContext(ctx.clone()) for b in self.branches] for b in self.branches: for w in b.getDependencySet().writes: ctx.setValueComplex(w) return Switch(self.addr, branches, arg, base_value) def getDependencies(self, needed): deps = self.arg.getDependencies() for b in self.branches: deps |= b.getDependencies(needed) return deps def getDependencySet(self): deps = DependencySet() for b in self.branches: deps = dependParallel(b.getDependencySet(), deps) return DependencySet(deps.reads | self.arg.getDependencies(), deps.writes) def optimizeDependencies(self, needed): branches = [b.optimizeDependencies(needed) for b in self.branches] return Switch(self.addr, branches, self.arg, self.base_value)