aboutsummaryrefslogtreecommitdiff
path: root/devtools/tasmrecover/tasm/proc.py
diff options
context:
space:
mode:
authorVladimir Menshakov2011-06-16 00:20:30 +0400
committerVladimir Menshakov2011-06-16 00:20:30 +0400
commite0efde7cf65e0f22d5afa830339fb1dc6ca91479 (patch)
tree05dcc4ec22131e7175d2bef18a5e0294c18dd7fe /devtools/tasmrecover/tasm/proc.py
parentc1b9adb69122d86665079c619a535095d7fe1507 (diff)
downloadscummvm-rg350-e0efde7cf65e0f22d5afa830339fb1dc6ca91479.tar.gz
scummvm-rg350-e0efde7cf65e0f22d5afa830339fb1dc6ca91479.tar.bz2
scummvm-rg350-e0efde7cf65e0f22d5afa830339fb1dc6ca91479.zip
DREAMWEB: optimized consequtive movsb/w and stosb/w
Diffstat (limited to 'devtools/tasmrecover/tasm/proc.py')
-rw-r--r--devtools/tasmrecover/tasm/proc.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/devtools/tasmrecover/tasm/proc.py b/devtools/tasmrecover/tasm/proc.py
index 57f17518fb..3c4ac21372 100644
--- a/devtools/tasmrecover/tasm/proc.py
+++ b/devtools/tasmrecover/tasm/proc.py
@@ -27,6 +27,30 @@ class proc:
self.stmts.remove(l)
return
+ def optimize_sequence(self, cls):
+ i = 0
+ stmts = self.stmts
+ while i < len(stmts):
+ if not isinstance(stmts[i], cls):
+ i += 1
+ continue
+ j = i + 1
+
+ while j < len(stmts):
+ if not isinstance(stmts[j], cls):
+ break
+ j = j + 1
+
+ n = j - i
+ if n > 1:
+ print "Eliminate consequtive storage instructions at %u-%u" %(i, j)
+ del stmts[i + 1:j]
+ stmts[i].repeat = n
+ else:
+ i = j
+
+ return
+
def optimize(self):
print "optimizing..."
#trivial simplifications, removing last ret
@@ -72,6 +96,11 @@ class proc:
if not used:
print self.labels
self.remove_label(s.name)
+
+ self.optimize_sequence(op._stosb);
+ self.optimize_sequence(op._stosw);
+ self.optimize_sequence(op._movsb);
+ self.optimize_sequence(op._movsw);
def add(self, stmt):
#print stmt