source: trunk/lib_ir/gen/gen.py @ 4296

Last change on this file since 4296 was 4296, checked in by linmengl, 5 years ago

add tests for long shift right and dslli

File size: 4.0 KB
Line 
1# Use Jinja2 template to avoid tiny template strings in this file
2# Jinja2 allows enbedded python logic in template file.
3
4from jinja2 import Template, Environment, FileSystemLoader
5import impl_data
6
7TestTemplate    = "test_llc.pytemplate.cpp"
8TestOutput      = "test_llc.cpp"
9LLTemplate      = "llc_func.pytemplate.ll"
10LLOutput        = "llc_func.ll"
11FuncTemplate    = "ParabixGeneratedFuncs.pytemplate.h"
12FuncOutput      = "ParabixGeneratedFuncs.h"
13
14FunctionListI1 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt"]
15FunctionListI2 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt", "vsll", "vsrl", "vsra"]
16FunctionListI4 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt", "vsll", "vsrl", "vsra"]
17FunctionListI8 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt", "vsll", "vsrl", "vsra"]
18
19LongShiftAmount128 = [1,3,5,63,64,65,126,127, 8,16,24,32,56,120]
20LongShiftAmount256 = [1,3,5,63,64,65,127,128,129,191,192,193,254,255]
21
22FW = 2
23
24def C(name):
25    return "{name}_{fw}".format(name=name, fw=FW)
26
27def CXX(name):
28    if name in ["vsll", "vsrl", "vsra"]:
29        return "simd<{fw}>::{name}i".format(fw=FW, name=name[1:])
30    return "simd<{fw}>::{name}".format(fw=FW, name=name)
31
32def OP(name):
33    if name == "mult":
34        return "mul"
35    if name in ["eq", "ult", "ugt"]:
36        return "icmp " + name
37    if name in ["lt", "gt"]:
38        return "icmp s" + name
39    if name == "vsll":
40        return "shl"
41    if name in ["vsrl", "vsra"]:
42        return name[-1:] + "shr"
43
44    return name
45
46def FLAG(name):
47    if name in ["vsll", "vsrl", "vsra"]:
48        return "shifting"
49    return ""
50
51#Get all v64i2 names
52FunctionNamesI2 = [{"c": C(name), "cxx": CXX(name), "op": OP(name),
53                  "flag": FLAG(name), "fw": FW} for name in FunctionListI2]
54FW = 4
55FunctionNamesI4 = [{"c": C(name), "cxx": CXX(name), "op": OP(name),
56                    "flag": FLAG(name), "fw": FW} for name in FunctionListI4]
57FW = 8
58FunctionNamesI8 = [{"c": C(name), "cxx": CXX(name), "op": OP(name),
59                    "flag": FLAG(name), "fw": FW} for name in FunctionListI8]
60FW = 1
61FunctionNamesI1 = [{"c": C(name), "cxx": CXX(name), "op": OP(name),
62                    "flag": FLAG(name), "fw": FW} for name in FunctionListI1]
63
64#configuring Jinja2
65env = Environment(loader=FileSystemLoader(['.', 'gen/', '../../gen']),
66                  trim_blocks=True,
67                  lstrip_blocks=True)
68
69def fillTemplate(template, output, params):
70    content = env.get_template(template).render(params)
71    with open(output, 'w') as f:
72        f.write(content)
73
74def genTestFile():
75    fillTemplate(template=TestTemplate, output=TestOutput,
76                 params=dict(HeaderComment = "AUTO GENERATED FILE",
77                             FunctionNamesI1 = FunctionNamesI1,
78                             FunctionNamesI2 = FunctionNamesI2,
79                             FunctionNamesI4 = FunctionNamesI4,
80                             FunctionNamesI8 = FunctionNamesI8,
81                             LongShiftAmount128 = LongShiftAmount128,
82                             LongShiftAmount256 = LongShiftAmount256,
83                             ))
84
85def genLLFile():
86    fillTemplate(template=LLTemplate, output=LLOutput,
87                 params=dict(FunctionNamesI2 = FunctionNamesI2,
88                             FunctionNamesI4 = FunctionNamesI4,
89                             FunctionNamesI8 = FunctionNamesI8,
90                             FunctionNamesI1 = FunctionNamesI1,
91                             LongShiftAmount128 = LongShiftAmount128,
92                             LongShiftAmount256 = LongShiftAmount256,
93                             ))
94
95def genFuncFile():
96    fillTemplate(template=FuncTemplate, output=FuncOutput,
97                 params=dict(HeaderComment = "AUTO GENERATED FILE",
98                             FunctionNames = FunctionNamesI2,
99                             Implement = impl_data.getImplements()))
100    # NEED to copy manually.
101    # mv ParabixGeneratedFuncs.h ~/llvm_suit/llvm_git/lib/Target/X86/
102
103if __name__ == '__main__':
104    genTestFile()
105    genLLFile()
106    genFuncFile()
107
Note: See TracBrowser for help on using the repository browser.