source: trunk/lib_ir/gen/impl_data.py @ 3981

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

more testings done, on v64i2 add/sub/mul/eq/lt/gt/ult/ugt/vsll/vsrl/vsra

File size: 3.0 KB
Line 
1Implement = {
2
3"add_2": r'''
4    tmp = simd_xor(arg1, arg2)
5    return simd_ifh(1, simd_himask(fw), simd_xor(tmp, simd_slli(curRegSize, 1, simd_and(arg1, arg2))), tmp)
6''',
7
8"sub_2": r'''
9    tmp = simd_xor(arg1, arg2)
10    return simd_ifh(1, simd_himask(fw), simd_xor(tmp, simd_slli(curRegSize, 1, simd_and(simd_not(arg1), arg2))), tmp)''',
11
12"mult_2": r'''
13    tmp1 = simd_slli(curRegSize, 1, arg1)
14    tmp2 = simd_slli(curRegSize, 1, arg2)
15    return simd_ifh(1, simd_himask(fw), simd_or(simd_and(tmp1, simd_and(arg2, simd_or(simd_not(arg1), simd_not(tmp2)))), simd_and(arg1, simd_and(tmp2, simd_or(simd_not(tmp1), simd_not(arg2))))), simd_and(arg1, arg2))''',
16
17"eq_2": r'''
18    tmp = simd_xor(arg1, arg2)
19    tmpAns = simd_and(simd_not(simd_slli(curRegSize, 1, tmp)), simd_not(tmp))
20    return simd_ifh(1, simd_himask(fw), tmpAns, simd_srli(curRegSize, 1, tmpAns))''',
21
22"gt_2": r'''
23    tmp = simd_not(arg1)
24    tmpAns = simd_or(simd_and(tmp, arg2), simd_and(simd_slli(curRegSize, 1, simd_and(arg1, simd_not(arg2))), simd_or(tmp, arg2)))
25    return simd_ifh(1, simd_himask(fw), tmpAns, simd_srli(curRegSize, 1, tmpAns))''',
26
27"ugt_2": r'''
28    tmp = simd_not(arg2)
29    tmpAns = simd_or(simd_and(arg1, tmp), simd_and(simd_slli(curRegSize, 1, simd_and(arg1, tmp)), simd_or(arg1, tmp)))
30    return simd_ifh(1, simd_himask(fw), tmpAns, simd_srli(curRegSize, 1, tmpAns))''',
31
32"lt_2": r'''
33    tmp = simd_not(arg2)
34    tmpAns = simd_or(simd_and(arg1, tmp), simd_and(simd_slli(curRegSize, 1, simd_and(simd_not(arg1), arg2)), simd_or(arg1, tmp)))
35    return simd_ifh(1, simd_himask(fw), tmpAns, simd_srli(curRegSize, 1, tmpAns))''',
36
37"ult_2": r'''
38    tmp = simd_not(arg1)
39    tmpAns = simd_or(simd_and(tmp, arg2), simd_and(simd_slli(curRegSize, 1, simd_and(tmp, arg2)), simd_or(tmp, arg2)))
40    return simd_ifh(1, simd_himask(fw), tmpAns, simd_srli(curRegSize, 1, tmpAns))''',
41
42"vsll_2": r'''
43    tmp1 = b.SHL<1>(arg2)
44    tmp = simd_or(simd_and(b.SHL<1>(arg1), tmp1), simd_and(arg1, simd_not(tmp1)))
45    return simd_ifh(1, simd_himask(fw), tmp, simd_and(arg1, simd_not(arg2)))''',
46
47"vsrl_2": r'''
48    tmp = simd_or(simd_and(arg1, simd_not(arg2)), simd_and(b.SRL<1>(arg1), arg2))
49    return simd_ifh(1, simd_himask(fw), simd_and(arg1, simd_not(b.SHL<1>(arg2))), tmp)''',
50
51"vsra_2": r'''
52    return simd_ifh(1, simd_himask(fw), arg1, simd_or(simd_and(arg1, simd_not(arg2)), simd_and(arg2, b.SRL<1>(arg1))))''',
53}
54
55FunctionMap = {
56"simd_not" : "b.NOT",
57"simd_and" : "b.AND",
58"simd_xor" : "b.XOR",
59"simd_or"  : "b.OR",
60
61"simd_ifh(1, " : "b.IFH1(",
62"simd_himask(fw)" : "b.HiMask(128, 2)",
63"simd_slli(curRegSize, 1, " : "b.SHL<1>(",
64"simd_srli(curRegSize, 1, " : "b.SRL<1>(",
65
66"arg2" : "A2",
67"arg1" : "A1",
68
69"tmpAns": "TmpAns",
70"tmp"  : "Tmp",
71}
72
73def getImplements():
74    res = {}
75    for key in Implement:
76        out = Implement[key]
77        for k, v in FunctionMap.iteritems():
78            out = out.replace(k, v)
79        out = out.strip()
80        res[key] = [("SDValue " + line.strip() if "return" not in line else line)
81                        for line in out.split('\n')]
82
83    return res
84
Note: See TracBrowser for help on using the repository browser.