279
|
1 import unittest
|
|
2 import os
|
|
3 import sys
|
|
4 import irmach
|
|
5 import registerallocator
|
|
6 import ir
|
|
7
|
|
8
|
|
9 class RegAllocTestCase(unittest.TestCase):
|
|
10 def setUp(self):
|
|
11 self.ra = registerallocator.RegisterAllocator()
|
|
12
|
|
13 def testRegAlloc(self):
|
|
14 f = irmach.Frame('tst')
|
|
15 f.regs = [1,2,3,4,5,6] # for test use numbers!
|
|
16 f.tempMap = {}
|
|
17 t1 = ir.Temp('t1')
|
|
18 t2 = ir.Temp('t2')
|
|
19 t3 = ir.Temp('t3')
|
|
20 t4 = ir.Temp('t4')
|
|
21 t5 = ir.Temp('t5')
|
|
22 f.instructions.append(irmach.makeIns('ld %d0', dst=[t1]))
|
|
23 f.instructions.append(irmach.makeIns('ld %d0', dst=[t2]))
|
|
24 f.instructions.append(irmach.makeIns('ld %d0', dst=[t3]))
|
|
25 f.instructions.append(irmach.makeIns('add %d0, %s0, %s1', dst=[t4], src=[t1, t2]))
|
|
26 f.instructions.append(irmach.makeIns('add %d0, %s0, %s1', dst=[t5], src=[t4, t3]))
|
|
27 f.instructions.append(irmach.makeIns('st %s0', src=[t5]))
|
|
28 self.ra.allocFrame(f)
|
|
29 self.conflict(t1, t2)
|
|
30 self.conflict(t2, t3)
|
|
31
|
|
32 def conflict(self, ta, tb):
|
|
33 self.assertNotEqual(self.ra.Node(ta).color, self.ra.Node(tb).color)
|
|
34
|
|
35 def testRegCoalesc(self):
|
|
36 f = irmach.Frame('tst')
|
|
37 f.regs = [1,2,3,4,5,6] # for test use numbers!
|
|
38 f.tempMap = {}
|
|
39 t1 = ir.Temp('t1')
|
|
40 t2 = ir.Temp('t2')
|
|
41 t3 = ir.Temp('t3')
|
|
42 t4 = ir.Temp('t4')
|
|
43 t5 = ir.Temp('t5')
|
|
44 t6 = ir.Temp('t6')
|
|
45 f.instructions.append(irmach.makeIns('ld %d0', dst=[t1]))
|
|
46 f.instructions.append(irmach.makeIns('ld %d0', dst=[t2]))
|
|
47 f.instructions.append(irmach.makeIns('ld %d0', dst=[t3]))
|
|
48 f.instructions.append(irmach.makeIns('lsl %s0, %s1', dst=[t4], src=[t2, t1]))
|
|
49 f.instructions.append(irmach.makeIns('mov %d0, %s0', dst=[t5], src=[t3]))
|
|
50 f.instructions.append(irmach.makeIns('orr %s0, %s1', dst=[t5], src=[t4, t5]))
|
|
51 f.instructions.append(irmach.makeIns('mov %d0, %s0', dst=[t6], src=[t5]))
|
|
52 f.instructions.append(irmach.makeIns('st %s0', src=[t6]))
|
|
53 self.ra.allocFrame(f)
|
|
54 f.ig.to_txt()
|
|
55 for i in f.instructions:
|
|
56 print(i)
|
|
57 self.conflict(t1, t2)
|
|
58 self.conflict(t2, t3)
|
|
59 self.conflict(t1, t3)
|
|
60
|
|
61 if __name__ == '__main__':
|
|
62 unittest.main()
|
|
63
|