31884304630b285eb4483b4ac59ac060330620ad
2 from typing
import Callable
4 from bigint_presentation_code
.compiler_ir2
import (GPR_SIZE_IN_BYTES
,
9 from bigint_presentation_code
.register_allocator2
import allocate_registers
10 from bigint_presentation_code
.toom_cook
import ToomCookInstance
, simple_mul
13 class SimpleMul192x192
:
18 self
.lhs_offset
= 48 + self
.dest_offset
19 self
.rhs_offset
= 24 + self
.lhs_offset
20 self
.ptr_in
= fn
.append_new_op(kind
=OpKind
.FuncArgR3
,
21 name
="ptr_in").outputs
[0]
22 setvl3
= fn
.append_new_op(kind
=OpKind
.SetVLI
, immediates
=[3],
23 maxvl
=3, name
="setvl3")
24 load_lhs
= fn
.append_new_op(
25 kind
=OpKind
.SvLd
, immediates
=[self
.lhs_offset
],
26 input_vals
=[self
.ptr_in
, setvl3
.outputs
[0]],
27 name
="load_lhs", maxvl
=3)
28 load_rhs
= fn
.append_new_op(
29 kind
=OpKind
.SvLd
, immediates
=[self
.rhs_offset
],
30 input_vals
=[self
.ptr_in
, setvl3
.outputs
[0]],
31 name
="load_rhs", maxvl
=3)
32 retval
= simple_mul(fn
, load_lhs
.outputs
[0], load_rhs
.outputs
[0])
33 setvl6
= fn
.append_new_op(kind
=OpKind
.SetVLI
, immediates
=[6],
34 maxvl
=6, name
="setvl6")
37 input_vals
=[retval
, self
.ptr_in
, setvl6
.outputs
[0]],
38 immediates
=[self
.dest_offset
], maxvl
=6, name
="store_dest")
41 class TestToomCook(unittest
.TestCase
):
44 def test_toom_2_repr(self
):
45 TOOM_2
= ToomCookInstance
.make_toom_2()
46 # print(repr(repr(TOOM_2)))
49 "ToomCookInstance(lhs_part_count=2, rhs_part_count=2, "
50 "eval_points=(0, 1, POINT_AT_INFINITY), "
52 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
54 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
56 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
57 "poly=EvalOpPoly({0: Fraction(1, 1), 1: Fraction(1, 1)})), "
58 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)}))),"
60 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
62 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
64 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
65 "poly=EvalOpPoly({0: Fraction(1, 1), 1: Fraction(1, 1)})), "
66 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)}))),"
68 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
71 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
73 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
74 "poly=EvalOpPoly({0: Fraction(-1, 1), 1: Fraction(1, 1)})), "
76 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)})), "
78 "0: Fraction(-1, 1), 1: Fraction(1, 1), 2: Fraction(-1, 1)})), "
79 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)}))))"
82 def test_toom_2_5_repr(self
):
83 TOOM_2_5
= ToomCookInstance
.make_toom_2_5()
84 # print(repr(repr(TOOM_2_5)))
87 "ToomCookInstance(lhs_part_count=3, rhs_part_count=2, "
88 "eval_points=(0, 1, -1, POINT_AT_INFINITY), lhs_eval_ops=("
89 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
92 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
93 "rhs=EvalOpInput(lhs=2, rhs=0, "
94 "poly=EvalOpPoly({2: Fraction(1, 1)})), "
95 "poly=EvalOpPoly({0: Fraction(1, 1), 2: Fraction(1, 1)})), "
96 "rhs=EvalOpInput(lhs=1, rhs=0, "
97 "poly=EvalOpPoly({1: Fraction(1, 1)})), "
99 "0: Fraction(1, 1), 1: Fraction(1, 1), 2: Fraction(1, 1)})), "
102 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
103 "rhs=EvalOpInput(lhs=2, rhs=0, "
104 "poly=EvalOpPoly({2: Fraction(1, 1)})), "
105 "poly=EvalOpPoly({0: Fraction(1, 1), 2: Fraction(1, 1)})), "
106 "rhs=EvalOpInput(lhs=1, rhs=0, "
107 "poly=EvalOpPoly({1: Fraction(1, 1)})), poly=EvalOpPoly("
108 "{0: Fraction(1, 1), 1: Fraction(-1, 1), 2: Fraction(1, 1)})), "
109 "EvalOpInput(lhs=2, rhs=0, "
110 "poly=EvalOpPoly({2: Fraction(1, 1)}))), rhs_eval_ops=("
111 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
112 "EvalOpAdd(lhs=EvalOpInput(lhs=0, rhs=0, "
113 "poly=EvalOpPoly({0: Fraction(1, 1)})), rhs="
114 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
115 "poly=EvalOpPoly({0: Fraction(1, 1), 1: Fraction(1, 1)})), "
117 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
118 "rhs=EvalOpInput(lhs=1, rhs=0, "
119 "poly=EvalOpPoly({1: Fraction(1, 1)})), "
120 "poly=EvalOpPoly({0: Fraction(1, 1), 1: Fraction(-1, 1)})), "
121 "EvalOpInput(lhs=1, rhs=0, "
122 "poly=EvalOpPoly({1: Fraction(1, 1)}))), "
124 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
125 "EvalOpSub(lhs=EvalOpExactDiv(lhs=EvalOpSub(lhs="
126 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
127 "rhs=EvalOpInput(lhs=2, rhs=0, "
128 "poly=EvalOpPoly({2: Fraction(1, 1)})), "
129 "poly=EvalOpPoly({1: Fraction(1, 1), 2: Fraction(-1, 1)})), "
131 "poly=EvalOpPoly({1: Fraction(1, 2), 2: Fraction(-1, 2)})), rhs="
132 "EvalOpInput(lhs=3, rhs=0, poly=EvalOpPoly({3: Fraction(1, 1)})), "
134 "{1: Fraction(1, 2), 2: Fraction(-1, 2), 3: Fraction(-1, 1)})), "
135 "EvalOpSub(lhs=EvalOpExactDiv(lhs=EvalOpAdd(lhs="
136 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
138 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)})), "
139 "poly=EvalOpPoly({1: Fraction(1, 1), 2: Fraction(1, 1)})), rhs=2, "
140 "poly=EvalOpPoly({1: Fraction(1, 2), 2: Fraction(1, 2)})), rhs="
141 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
143 "{0: Fraction(-1, 1), 1: Fraction(1, 2), 2: Fraction(1, 2)})), "
144 "EvalOpInput(lhs=3, rhs=0, poly=EvalOpPoly({3: Fraction(1, 1)}))))"
147 def test_reversed_toom_2_5_repr(self
):
148 TOOM_2_5
= ToomCookInstance
.make_toom_2_5().reversed()
149 # print(repr(repr(TOOM_2_5)))
152 "ToomCookInstance(lhs_part_count=2, rhs_part_count=3, "
153 "eval_points=(0, 1, -1, POINT_AT_INFINITY), lhs_eval_ops=("
154 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
156 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
158 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
159 "poly=EvalOpPoly({0: Fraction(1, 1), 1: Fraction(1, 1)})), "
161 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
163 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
164 "poly=EvalOpPoly({0: Fraction(1, 1), 1: Fraction(-1, 1)})), "
165 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)}))),"
167 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
168 "EvalOpAdd(lhs=EvalOpAdd(lhs="
169 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
171 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)})), "
172 "poly=EvalOpPoly({0: Fraction(1, 1), 2: Fraction(1, 1)})), rhs="
173 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
175 "{0: Fraction(1, 1), 1: Fraction(1, 1), 2: Fraction(1, 1)})), "
176 "EvalOpSub(lhs=EvalOpAdd(lhs="
177 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
179 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)})), "
180 "poly=EvalOpPoly({0: Fraction(1, 1), 2: Fraction(1, 1)})), rhs="
181 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
183 "{0: Fraction(1, 1), 1: Fraction(-1, 1), 2: Fraction(1, 1)})), "
184 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)}))),"
186 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
187 "EvalOpSub(lhs=EvalOpExactDiv(lhs=EvalOpSub(lhs="
188 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
190 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)})), "
191 "poly=EvalOpPoly({1: Fraction(1, 1), 2: Fraction(-1, 1)})), "
193 "poly=EvalOpPoly({1: Fraction(1, 2), 2: Fraction(-1, 2)})), rhs="
194 "EvalOpInput(lhs=3, rhs=0, poly=EvalOpPoly({3: Fraction(1, 1)})), "
196 "{1: Fraction(1, 2), 2: Fraction(-1, 2), 3: Fraction(-1, 1)})), "
197 "EvalOpSub(lhs=EvalOpExactDiv(lhs=EvalOpAdd(lhs="
198 "EvalOpInput(lhs=1, rhs=0, poly=EvalOpPoly({1: Fraction(1, 1)})), "
200 "EvalOpInput(lhs=2, rhs=0, poly=EvalOpPoly({2: Fraction(1, 1)})), "
201 "poly=EvalOpPoly({1: Fraction(1, 1), 2: Fraction(1, 1)})), rhs=2, "
202 "poly=EvalOpPoly({1: Fraction(1, 2), 2: Fraction(1, 2)})), rhs="
203 "EvalOpInput(lhs=0, rhs=0, poly=EvalOpPoly({0: Fraction(1, 1)})), "
205 "{0: Fraction(-1, 1), 1: Fraction(1, 2), 2: Fraction(1, 2)})), "
206 "EvalOpInput(lhs=3, rhs=0, poly=EvalOpPoly({3: Fraction(1, 1)}))))"
209 def test_simple_mul_192x192_pre_ra_sim(self
):
210 def create_sim_state(code
):
211 # type: (SimpleMul192x192) -> BaseSimState
212 return PreRASimState(ssa_vals
={}, memory
={})
213 self
.tst_simple_mul_192x192_sim(create_sim_state
)
215 def test_simple_mul_192x192_post_ra_sim(self
):
216 def create_sim_state(code
):
217 # type: (SimpleMul192x192) -> BaseSimState
218 ssa_val_to_loc_map
= allocate_registers(code
.fn
)
219 return PostRASimState(ssa_val_to_loc_map
=ssa_val_to_loc_map
,
220 memory
={}, loc_values
={})
221 self
.tst_simple_mul_192x192_sim(create_sim_state
)
223 def tst_simple_mul_192x192_sim(self
, create_sim_state
):
224 # type: (Callable[[SimpleMul192x192], BaseSimState]) -> None
226 # 0x000191acb262e15b_4c6b5f2b19e1a53e_821a2342132c5b57
227 # * 0x4a37c0567bcbab53_cf1f597598194ae6_208a49071aeec507
229 # int("0x00074736574206e_6f69746163696c70"
230 # "_69746c756d207469_622d3438333e2d32"
231 # "_3931783239312079_7261727469627261", base=0)
232 # == int.from_bytes(b"arbitrary 192x192->384-bit multiplication test",
234 code
= SimpleMul192x192()
235 state
= create_sim_state(code
)
237 dest_ptr
= ptr_in
+ code
.dest_offset
238 lhs_ptr
= ptr_in
+ code
.lhs_offset
239 rhs_ptr
= ptr_in
+ code
.rhs_offset
240 state
[code
.ptr_in
] = ptr_in
,
241 state
.store(lhs_ptr
, 0x821a2342132c5b57)
242 state
.store(lhs_ptr
+ 8, 0x4c6b5f2b19e1a53e)
243 state
.store(lhs_ptr
+ 16, 0x000191acb262e15b)
244 state
.store(rhs_ptr
, 0x208a49071aeec507)
245 state
.store(rhs_ptr
+ 8, 0xcf1f597598194ae6)
246 state
.store(rhs_ptr
+ 16, 0x4a37c0567bcbab53)
248 expected_bytes
= b
"arbitrary 192x192->384-bit multiplication test"
249 OUT_BYTE_COUNT
= 6 * GPR_SIZE_IN_BYTES
250 expected_bytes
= expected_bytes
.ljust(OUT_BYTE_COUNT
, b
'\0')
252 state
.load_byte(dest_ptr
+ i
) for i
in range(OUT_BYTE_COUNT
))
253 self
.assertEqual(out_bytes
, expected_bytes
)
255 def test_simple_mul_192x192_ops(self
):
256 code
= SimpleMul192x192()
258 self
.assertEqual([repr(v
) for v
in fn
.ops
], [
259 "Op(kind=OpKind.FuncArgR3, "
261 "input_uses=(), immediates=[], "
262 "outputs=(<ptr_in.outputs[0]: <I64>>,), "
264 "Op(kind=OpKind.SetVLI, "
266 "input_uses=(), immediates=[3], "
267 "outputs=(<setvl3.outputs[0]: <VL_MAXVL>>,), "
269 "Op(kind=OpKind.SvLd, "
270 "input_vals=[<ptr_in.outputs[0]: <I64>>, "
271 "<setvl3.outputs[0]: <VL_MAXVL>>], "
272 "input_uses=(<load_lhs.input_uses[0]: <I64>>, "
273 "<load_lhs.input_uses[1]: <VL_MAXVL>>), immediates=[48], "
274 "outputs=(<load_lhs.outputs[0]: <I64*3>>,), "
276 "Op(kind=OpKind.SvLd, "
277 "input_vals=[<ptr_in.outputs[0]: <I64>>, "
278 "<setvl3.outputs[0]: <VL_MAXVL>>], "
279 "input_uses=(<load_rhs.input_uses[0]: <I64>>, "
280 "<load_rhs.input_uses[1]: <VL_MAXVL>>), immediates=[72], "
281 "outputs=(<load_rhs.outputs[0]: <I64*3>>,), "
283 "Op(kind=OpKind.SetVLI, "
285 "input_uses=(), immediates=[3], "
286 "outputs=(<rhs_setvl.outputs[0]: <VL_MAXVL>>,), "
288 "Op(kind=OpKind.Spread, "
289 "input_vals=[<load_rhs.outputs[0]: <I64*3>>, "
290 "<rhs_setvl.outputs[0]: <VL_MAXVL>>], "
291 "input_uses=(<rhs_spread.input_uses[0]: <I64*3>>, "
292 "<rhs_spread.input_uses[1]: <VL_MAXVL>>), immediates=[], "
293 "outputs=(<rhs_spread.outputs[0]: <I64>>, "
294 "<rhs_spread.outputs[1]: <I64>>, "
295 "<rhs_spread.outputs[2]: <I64>>), "
296 "name='rhs_spread')",
297 "Op(kind=OpKind.SetVLI, "
299 "input_uses=(), immediates=[3], "
300 "outputs=(<lhs_setvl.outputs[0]: <VL_MAXVL>>,), "
302 "Op(kind=OpKind.LI, "
304 "input_uses=(), immediates=[0], "
305 "outputs=(<zero.outputs[0]: <I64>>,), "
307 "Op(kind=OpKind.SvMAddEDU, "
308 "input_vals=[<load_lhs.outputs[0]: <I64*3>>, "
309 "<rhs_spread.outputs[0]: <I64>>, "
310 "<zero.outputs[0]: <I64>>, "
311 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
312 "input_uses=(<mul0.input_uses[0]: <I64*3>>, "
313 "<mul0.input_uses[1]: <I64>>, "
314 "<mul0.input_uses[2]: <I64>>, "
315 "<mul0.input_uses[3]: <VL_MAXVL>>), immediates=[], "
316 "outputs=(<mul0.outputs[0]: <I64*3>>, "
317 "<mul0.outputs[1]: <I64>>), "
319 "Op(kind=OpKind.Spread, "
320 "input_vals=[<mul0.outputs[0]: <I64*3>>, "
321 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
322 "input_uses=(<mul0_rt_spread.input_uses[0]: <I64*3>>, "
323 "<mul0_rt_spread.input_uses[1]: <VL_MAXVL>>), immediates=[], "
324 "outputs=(<mul0_rt_spread.outputs[0]: <I64>>, "
325 "<mul0_rt_spread.outputs[1]: <I64>>, "
326 "<mul0_rt_spread.outputs[2]: <I64>>), "
327 "name='mul0_rt_spread')",
328 "Op(kind=OpKind.SvMAddEDU, "
329 "input_vals=[<load_lhs.outputs[0]: <I64*3>>, "
330 "<rhs_spread.outputs[1]: <I64>>, "
331 "<zero.outputs[0]: <I64>>, "
332 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
333 "input_uses=(<mul1.input_uses[0]: <I64*3>>, "
334 "<mul1.input_uses[1]: <I64>>, "
335 "<mul1.input_uses[2]: <I64>>, "
336 "<mul1.input_uses[3]: <VL_MAXVL>>), immediates=[], "
337 "outputs=(<mul1.outputs[0]: <I64*3>>, "
338 "<mul1.outputs[1]: <I64>>), "
340 "Op(kind=OpKind.Concat, "
341 "input_vals=[<mul0_rt_spread.outputs[1]: <I64>>, "
342 "<mul0_rt_spread.outputs[2]: <I64>>, "
343 "<mul0.outputs[1]: <I64>>, "
344 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
345 "input_uses=(<add1_rb_concat.input_uses[0]: <I64>>, "
346 "<add1_rb_concat.input_uses[1]: <I64>>, "
347 "<add1_rb_concat.input_uses[2]: <I64>>, "
348 "<add1_rb_concat.input_uses[3]: <VL_MAXVL>>), immediates=[], "
349 "outputs=(<add1_rb_concat.outputs[0]: <I64*3>>,), "
350 "name='add1_rb_concat')",
351 "Op(kind=OpKind.ClearCA, "
353 "input_uses=(), immediates=[], "
354 "outputs=(<clear_ca1.outputs[0]: <CA>>,), "
356 "Op(kind=OpKind.SvAddE, "
357 "input_vals=[<mul1.outputs[0]: <I64*3>>, "
358 "<add1_rb_concat.outputs[0]: <I64*3>>, "
359 "<clear_ca1.outputs[0]: <CA>>, "
360 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
361 "input_uses=(<add1.input_uses[0]: <I64*3>>, "
362 "<add1.input_uses[1]: <I64*3>>, "
363 "<add1.input_uses[2]: <CA>>, "
364 "<add1.input_uses[3]: <VL_MAXVL>>), immediates=[], "
365 "outputs=(<add1.outputs[0]: <I64*3>>, "
366 "<add1.outputs[1]: <CA>>), "
368 "Op(kind=OpKind.Spread, "
369 "input_vals=[<add1.outputs[0]: <I64*3>>, "
370 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
371 "input_uses=(<add1_rt_spread.input_uses[0]: <I64*3>>, "
372 "<add1_rt_spread.input_uses[1]: <VL_MAXVL>>), immediates=[], "
373 "outputs=(<add1_rt_spread.outputs[0]: <I64>>, "
374 "<add1_rt_spread.outputs[1]: <I64>>, "
375 "<add1_rt_spread.outputs[2]: <I64>>), "
376 "name='add1_rt_spread')",
377 "Op(kind=OpKind.AddZE, "
378 "input_vals=[<mul1.outputs[1]: <I64>>, "
379 "<add1.outputs[1]: <CA>>], "
380 "input_uses=(<add_hi1.input_uses[0]: <I64>>, "
381 "<add_hi1.input_uses[1]: <CA>>), immediates=[], "
382 "outputs=(<add_hi1.outputs[0]: <I64>>, "
383 "<add_hi1.outputs[1]: <CA>>), "
385 "Op(kind=OpKind.SvMAddEDU, "
386 "input_vals=[<load_lhs.outputs[0]: <I64*3>>, "
387 "<rhs_spread.outputs[2]: <I64>>, "
388 "<zero.outputs[0]: <I64>>, "
389 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
390 "input_uses=(<mul2.input_uses[0]: <I64*3>>, "
391 "<mul2.input_uses[1]: <I64>>, "
392 "<mul2.input_uses[2]: <I64>>, "
393 "<mul2.input_uses[3]: <VL_MAXVL>>), immediates=[], "
394 "outputs=(<mul2.outputs[0]: <I64*3>>, "
395 "<mul2.outputs[1]: <I64>>), "
397 "Op(kind=OpKind.Concat, "
398 "input_vals=[<add1_rt_spread.outputs[1]: <I64>>, "
399 "<add1_rt_spread.outputs[2]: <I64>>, "
400 "<add_hi1.outputs[0]: <I64>>, "
401 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
402 "input_uses=(<add2_rb_concat.input_uses[0]: <I64>>, "
403 "<add2_rb_concat.input_uses[1]: <I64>>, "
404 "<add2_rb_concat.input_uses[2]: <I64>>, "
405 "<add2_rb_concat.input_uses[3]: <VL_MAXVL>>), immediates=[], "
406 "outputs=(<add2_rb_concat.outputs[0]: <I64*3>>,), "
407 "name='add2_rb_concat')",
408 "Op(kind=OpKind.ClearCA, "
410 "input_uses=(), immediates=[], "
411 "outputs=(<clear_ca2.outputs[0]: <CA>>,), "
413 "Op(kind=OpKind.SvAddE, "
414 "input_vals=[<mul2.outputs[0]: <I64*3>>, "
415 "<add2_rb_concat.outputs[0]: <I64*3>>, "
416 "<clear_ca2.outputs[0]: <CA>>, "
417 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
418 "input_uses=(<add2.input_uses[0]: <I64*3>>, "
419 "<add2.input_uses[1]: <I64*3>>, "
420 "<add2.input_uses[2]: <CA>>, "
421 "<add2.input_uses[3]: <VL_MAXVL>>), immediates=[], "
422 "outputs=(<add2.outputs[0]: <I64*3>>, "
423 "<add2.outputs[1]: <CA>>), "
425 "Op(kind=OpKind.Spread, "
426 "input_vals=[<add2.outputs[0]: <I64*3>>, "
427 "<lhs_setvl.outputs[0]: <VL_MAXVL>>], "
428 "input_uses=(<add2_rt_spread.input_uses[0]: <I64*3>>, "
429 "<add2_rt_spread.input_uses[1]: <VL_MAXVL>>), immediates=[], "
430 "outputs=(<add2_rt_spread.outputs[0]: <I64>>, "
431 "<add2_rt_spread.outputs[1]: <I64>>, "
432 "<add2_rt_spread.outputs[2]: <I64>>), "
433 "name='add2_rt_spread')",
434 "Op(kind=OpKind.AddZE, "
435 "input_vals=[<mul2.outputs[1]: <I64>>, "
436 "<add2.outputs[1]: <CA>>], "
437 "input_uses=(<add_hi2.input_uses[0]: <I64>>, "
438 "<add_hi2.input_uses[1]: <CA>>), immediates=[], "
439 "outputs=(<add_hi2.outputs[0]: <I64>>, "
440 "<add_hi2.outputs[1]: <CA>>), "
442 "Op(kind=OpKind.SetVLI, "
444 "input_uses=(), immediates=[6], "
445 "outputs=(<retval_setvl.outputs[0]: <VL_MAXVL>>,), "
446 "name='retval_setvl')",
447 "Op(kind=OpKind.Concat, "
448 "input_vals=[<mul0_rt_spread.outputs[0]: <I64>>, "
449 "<add1_rt_spread.outputs[0]: <I64>>, "
450 "<add2_rt_spread.outputs[0]: <I64>>, "
451 "<add2_rt_spread.outputs[1]: <I64>>, "
452 "<add2_rt_spread.outputs[2]: <I64>>, "
453 "<add_hi2.outputs[0]: <I64>>, "
454 "<retval_setvl.outputs[0]: <VL_MAXVL>>], "
455 "input_uses=(<concat_retval.input_uses[0]: <I64>>, "
456 "<concat_retval.input_uses[1]: <I64>>, "
457 "<concat_retval.input_uses[2]: <I64>>, "
458 "<concat_retval.input_uses[3]: <I64>>, "
459 "<concat_retval.input_uses[4]: <I64>>, "
460 "<concat_retval.input_uses[5]: <I64>>, "
461 "<concat_retval.input_uses[6]: <VL_MAXVL>>), immediates=[], "
462 "outputs=(<concat_retval.outputs[0]: <I64*6>>,), "
463 "name='concat_retval')",
464 "Op(kind=OpKind.SetVLI, "
466 "input_uses=(), immediates=[6], "
467 "outputs=(<setvl6.outputs[0]: <VL_MAXVL>>,), "
469 "Op(kind=OpKind.SvStd, "
470 "input_vals=[<concat_retval.outputs[0]: <I64*6>>, "
471 "<ptr_in.outputs[0]: <I64>>, "
472 "<setvl6.outputs[0]: <VL_MAXVL>>], "
473 "input_uses=(<store_dest.input_uses[0]: <I64*6>>, "
474 "<store_dest.input_uses[1]: <I64>>, "
475 "<store_dest.input_uses[2]: <VL_MAXVL>>), immediates=[0], "
477 "name='store_dest')",
480 def test_simple_mul_192x192_reg_alloc(self
):
481 code
= SimpleMul192x192()
483 assigned_registers
= allocate_registers(fn
)
485 repr(assigned_registers
), "{"
486 "<store_dest.inp2.setvl.outputs[0]: <VL_MAXVL>>: "
487 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
488 "<store_dest.inp1.copy.outputs[0]: <I64>>: "
489 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
490 "<store_dest.inp0.copy.outputs[0]: <I64*6>>: "
491 "Loc(kind=LocKind.GPR, start=4, reg_len=6), "
492 "<store_dest.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
493 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
494 "<setvl6.outputs[0]: <VL_MAXVL>>: "
495 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
496 "<concat_retval.out0.copy.outputs[0]: <I64*6>>: "
497 "Loc(kind=LocKind.GPR, start=3, reg_len=6), "
498 "<concat_retval.out0.setvl.outputs[0]: <VL_MAXVL>>: "
499 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
500 "<concat_retval.outputs[0]: <I64*6>>: "
501 "Loc(kind=LocKind.GPR, start=3, reg_len=6), "
502 "<concat_retval.inp0.copy.outputs[0]: <I64>>: "
503 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
504 "<concat_retval.inp1.copy.outputs[0]: <I64>>: "
505 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
506 "<concat_retval.inp2.copy.outputs[0]: <I64>>: "
507 "Loc(kind=LocKind.GPR, start=5, reg_len=1), "
508 "<concat_retval.inp3.copy.outputs[0]: <I64>>: "
509 "Loc(kind=LocKind.GPR, start=6, reg_len=1), "
510 "<concat_retval.inp4.copy.outputs[0]: <I64>>: "
511 "Loc(kind=LocKind.GPR, start=7, reg_len=1), "
512 "<concat_retval.inp5.copy.outputs[0]: <I64>>: "
513 "Loc(kind=LocKind.GPR, start=8, reg_len=1), "
514 "<concat_retval.inp6.setvl.outputs[0]: <VL_MAXVL>>: "
515 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
516 "<retval_setvl.outputs[0]: <VL_MAXVL>>: "
517 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
518 "<add_hi2.out0.copy.outputs[0]: <I64>>: "
519 "Loc(kind=LocKind.GPR, start=9, reg_len=1), "
520 "<clear_ca2.outputs[0]: <CA>>: "
521 "Loc(kind=LocKind.CA, start=0, reg_len=1), "
522 "<add2.outputs[1]: <CA>>: "
523 "Loc(kind=LocKind.CA, start=0, reg_len=1), "
524 "<add_hi2.outputs[1]: <CA>>: "
525 "Loc(kind=LocKind.CA, start=0, reg_len=1), "
526 "<add_hi2.outputs[0]: <I64>>: "
527 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
528 "<add_hi2.inp0.copy.outputs[0]: <I64>>: "
529 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
530 "<add2_rt_spread.out2.copy.outputs[0]: <I64>>: "
531 "Loc(kind=LocKind.GPR, start=10, reg_len=1), "
532 "<add2_rt_spread.out1.copy.outputs[0]: <I64>>: "
533 "Loc(kind=LocKind.GPR, start=11, reg_len=1), "
534 "<add2_rt_spread.out0.copy.outputs[0]: <I64>>: "
535 "Loc(kind=LocKind.GPR, start=12, reg_len=1), "
536 "<add2_rt_spread.outputs[0]: <I64>>: "
537 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
538 "<add2_rt_spread.outputs[1]: <I64>>: "
539 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
540 "<add2_rt_spread.outputs[2]: <I64>>: "
541 "Loc(kind=LocKind.GPR, start=5, reg_len=1), "
542 "<add2_rt_spread.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
543 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
544 "<add2_rt_spread.inp0.copy.outputs[0]: <I64*3>>: "
545 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
546 "<add2_rt_spread.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
547 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
548 "<add2.out0.copy.outputs[0]: <I64*3>>: "
549 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
550 "<add2.out0.setvl.outputs[0]: <VL_MAXVL>>: "
551 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
552 "<add2.outputs[0]: <I64*3>>: "
553 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
554 "<add2.inp3.setvl.outputs[0]: <VL_MAXVL>>: "
555 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
556 "<add2.inp1.copy.outputs[0]: <I64*3>>: "
557 "Loc(kind=LocKind.GPR, start=6, reg_len=3), "
558 "<add2.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
559 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
560 "<add2.inp0.copy.outputs[0]: <I64*3>>: "
561 "Loc(kind=LocKind.GPR, start=9, reg_len=3), "
562 "<add2.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
563 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
564 "<add2_rb_concat.out0.copy.outputs[0]: <I64*3>>: "
565 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
566 "<add2_rb_concat.out0.setvl.outputs[0]: <VL_MAXVL>>: "
567 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
568 "<add2_rb_concat.outputs[0]: <I64*3>>: "
569 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
570 "<add2_rb_concat.inp0.copy.outputs[0]: <I64>>: "
571 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
572 "<add2_rb_concat.inp1.copy.outputs[0]: <I64>>: "
573 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
574 "<add2_rb_concat.inp2.copy.outputs[0]: <I64>>: "
575 "Loc(kind=LocKind.GPR, start=5, reg_len=1), "
576 "<add2_rb_concat.inp3.setvl.outputs[0]: <VL_MAXVL>>: "
577 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
578 "<mul2.out1.copy.outputs[0]: <I64>>: "
579 "Loc(kind=LocKind.GPR, start=14, reg_len=1), "
580 "<mul2.out0.copy.outputs[0]: <I64*3>>: "
581 "Loc(kind=LocKind.GPR, start=6, reg_len=3), "
582 "<mul2.out0.setvl.outputs[0]: <VL_MAXVL>>: "
583 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
584 "<mul2.inp2.copy.outputs[0]: <I64>>: "
585 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
586 "<mul2.outputs[1]: <I64>>: "
587 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
588 "<mul2.outputs[0]: <I64*3>>: "
589 "Loc(kind=LocKind.GPR, start=4, reg_len=3), "
590 "<mul2.inp3.setvl.outputs[0]: <VL_MAXVL>>: "
591 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
592 "<mul2.inp1.copy.outputs[0]: <I64>>: "
593 "Loc(kind=LocKind.GPR, start=7, reg_len=1), "
594 "<mul2.inp0.copy.outputs[0]: <I64*3>>: "
595 "Loc(kind=LocKind.GPR, start=8, reg_len=3), "
596 "<mul2.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
597 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
598 "<add_hi1.out0.copy.outputs[0]: <I64>>: "
599 "Loc(kind=LocKind.GPR, start=11, reg_len=1), "
600 "<clear_ca1.outputs[0]: <CA>>: "
601 "Loc(kind=LocKind.CA, start=0, reg_len=1), "
602 "<add1.outputs[1]: <CA>>: "
603 "Loc(kind=LocKind.CA, start=0, reg_len=1), "
604 "<add_hi1.outputs[1]: <CA>>: "
605 "Loc(kind=LocKind.CA, start=0, reg_len=1), "
606 "<add_hi1.outputs[0]: <I64>>: "
607 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
608 "<add_hi1.inp0.copy.outputs[0]: <I64>>: "
609 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
610 "<add1_rt_spread.out2.copy.outputs[0]: <I64>>: "
611 "Loc(kind=LocKind.GPR, start=12, reg_len=1), "
612 "<add1_rt_spread.out1.copy.outputs[0]: <I64>>: "
613 "Loc(kind=LocKind.GPR, start=15, reg_len=1), "
614 "<add1_rt_spread.out0.copy.outputs[0]: <I64>>: "
615 "Loc(kind=LocKind.GPR, start=16, reg_len=1), "
616 "<add1_rt_spread.outputs[0]: <I64>>: "
617 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
618 "<add1_rt_spread.outputs[1]: <I64>>: "
619 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
620 "<add1_rt_spread.outputs[2]: <I64>>: "
621 "Loc(kind=LocKind.GPR, start=5, reg_len=1), "
622 "<add1_rt_spread.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
623 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
624 "<add1_rt_spread.inp0.copy.outputs[0]: <I64*3>>: "
625 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
626 "<add1_rt_spread.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
627 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
628 "<add1.out0.copy.outputs[0]: <I64*3>>: "
629 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
630 "<add1.out0.setvl.outputs[0]: <VL_MAXVL>>: "
631 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
632 "<add1.outputs[0]: <I64*3>>: "
633 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
634 "<add1.inp3.setvl.outputs[0]: <VL_MAXVL>>: "
635 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
636 "<add1.inp1.copy.outputs[0]: <I64*3>>: "
637 "Loc(kind=LocKind.GPR, start=6, reg_len=3), "
638 "<add1.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
639 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
640 "<add1.inp0.copy.outputs[0]: <I64*3>>: "
641 "Loc(kind=LocKind.GPR, start=9, reg_len=3), "
642 "<add1.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
643 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
644 "<add1_rb_concat.out0.copy.outputs[0]: <I64*3>>: "
645 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
646 "<add1_rb_concat.out0.setvl.outputs[0]: <VL_MAXVL>>: "
647 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
648 "<add1_rb_concat.outputs[0]: <I64*3>>: "
649 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
650 "<add1_rb_concat.inp0.copy.outputs[0]: <I64>>: "
651 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
652 "<add1_rb_concat.inp1.copy.outputs[0]: <I64>>: "
653 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
654 "<add1_rb_concat.inp2.copy.outputs[0]: <I64>>: "
655 "Loc(kind=LocKind.GPR, start=5, reg_len=1), "
656 "<add1_rb_concat.inp3.setvl.outputs[0]: <VL_MAXVL>>: "
657 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
658 "<mul1.out1.copy.outputs[0]: <I64>>: "
659 "Loc(kind=LocKind.GPR, start=14, reg_len=1), "
660 "<mul1.out0.copy.outputs[0]: <I64*3>>: "
661 "Loc(kind=LocKind.GPR, start=6, reg_len=3), "
662 "<mul1.out0.setvl.outputs[0]: <VL_MAXVL>>: "
663 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
664 "<mul1.inp2.copy.outputs[0]: <I64>>: "
665 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
666 "<mul1.outputs[1]: <I64>>: "
667 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
668 "<mul1.outputs[0]: <I64*3>>: "
669 "Loc(kind=LocKind.GPR, start=4, reg_len=3), "
670 "<mul1.inp3.setvl.outputs[0]: <VL_MAXVL>>: "
671 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
672 "<mul1.inp1.copy.outputs[0]: <I64>>: "
673 "Loc(kind=LocKind.GPR, start=7, reg_len=1), "
674 "<mul1.inp0.copy.outputs[0]: <I64*3>>: "
675 "Loc(kind=LocKind.GPR, start=8, reg_len=3), "
676 "<mul1.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
677 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
678 "<mul0_rt_spread.out2.copy.outputs[0]: <I64>>: "
679 "Loc(kind=LocKind.GPR, start=11, reg_len=1), "
680 "<mul0_rt_spread.out1.copy.outputs[0]: <I64>>: "
681 "Loc(kind=LocKind.GPR, start=12, reg_len=1), "
682 "<mul0_rt_spread.out0.copy.outputs[0]: <I64>>: "
683 "Loc(kind=LocKind.GPR, start=17, reg_len=1), "
684 "<mul0_rt_spread.outputs[0]: <I64>>: "
685 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
686 "<mul0_rt_spread.outputs[1]: <I64>>: "
687 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
688 "<mul0_rt_spread.outputs[2]: <I64>>: "
689 "Loc(kind=LocKind.GPR, start=5, reg_len=1), "
690 "<mul0_rt_spread.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
691 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
692 "<mul0_rt_spread.inp0.copy.outputs[0]: <I64*3>>: "
693 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
694 "<mul0_rt_spread.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
695 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
696 "<mul0.out1.copy.outputs[0]: <I64>>: "
697 "Loc(kind=LocKind.GPR, start=15, reg_len=1), "
698 "<mul0.out0.copy.outputs[0]: <I64*3>>: "
699 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
700 "<mul0.out0.setvl.outputs[0]: <VL_MAXVL>>: "
701 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
702 "<mul0.inp2.copy.outputs[0]: <I64>>: "
703 "Loc(kind=LocKind.GPR, start=6, reg_len=1), "
704 "<mul0.outputs[1]: <I64>>: "
705 "Loc(kind=LocKind.GPR, start=6, reg_len=1), "
706 "<mul0.outputs[0]: <I64*3>>: "
707 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
708 "<mul0.inp3.setvl.outputs[0]: <VL_MAXVL>>: "
709 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
710 "<mul0.inp1.copy.outputs[0]: <I64>>: "
711 "Loc(kind=LocKind.GPR, start=7, reg_len=1), "
712 "<mul0.inp0.copy.outputs[0]: <I64*3>>: "
713 "Loc(kind=LocKind.GPR, start=8, reg_len=3), "
714 "<mul0.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
715 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
716 "<zero.out0.copy.outputs[0]: <I64>>: "
717 "Loc(kind=LocKind.GPR, start=18, reg_len=1), "
718 "<zero.outputs[0]: <I64>>: "
719 "Loc(kind=LocKind.GPR, start=3, reg_len=1), "
720 "<lhs_setvl.outputs[0]: <VL_MAXVL>>: "
721 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
722 "<rhs_spread.out2.copy.outputs[0]: <I64>>: "
723 "Loc(kind=LocKind.GPR, start=19, reg_len=1), "
724 "<rhs_spread.out1.copy.outputs[0]: <I64>>: "
725 "Loc(kind=LocKind.GPR, start=14, reg_len=1), "
726 "<rhs_spread.out0.copy.outputs[0]: <I64>>: "
727 "Loc(kind=LocKind.GPR, start=4, reg_len=1), "
728 "<rhs_spread.outputs[0]: <I64>>: "
729 "Loc(kind=LocKind.GPR, start=5, reg_len=1), "
730 "<rhs_spread.outputs[1]: <I64>>: "
731 "Loc(kind=LocKind.GPR, start=6, reg_len=1), "
732 "<rhs_spread.outputs[2]: <I64>>: "
733 "Loc(kind=LocKind.GPR, start=7, reg_len=1), "
734 "<rhs_spread.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
735 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
736 "<rhs_spread.inp0.copy.outputs[0]: <I64*3>>: "
737 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
738 "<rhs_spread.inp0.setvl.outputs[0]: <VL_MAXVL>>: "
739 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
740 "<rhs_setvl.outputs[0]: <VL_MAXVL>>: "
741 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
742 "<load_rhs.out0.copy.outputs[0]: <I64*3>>: "
743 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
744 "<load_rhs.out0.setvl.outputs[0]: <VL_MAXVL>>: "
745 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
746 "<load_rhs.outputs[0]: <I64*3>>: "
747 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
748 "<load_rhs.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
749 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
750 "<load_rhs.inp0.copy.outputs[0]: <I64>>: "
751 "Loc(kind=LocKind.GPR, start=6, reg_len=1), "
752 "<load_lhs.out0.copy.outputs[0]: <I64*3>>: "
753 "Loc(kind=LocKind.GPR, start=20, reg_len=3), "
754 "<load_lhs.out0.setvl.outputs[0]: <VL_MAXVL>>: "
755 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
756 "<load_lhs.outputs[0]: <I64*3>>: "
757 "Loc(kind=LocKind.GPR, start=3, reg_len=3), "
758 "<load_lhs.inp1.setvl.outputs[0]: <VL_MAXVL>>: "
759 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
760 "<load_lhs.inp0.copy.outputs[0]: <I64>>: "
761 "Loc(kind=LocKind.GPR, start=6, reg_len=1), "
762 "<setvl3.outputs[0]: <VL_MAXVL>>: "
763 "Loc(kind=LocKind.VL_MAXVL, start=0, reg_len=1), "
764 "<ptr_in.out0.copy.outputs[0]: <I64>>: "
765 "Loc(kind=LocKind.GPR, start=23, reg_len=1), "
766 "<ptr_in.outputs[0]: <I64>>: "
767 "Loc(kind=LocKind.GPR, start=3, reg_len=1)"
770 def test_simple_mul_192x192_asm(self
):
771 code
= SimpleMul192x192()
773 assigned_registers
= allocate_registers(fn
)
774 gen_asm_state
= GenAsmState(assigned_registers
)
775 fn
.gen_asm(gen_asm_state
)
776 self
.assertEqual(gen_asm_state
.output
, [
778 'setvl 0, 0, 3, 0, 1, 1',
780 'setvl 0, 0, 3, 0, 1, 1',
782 'setvl 0, 0, 3, 0, 1, 1',
785 'setvl 0, 0, 3, 0, 1, 1',
787 'setvl 0, 0, 3, 0, 1, 1',
788 'setvl 0, 0, 3, 0, 1, 1',
789 'setvl 0, 0, 3, 0, 1, 1',
790 'setvl 0, 0, 3, 0, 1, 1',
791 'sv.or/mrr *5, *3, *3',
795 'setvl 0, 0, 3, 0, 1, 1',
798 'setvl 0, 0, 3, 0, 1, 1',
799 'sv.or *8, *20, *20',
802 'setvl 0, 0, 3, 0, 1, 1',
803 'sv.maddedu *3, *8, 7, 6',
804 'setvl 0, 0, 3, 0, 1, 1',
806 'setvl 0, 0, 3, 0, 1, 1',
807 'setvl 0, 0, 3, 0, 1, 1',
811 'setvl 0, 0, 3, 0, 1, 1',
812 'sv.or *8, *20, *20',
815 'setvl 0, 0, 3, 0, 1, 1',
816 'sv.maddedu *4, *8, 7, 3',
817 'setvl 0, 0, 3, 0, 1, 1',
818 'sv.or/mrr *6, *4, *4',
823 'setvl 0, 0, 3, 0, 1, 1',
824 'setvl 0, 0, 3, 0, 1, 1',
826 'setvl 0, 0, 3, 0, 1, 1',
828 'setvl 0, 0, 3, 0, 1, 1',
830 'setvl 0, 0, 3, 0, 1, 1',
831 'sv.adde *3, *9, *6',
832 'setvl 0, 0, 3, 0, 1, 1',
833 'setvl 0, 0, 3, 0, 1, 1',
834 'setvl 0, 0, 3, 0, 1, 1',
841 'setvl 0, 0, 3, 0, 1, 1',
842 'sv.or *8, *20, *20',
845 'setvl 0, 0, 3, 0, 1, 1',
846 'sv.maddedu *4, *8, 7, 3',
847 'setvl 0, 0, 3, 0, 1, 1',
848 'sv.or/mrr *6, *4, *4',
853 'setvl 0, 0, 3, 0, 1, 1',
854 'setvl 0, 0, 3, 0, 1, 1',
856 'setvl 0, 0, 3, 0, 1, 1',
858 'setvl 0, 0, 3, 0, 1, 1',
860 'setvl 0, 0, 3, 0, 1, 1',
861 'sv.adde *3, *9, *6',
862 'setvl 0, 0, 3, 0, 1, 1',
863 'setvl 0, 0, 3, 0, 1, 1',
864 'setvl 0, 0, 3, 0, 1, 1',
871 'setvl 0, 0, 6, 0, 1, 1',
878 'setvl 0, 0, 6, 0, 1, 1',
879 'setvl 0, 0, 6, 0, 1, 1',
880 'setvl 0, 0, 6, 0, 1, 1',
881 'setvl 0, 0, 6, 0, 1, 1',
882 'sv.or/mrr *4, *3, *3',
884 'setvl 0, 0, 6, 0, 1, 1',
889 if __name__
== "__main__":