-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathisel_tester.py
executable file
·55 lines (42 loc) · 1.45 KB
/
isel_tester.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/env python3
"""Testing helper for table driven code selection"""
from BE.CpuX64 import symbolic
from BE.Base import serialize
from BE.Base import ir
from BE.CodeGenX64 import isel_tab
from BE.CodeGenX64 import regs
from typing import Any
import sys
def OpToStr(op: Any) -> str:
return str(op)
def OpTypeStr(op: Any) -> str:
if isinstance(op, ir.Reg):
return op.kind.name
elif isinstance(op, ir.Const):
return op.kind.name
else:
return "_"
def HandleIns(ins: ir.Ins, ctx: regs.EmitContext):
print("INS: " + serialize.InsRenderToAsm(
ins).strip() + f" [{' '.join(OpTypeStr(o) for o in ins.operands)}]")
pattern = isel_tab.FindMatchingPattern(ins)
assert pattern
print(
f"PAT: reg:[{' '.join(a.name for a in pattern.type_constraints)}] "
f"op:[{' '.join(a.name for a in pattern.op_curbs)}]")
for tmpl in pattern.emit:
x64ins = tmpl.MakeInsFromTmpl(ins, ctx)
name, ops = symbolic.InsSymbolize(x64ins, True)
print(f" {name} {' '.join(ops)}")
def Translate(fin):
unit = serialize.UnitParseFromAsm(fin, cpu_regs=regs.CPU_REGS_MAP)
for fun in unit.funs:
ctx = regs.EmitContext(0, 0, 0)
ctx.scratch_cpu_reg = regs.CPU_REGS_MAP["rax"]
fun.FinalizeStackSlots()
for bbl in fun.bbls:
for ins in bbl.inss:
print()
HandleIns(ins, ctx)
if __name__ == "__main__":
Translate(sys.stdin)