Преглед на файлове

Merge branch 'master' of github.com:taddeus/peephole

Jayke Meijer преди 14 години
родител
ревизия
baff0f9ff2
променени са 1 файла, в които са добавени 38 реда и са изтрити 37 реда
  1. 38 37
      src/optimize/advanced.py

+ 38 - 37
src/optimize/advanced.py

@@ -173,49 +173,45 @@ def fold_constants(block):
             # Move of `Hi' register to another register
             register[s[0]] = register['$hi']
             known.append((s[0], register[s[0]]))
-        elif s.name in ['mult', 'div'] \
-                and s[0]in register and s[1] in register:
+        elif s.name == 'mult' and s[0]in register and s[1] in register:
             # Multiplication/division with constants
             rs, rt = s
             a, b = register[rs], register[rt]
 
-            if s.name == 'mult':
-                if not a or not b:
-                    # Multiplication by 0
-                    hi = lo = to_hex(0)
-                    message = 'Multiplication by 0: %d * 0' % (b if a else a)
-                elif a == 1:
-                    # Multiplication by 1
-                    hi = to_hex(0)
-                    lo = to_hex(b)
-                    message = 'Multiplication by 1: %d * 1' % b
-                elif b == 1:
-                    # Multiplication by 1
-                    hi = to_hex(0)
-                    lo = to_hex(a)
-                    message = 'Multiplication by 1: %d * 1' % a
-                else:
-                    # Calculate result and fill Hi/Lo registers
-                    result = a * b
-                    binary = bin(result)[2:]
-                    binary = '0' * (64 - len(binary)) + binary
-                    hi = int(binary[:32], base=2)
-                    lo = int(binary[32:], base=2)
-                    message = 'Constant multiplication: %d * %d = %d' \
-                              % (a, b, result)
-
-                # Replace the multiplication with two immidiate loads to the
-                # Hi/Lo registers
-                block.replace(1, [S('command', 'li', '$hi', hi),
-                                  S('command', 'li', '$lo', li)],
-                              message=message)
-            elif s.name == 'div':
-                lo, hi = divmod(rs, rt)
+            if not a or not b:
+                # Multiplication by 0
+                hi = lo = to_hex(0)
+                message = 'Multiplication by 0: %d * 0' % (b if a else a)
+            elif a == 1:
+                # Multiplication by 1
+                hi = to_hex(0)
+                lo = to_hex(b)
+                message = 'Multiplication by 1: %d * 1' % b
+            elif b == 1:
+                # Multiplication by 1
+                hi = to_hex(0)
+                lo = to_hex(a)
+                message = 'Multiplication by 1: %d * 1' % a
+            else:
+                # Calculate result and fill Hi/Lo registers
+                result = a * b
+                binary = bin(result)[2:]
+                binary = '0' * (64 - len(binary)) + binary
+                hi = int(binary[:32], base=2)
+                lo = int(binary[32:], base=2)
+                message = 'Constant multiplication: %d * %d = %d' \
+                            % (a, b, result)
+
+            # Replace the multiplication with two immidiate loads to the
+            # Hi/Lo registers
+            block.replace(1, [S('command', 'li', '$hi', hi),
+                                S('command', 'li', '$lo', li)],
+                            message=message)
 
             register['$lo'], register['$hi'] = lo, hi
             known += [('$lo', lo), ('$hi', hi)]
             changed = True
-        elif s.name in ['addu', 'subu']:
+        elif s.name in ['addu', 'subu', 'div']:
             # Addition/subtraction with constants
             rd, rs, rt = s
             rs_known = rs in register
@@ -232,12 +228,17 @@ def fold_constants(block):
                 if s.name == 'addu':
                     result = rs_val + rt_val
                     message = 'Constant addition: %d + %d = %d' \
-                            % (rs_val, rt_val, result)
+                              % (rs_val, rt_val, result)
 
                 if s.name == 'subu':
                     result = rs_val - rt_val
                     message = 'Constant subtraction: %d - %d = %d' \
-                            % (rs_val, rt_val, result)
+                              % (rs_val, rt_val, result)
+
+                if s.name == 'div':
+                    result = rs_val / rt_val
+                    message = 'Constant division: %d - %d = %d' \
+                              % (rs_val, rt_val, result)
 
                 block.replace(1, [S('command', 'li', rd, to_hex(result))],
                               message=message)