|
|
@@ -10,9 +10,38 @@ def empty_shift(statement):
|
|
|
stype, name, args = statement
|
|
|
return stype == 'command' and name in shift_types and \
|
|
|
args['args'][0] == args['args'][1] and args['args'][2] == 0
|
|
|
+
|
|
|
+def optimize_branch_jump_label(statements):
|
|
|
+ '''Optimize jumps after branches.'''
|
|
|
+ out_statements = []
|
|
|
+
|
|
|
+ for i in xrange(len(statements)):
|
|
|
+ if i + 3 > len(statements):
|
|
|
+ out_statements.append(statements[i])
|
|
|
+ continue
|
|
|
+
|
|
|
+ stype, name, args = statements[i]
|
|
|
+ stype2, name2, args2 = statements[i + 1]
|
|
|
+ stype3, name3, args3 = statements[i + 2]
|
|
|
+
|
|
|
+ if stype == 'command' and name == 'beq' and \
|
|
|
+ stype2 == 'command' and name2 in ['j', 'jal'] and \
|
|
|
+ stype3 == 'label' and name3 == args['args'][2]:
|
|
|
+ out_statements.append(('command', 'bne', \
|
|
|
+ {'args': [args['args'][0], args['args'][1], args2['args'][0]]}))
|
|
|
+ out_statements.append(statements[1 + 2])
|
|
|
+ i += 3
|
|
|
+ else:
|
|
|
+ out_statements.append(statements[i])
|
|
|
+
|
|
|
+ return out_statements
|
|
|
+
|
|
|
+
|
|
|
|
|
|
def optimize_global(statements):
|
|
|
'''Optimize one-line statements in entire code.'''
|
|
|
+ statements = optimize_branch_jump_label(statements)
|
|
|
+
|
|
|
return filter(lambda s: not equal_mov(s) and not empty_shift(s), statements)
|
|
|
|
|
|
def optimize_blocks(blocks):
|