Commit cbd8597b authored by Taddeus Kroes's avatar Taddeus Kroes

Started implementing Constant Folding.

parent ad32fbbc
......@@ -61,7 +61,7 @@ def optimize_block(block):
pass
def optimize(statements, verbose=0):
"""optimization wrapper function, calls global and basic-block level
"""Optimization wrapper function, calls global and basic-block level
optimization functions."""
# Optimize on a global level
o = len(statements)
......
from src.statement import Statement as S
def create_variable():
return '$15'
def eliminate_common_subexpressions(block):
"""
Common subexpression elimination:
......@@ -21,6 +25,7 @@ def eliminate_common_subexpressions(block):
if s.is_arith():
pointer = block.pointer
last = False
new_reg = False
args = s[1:]
# Collect similar statements
......@@ -33,6 +38,9 @@ def eliminate_common_subexpressions(block):
# Replace a similar expression by a move instruction
if s2.name == s.name and s2[1:] == args:
if not new_reg:
new_reg = create_variable()
block.replace(1, [S('command', 'move', s2[0], new_reg)])
last = block.pointer
......@@ -49,8 +57,37 @@ def eliminate_common_subexpressions(block):
return found
def to_hex(value):
"""Create the hexadecimal string of an integer."""
return '0x%08x' % value
def fold_constants(block):
"""
Constant folding:
"""
constants = {}
while not block.end():
s = block.read()
if s.is_load():
constants[s[0]] = s[1]
elif s.is_command() and len(s) == 3:
d, s, t = s
if s in constants and t in constants:
if s.name == 'addu':
result = s + t
elif s.name == 'subu':
result = s - t
elif s.name == 'mult':
result = s * t
elif s.name == 'div':
result = s / t
block.replace(1, [S('command', 'li', to_hex(result))])
constants[d] = result
#else:
return False
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment