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')