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
,
12 import bigint_presentation_code
.compiler_ir2
15 class TestCompilerIR(unittest
.TestCase
):
18 def test_op_set_to_list(self
):
20 op0
= OpFuncArg(fn
, FixedGPRRangeType(GPRRange(3)))
21 op1
= OpCopy(fn
, op0
.out
, GPRType())
25 op3
= OpSetVLImm(fn
, 32)
27 op4
= OpLoad(fn
, arg
, offset
=0, mem
=mem
, vl
=vl
)
31 op6
= OpSetVLImm(fn
, 31)
33 op7
= OpLI(fn
, 0, vl
=vl
)
35 op8
= OpConcat(fn
, [b_0
, b_rest
])
37 op9
= OpSetVLImm(fn
, 32)
39 op10
= OpSetCA(fn
, False)
41 op11
= OpBigIntAddSub(fn
, a
, b
, ca
, is_sub
=False, vl
=vl
)
43 op12
= OpStore(fn
, s
, arg
, offset
=0, mem_in
=mem
, vl
=vl
)
47 op10
, # OpSetCA(fn, False)
48 op9
, # OpSetVLImm(fn, 32)
49 op6
, # OpSetVLImm(fn, 31)
51 op3
, # OpSetVLImm(fn, 32)
53 op0
, # OpFuncArg(fn, FixedGPRRangeType(GPRRange(3)))
54 op7
, # OpLI(fn, 0, vl=vl)
55 op1
, # OpCopy(fn, op0.out, GPRType())
56 op8
, # OpConcat(fn, [b_0, b_rest])
57 op4
, # OpLoad(fn, arg, offset=0, mem=mem, vl=vl)
58 op11
, # OpBigIntAddSub(fn, a, b, ca, is_sub=False, vl=vl)
59 op12
, # OpStore(fn, s, arg, offset=0, mem_in=mem, vl=vl)
62 ops
= op_set_to_list(fn
.ops
[::-1])
63 if ops
!= expected_ops
:
64 self
.assertEqual(repr(ops
), repr(expected_ops
))
66 def tst_generate_assembly(self
, use_reg_alloc
=False):
68 op0
= OpFuncArg(fn
, FixedGPRRangeType(GPRRange(3)))
69 op1
= OpCopy(fn
, op0
.out
, GPRType())
73 op3
= OpSetVLImm(fn
, 32)
75 op4
= OpLoad(fn
, arg
, offset
=0, mem
=mem
, vl
=vl
)
77 op5
= OpLI(fn
, 0, vl
=vl
)
79 op6
= OpSetCA(fn
, True)
81 op7
= OpBigIntAddSub(fn
, a
, b
, ca
, is_sub
=False, vl
=vl
)
83 op8
= OpStore(fn
, s
, arg
, offset
=0, mem_in
=mem
, vl
=vl
)
86 assigned_registers
= {
87 op0
.out
: GPRRange(start
=3, length
=1),
88 op1
.dest
: GPRRange(start
=3, length
=1),
89 op2
.out
: GlobalMem
.GlobalMem
,
91 op4
.RT
: GPRRange(start
=78, length
=32),
92 op5
.out
: GPRRange(start
=46, length
=32),
94 op7
.out
: GPRRange(start
=14, length
=32),
95 op7
.CA_out
: XERBit
.CA
,
96 op8
.mem_out
: GlobalMem
.GlobalMem
,
97 } # type: dict[SSAVal, RegLoc] | None
100 assigned_registers
= None
102 asm
= generate_assembly(fn
.ops
, assigned_registers
)
103 self
.assertEqual(asm
, [
104 "setvl 0, 0, 32, 0, 1, 1",
108 "sv.adde *14, *78, *46",
113 def test_generate_assembly(self
):
114 self
.tst_generate_assembly()
116 def test_generate_assembly_with_register_allocator(self
):
117 self
.tst_generate_assembly(use_reg_alloc
=True)
120 if __name__
== "__main__":