Mercurial > lcfOS
diff python/ppci/target/arm/__init__.py @ 386:2a970e7270e2
Added repeat assembler macro
author | Windel Bouwman |
---|---|
date | Thu, 01 May 2014 17:40:59 +0200 |
parents | 6df89163e114 |
children | c0d9837acde8 |
line wrap: on
line diff
--- a/python/ppci/target/arm/__init__.py Thu May 01 14:03:12 2014 +0200 +++ b/python/ppci/target/arm/__init__.py Thu May 01 17:40:59 2014 +0200 @@ -21,15 +21,46 @@ self.target.add_keyword('section') self.target.add_instruction(['section', 'ID'], lambda rhs: self.select_section(rhs[1].val)) + self.target.add_keyword('repeat') + self.target.add_keyword('endrepeat') + self.target.add_instruction(['repeat', 'imm32'], self.begin_repeat) + self.target.add_instruction(['endrepeat'], self.end_repeat) + self.make_parser() self.lit_pool = [] self.lit_counter = 0 + self.inMacro = False + + def prepare(self): + self.inMacro = False + + def begin_repeat(self, rhs): + if self.inMacro: + raise Exception() + self.inMacro = True + self.rep_count = rhs[1] + self.recording = [] + + def end_repeat(self, rhs): + if not self.inMacro: + raise Exception() + self.inMacro = False + for rec in self.recording * self.rep_count: + self.emit(*rec) + + def emit(self, *args): + if self.inMacro: + self.recording.append(args) + else: + super().emit(*args) def select_section(self, name): self.flush() self.stream.select_section(name) def flush(self): + if self.inMacro: + raise Exception() while self.lit_pool: i = self.lit_pool.pop(0) self.emit(i) @@ -43,6 +74,7 @@ self.lit_pool.append(Dcd(v)) return label_name + class ArmTarget(Target): def __init__(self): super().__init__('arm')