Skip to content
Snippets Groups Projects
Commit cbd8597b authored by Taddeus Kroes's avatar Taddeus Kroes
Browse files

Started implementing Constant Folding.

parent ad32fbbc
No related branches found
No related tags found
No related merge requests found
...@@ -61,7 +61,7 @@ def optimize_block(block): ...@@ -61,7 +61,7 @@ def optimize_block(block):
pass pass
def optimize(statements, verbose=0): 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.""" optimization functions."""
# Optimize on a global level # Optimize on a global level
o = len(statements) o = len(statements)
......
from src.statement import Statement as S from src.statement import Statement as S
def create_variable():
return '$15'
def eliminate_common_subexpressions(block): def eliminate_common_subexpressions(block):
""" """
Common subexpression elimination: Common subexpression elimination:
...@@ -21,6 +25,7 @@ def eliminate_common_subexpressions(block): ...@@ -21,6 +25,7 @@ def eliminate_common_subexpressions(block):
if s.is_arith(): if s.is_arith():
pointer = block.pointer pointer = block.pointer
last = False last = False
new_reg = False
args = s[1:] args = s[1:]
# Collect similar statements # Collect similar statements
...@@ -33,6 +38,9 @@ def eliminate_common_subexpressions(block): ...@@ -33,6 +38,9 @@ def eliminate_common_subexpressions(block):
# Replace a similar expression by a move instruction # Replace a similar expression by a move instruction
if s2.name == s.name and s2[1:] == args: 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)]) block.replace(1, [S('command', 'move', s2[0], new_reg)])
last = block.pointer last = block.pointer
...@@ -49,8 +57,37 @@ def eliminate_common_subexpressions(block): ...@@ -49,8 +57,37 @@ def eliminate_common_subexpressions(block):
return found return found
def to_hex(value):
"""Create the hexadecimal string of an integer."""
return '0x%08x' % value
def fold_constants(block): def fold_constants(block):
""" """
Constant folding: 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 return False
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