try_allocate_registers_without_spilling works!
[bigint-presentation-code.git] / src / bigint_presentation_code / test_compiler_ir.py
1 import unittest
2
3 from bigint_presentation_code.compiler_ir import (FixedGPRRangeType, GPRRange, GPRType,
4 Op, OpAddSubE, OpClearCY, OpConcat, OpCopy, OpFuncArg, OpInputMem, OpLI, OpLoad, OpStore,
5 op_set_to_list)
6
7
8 class TestCompilerIR(unittest.TestCase):
9 maxDiff = None
10
11 def test_op_set_to_list(self):
12 ops = [] # type: list[Op]
13 op0 = OpFuncArg(FixedGPRRangeType(GPRRange(3)))
14 ops.append(op0)
15 op1 = OpCopy(op0.out, GPRType())
16 ops.append(op1)
17 arg = op1.dest
18 op2 = OpInputMem()
19 ops.append(op2)
20 mem = op2.out
21 op3 = OpLoad(arg, offset=0, mem=mem, length=32)
22 ops.append(op3)
23 a = op3.RT
24 op4 = OpLI(1)
25 ops.append(op4)
26 b_0 = op4.out
27 op5 = OpLI(0, length=31)
28 ops.append(op5)
29 b_rest = op5.out
30 op6 = OpConcat([b_0, b_rest])
31 ops.append(op6)
32 b = op6.dest
33 op7 = OpClearCY()
34 ops.append(op7)
35 cy = op7.out
36 op8 = OpAddSubE(a, b, cy, is_sub=False)
37 ops.append(op8)
38 s = op8.RT
39 op9 = OpStore(s, arg, offset=0, mem_in=mem)
40 ops.append(op9)
41 mem = op9.mem_out
42
43 expected_ops = [
44 op7, # OpClearCY()
45 op5, # OpLI(0, length=31)
46 op4, # OpLI(1)
47 op2, # OpInputMem()
48 op0, # OpFuncArg(FixedGPRRangeType(GPRRange(3)))
49 op6, # OpConcat([b_0, b_rest])
50 op1, # OpCopy(op0.out, GPRType())
51 op3, # OpLoad(arg, offset=0, mem=mem, length=32)
52 op8, # OpAddSubE(a, b, cy, is_sub=False)
53 op9, # OpStore(s, arg, offset=0, mem_in=mem)
54 ]
55
56 ops = op_set_to_list(reversed(ops))
57 if ops != expected_ops:
58 self.assertEqual(repr(ops), repr(expected_ops))
59
60
61 if __name__ == "__main__":
62 unittest.main()