820c305a70d995ecd2912883d6798e364630bbcf
3 from bigint_presentation_code
.compiler_ir
import (VL
, FixedGPRRangeType
, Fn
,
4 GlobalMem
, GPRRange
, GPRType
,
5 OpBigIntAddSub
, OpConcat
,
7 OpInputMem
, OpLI
, OpLoad
,
8 OpSetCA
, OpSetVLImm
, OpStore
,
9 RegLoc
, SSAVal
, XERBit
,
14 class TestCompilerIR(unittest
.TestCase
):
17 def test_op_set_to_list(self
):
19 op0
= OpFuncArg(fn
, FixedGPRRangeType(GPRRange(3)))
20 op1
= OpCopy(fn
, op0
.out
, GPRType())
24 op3
= OpSetVLImm(fn
, 32)
26 op4
= OpLoad(fn
, arg
, offset
=0, mem
=mem
, vl
=vl
)
30 op6
= OpSetVLImm(fn
, 31)
32 op7
= OpLI(fn
, 0, vl
=vl
)
34 op8
= OpConcat(fn
, [b_0
, b_rest
])
36 op9
= OpSetVLImm(fn
, 32)
38 op10
= OpSetCA(fn
, False)
40 op11
= OpBigIntAddSub(fn
, a
, b
, ca
, is_sub
=False, vl
=vl
)
42 op12
= OpStore(fn
, s
, arg
, offset
=0, mem_in
=mem
, vl
=vl
)
46 op10
, # OpSetCA(fn, False)
47 op9
, # OpSetVLImm(fn, 32)
48 op6
, # OpSetVLImm(fn, 31)
50 op3
, # OpSetVLImm(fn, 32)
52 op0
, # OpFuncArg(fn, FixedGPRRangeType(GPRRange(3)))
53 op7
, # OpLI(fn, 0, vl=vl)
54 op1
, # OpCopy(fn, op0.out, GPRType())
55 op8
, # OpConcat(fn, [b_0, b_rest])
56 op4
, # OpLoad(fn, arg, offset=0, mem=mem, vl=vl)
57 op11
, # OpBigIntAddSub(fn, a, b, ca, is_sub=False, vl=vl)
58 op12
, # OpStore(fn, s, arg, offset=0, mem_in=mem, vl=vl)
61 ops
= op_set_to_list(fn
.ops
[::-1])
62 if ops
!= expected_ops
:
63 self
.assertEqual(repr(ops
), repr(expected_ops
))
65 def tst_generate_assembly(self
, use_reg_alloc
=False):
67 op0
= OpFuncArg(fn
, FixedGPRRangeType(GPRRange(3)))
68 op1
= OpCopy(fn
, op0
.out
, GPRType())
72 op3
= OpSetVLImm(fn
, 32)
74 op4
= OpLoad(fn
, arg
, offset
=0, mem
=mem
, vl
=vl
)
76 op5
= OpLI(fn
, 0, vl
=vl
)
78 op6
= OpSetCA(fn
, True)
80 op7
= OpBigIntAddSub(fn
, a
, b
, ca
, is_sub
=False, vl
=vl
)
82 op8
= OpStore(fn
, s
, arg
, offset
=0, mem_in
=mem
, vl
=vl
)
85 assigned_registers
= {
86 op0
.out
: GPRRange(start
=3, length
=1),
87 op1
.dest
: GPRRange(start
=3, length
=1),
88 op2
.out
: GlobalMem
.GlobalMem
,
90 op4
.RT
: GPRRange(start
=78, length
=32),
91 op5
.out
: GPRRange(start
=46, length
=32),
93 op7
.out
: GPRRange(start
=14, length
=32),
94 op7
.CA_out
: XERBit
.CA
,
95 op8
.mem_out
: GlobalMem
.GlobalMem
,
96 } # type: dict[SSAVal, RegLoc] | None
99 assigned_registers
= None
101 asm
= generate_assembly(fn
.ops
, assigned_registers
)
102 self
.assertEqual(asm
, [
103 "setvl 0, 0, 32, 0, 1, 1",
107 "sv.adde *14, *78, *46",
112 def test_generate_assembly(self
):
113 self
.tst_generate_assembly()
115 def test_generate_assembly_with_register_allocator(self
):
116 self
.tst_generate_assembly(use_reg_alloc
=True)
119 if __name__
== "__main__":