test_optimize.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import unittest
  2. from src.optimize import optimize_global, optimize_block
  3. from src.statement import Statement as S, Block as B
  4. class TestOptimize(unittest.TestCase):
  5. def setUp(self):
  6. self.foo = S('command', 'foo')
  7. self.bar = S('command', 'bar')
  8. def tearDown(self):
  9. del self.foo
  10. del self.bar
  11. def test_optimize_block_movaa(self):
  12. block = B([self.foo,
  13. S('command', 'move', '$regA', '$regA'),
  14. self.bar])
  15. optimize_block(block)
  16. self.assertEquals(block.statements, [self.foo, self.bar])
  17. def test_optimize_block_movab(self):
  18. move = S('command', 'move', '$regA', '$regB')
  19. block = B([self.foo,
  20. move,
  21. self.bar])
  22. optimize_block(block)
  23. self.assertEquals(block.statements, [self.foo, move, self.bar])
  24. def test_optimize_block_movinst_true(self):
  25. block = B([self.foo,
  26. S('command', 'move', '$regA', '$regB'),
  27. S('command', 'addu', '$regA', '$regA', 2),
  28. self.bar])
  29. optimize_block(block)
  30. self.assertEquals(block.statements, [self.foo,
  31. S('command', 'addu', '$regA', '$regB', 2),
  32. self.bar])
  33. def test_optimize_block_movinst_false(self):
  34. statements = [self.foo, \
  35. S('command', 'move', '$regA', '$regB'), \
  36. S('command', 'addu', '$regA', '$regC', 2), \
  37. self.bar]
  38. block = B(statements)
  39. optimize_block(block)
  40. self.assertEquals(block.statements, statements)
  41. def test_optimize_block_instr_mov_jal_true(self):
  42. block = B([self.foo,
  43. S('command', 'addu', '$regA', '$regC', 2),
  44. S('command', 'move', '$4', '$regA'),
  45. S('command', 'jal', 'L1'),
  46. self.bar])
  47. optimize_block(block)
  48. self.assertEquals(block.statements, [self.foo,
  49. S('command', 'addu', '$4', '$regC', 2),
  50. S('command', 'jal', 'L1'),
  51. self.bar])
  52. def test_optimize_block_instr_mov_jal_false(self):
  53. arguments = [self.foo, \
  54. S('command', 'addu', '$regA', '$regC', 2), \
  55. S('command', 'move', '$3', '$regA'), \
  56. S('command', 'jal', 'L1'), \
  57. self.bar]
  58. block = B(arguments)
  59. optimize_block(block)
  60. self.assertEquals(block.statements, arguments)
  61. def test_optimize_block_sw_ld_true(self):
  62. block = B([self.foo,
  63. S('command', 'sw', '$regA', '$regB'),
  64. S('command', 'lw', '$regA', '$regB'),
  65. self.bar])
  66. optimize_block(block)
  67. self.assertEquals(block.statements, [self.foo,
  68. S('command', 'sw', '$regA', '$regB'),
  69. self.bar])
  70. def test_optimize_block_sw_ld_false(self):
  71. arguments = [self.foo, \
  72. S('command', 'sw', '$regA', '$regB'), \
  73. S('command', 'lw', '$regD', '$regC'), \
  74. self.bar]
  75. block = B(arguments)
  76. optimize_block(block)
  77. self.assertEquals(block.statements, arguments)
  78. def test_optimize_block_shift_true(self):
  79. block = B([self.foo,
  80. S('command', 'sll', '$regA', '$regA', 0),
  81. self.bar])
  82. optimize_block(block)
  83. self.assertEquals(block.statements, [self.foo, self.bar])
  84. def test_optimize_block_shift_false(self):
  85. arguments = [self.foo, \
  86. S('command', 'sll', '$regA', '$regB', 0), \
  87. self.bar]
  88. block = B(arguments)
  89. optimize_block(block)
  90. self.assertEquals(block.statements, arguments)
  91. arguments2 = [self.foo, \
  92. S('command', 'sll', '$regA', '$regA', 1), \
  93. self.bar]
  94. block2 = B(arguments2)
  95. optimize_block(block2)
  96. self.assertEquals(block2.statements, arguments2)
  97. def test_optimize_block_add_lw_true(self):
  98. block = B([self.foo,
  99. S('command', 'addu', '$regA', '$regA', 10),
  100. S('command', 'lw', '$regB', '0($regA)'),
  101. self.bar])
  102. optimize_block(block)
  103. self.assertEquals(block.statements, [self.foo,
  104. S('command', 'lw', '$regB', '10($regA)'),
  105. self.bar])
  106. def test_optimize_block_add_lw_false(self):
  107. arguments = [self.foo, \
  108. S('command', 'addu', '$regA', '$regA', 10), \
  109. S('command', 'lw', '$regB', '0($regC)'), \
  110. self.bar]
  111. block = B(arguments)
  112. optimize_block(block)
  113. arguments2 = [self.foo, \
  114. S('command', 'addu', '$regA', '$regB', 10), \
  115. S('command', 'lw', '$regB', '0($regA)'), \
  116. self.bar]
  117. block2 = B(arguments2)
  118. arguments3 = [self.foo, \
  119. S('command', 'addu', '$regA', '$regA', 10), \
  120. S('command', 'lw', '$regB', '1($regA)'), \
  121. self.bar]
  122. block3 = B(arguments3)
  123. optimize_block(block3)
  124. self.assertEquals(block.statements, arguments)
  125. self.assertEquals(block2.statements, arguments2)
  126. self.assertEquals(block3.statements, arguments3)
  127. def test_optimize_global_beq_j_true(self):
  128. block = B([self.foo,
  129. S('command', 'beq', '$regA', '$regB', '$Lx'),
  130. S('command', 'j', '$Ly'),
  131. S('label', '$Lx'),
  132. self.bar])
  133. optimize_global(block)
  134. self.assertEquals(block.statements, [self.foo,
  135. S('command', 'bne', '$regA', '$regB', '$Ly'),
  136. S('label', '$Lx'),
  137. self.bar])
  138. def test_optimize_global_beq_j_false(self):
  139. arguments = [self.foo, \
  140. S('command', 'beq', '$regA', '$regB', '$Lz'), \
  141. S('command', 'j', '$Ly'), \
  142. S('label', '$Lx'), \
  143. self.bar]
  144. block = B(arguments)
  145. optimize_global(block)
  146. self.assertEquals(block.statements, arguments)
  147. def test_optimize_global_bne_j_true(self):
  148. block = B([self.foo,
  149. S('command', 'bne', '$regA', '$regB', '$Lx'),
  150. S('command', 'j', '$Ly'),
  151. S('label', '$Lx'),
  152. self.bar])
  153. optimize_global(block)
  154. self.assertEquals(block.statements, [self.foo,
  155. S('command', 'beq', '$regA', '$regB', '$Ly'),
  156. S('label', '$Lx'),
  157. self.bar])
  158. def test_optimize_global_bne_j_false(self):
  159. arguments = [self.foo, \
  160. S('command', 'bne', '$regA', '$regB', '$Lz'), \
  161. S('command', 'j', '$Ly'), \
  162. S('label', '$Lx'), \
  163. self.bar]
  164. block = B(arguments)
  165. optimize_global(block)
  166. self.assertEquals(block.statements, arguments)
  167. def test_optimize_block_move_move_true(self):
  168. block = B([self.foo,
  169. S('command', 'move', '$regA', '$regB'),
  170. S('command', 'move', '$regB', '$regA'),
  171. self.bar])
  172. optimize_block(block)
  173. self.assertEquals(block.statements, [self.foo,
  174. S('command', 'move', '$regA', '$regB'),
  175. self.bar])
  176. def test_optimize_block_mov_mov_false(self):
  177. arguments = [self.foo, \
  178. S('command', 'move', '$regA', '$regB'), \
  179. S('command', 'move', '$regB', '$regC'), \
  180. self.bar]
  181. block = B(arguments)
  182. optimize_block(block)
  183. self.assertEquals(block.statements, arguments)