diff options
author | Vladimir Menshakov | 2011-06-16 00:20:30 +0400 |
---|---|---|
committer | Vladimir Menshakov | 2011-06-16 00:20:30 +0400 |
commit | e0efde7cf65e0f22d5afa830339fb1dc6ca91479 (patch) | |
tree | 05dcc4ec22131e7175d2bef18a5e0294c18dd7fe /devtools/tasmrecover/tasm/proc.py | |
parent | c1b9adb69122d86665079c619a535095d7fe1507 (diff) | |
download | scummvm-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.py | 29 |
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 |