Skip to content
Snippets Groups Projects
Commit 5cb0ae4b authored by Taddeüs Kroes's avatar Taddeüs Kroes
Browse files

Merged conflicts.

parents 1be2cbff 4c0f25a5
No related branches found
No related tags found
No related merge requests found
# TODO: Get all jump commands
JUMP_COMMANDS = ['j', 'jal']
# TODO: JALR & JR
JUMP_COMMANDS = ['j', 'jal', 'beq', 'bne', 'blez', 'bgtz', 'bltz', 'bgez', \
'bc1f', 'bc1t']
def is_jump(statement):
'''Check if a statement is a jump command.'''
......@@ -17,10 +18,12 @@ def find_leaders(statements):
for i, statement in enumerate(statements[1:]):
if is_jump(statement):
leaders.append(i + 2)
jump_target_labels.append(statement[2]['args'][0])
print statement[2]['args'][-1]
jump_target_labels.append(statement[2]['args'][-1])
#print 'found jump:', i, statement
#print 'target labels:', jump_target_labels
print 'target labels:', jump_target_labels
print 'leaders:', leaders
# Append jump targets
for i, statement in enumerate(statements[1:]):
......@@ -41,4 +44,6 @@ def find_basic_blocks(statements):
for i in range(len(leaders) - 1):
blocks.append(statements[leaders[i]:leaders[i + 1]])
blocks.append(statements[leaders[-1]:])
return blocks
#!/usr/bin/python
from parser import parse_file
from basic_block import find_basic_blocks
from optimizer import optimize_blocks
from writer import write_statements
if __name__ == '__main__':
......@@ -10,23 +11,20 @@ if __name__ == '__main__':
print 'Usage: python %s FILE' % argv[0]
exit(1)
# Parse File
statements = parse_file(argv[1])
blocks = find_basic_blocks(statements)
out = write_statements(statements)
statement_no = 1
for i, block in enumerate(blocks):
#print 'basic block %d:' % i
# Create basic blocks
blocks = find_basic_blocks(statements)
for statement in block:
#print statement_no, statement
statement_no += 1
# Optimize basic blocks
statements = optimize_blocks(blocks)
#print '\nOut:'
#print out
# Rewrite to assembly
out = write_statements(statements)
if len(argv) > 2:
# Save output assembly
f = open(argv[2], 'w+')
f.write(out)
f.close()
def optimize_blocks(blocks):
'''Call the optimizer for each basic block. Do this several times until
no more optimizations are achieved.'''
changed = True
while changed:
changed = False
optimized = []
for block in blocks:
block_changed, b = optimize_block(block)
optimized.append(b)
if block_changed:
changed = True
blocks = optimized
return reduce(lambda a, b: a + b, blocks, [])
def optimize_block(statements):
'''Optimize a basic block.'''
changed = False
output_statements = []
for statement in statements:
new_statement = statement
output_statements.append(new_statement)
return changed, output_statements
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment