annotate clang/utils/convert_arm_neon.py @ 225:f7655407a6ba

remove unnecessary files
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 19 Jul 2021 03:48:36 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 #!/usr/bin/env python3
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 # This script was committed on 20/11/2019 and it would probably make sense to remove
anatofuz
parents:
diff changeset
4 # it after the next release branches.
anatofuz
parents:
diff changeset
5
anatofuz
parents:
diff changeset
6 # This script is pipe based and converts an arm_neon.td (or arm_fp16.td) file
anatofuz
parents:
diff changeset
7 # using the old single-char type modifiers to an equivalent new-style form where
anatofuz
parents:
diff changeset
8 # each modifier is orthogonal and they can be composed.
anatofuz
parents:
diff changeset
9 #
anatofuz
parents:
diff changeset
10 # It was used to directly generate the .td files on master, so if you have any
anatofuz
parents:
diff changeset
11 # local additions I would suggest implementing any modifiers here, and running
anatofuz
parents:
diff changeset
12 # it over your entire pre-merge .td files rather than trying to resolve any
anatofuz
parents:
diff changeset
13 # conflicts manually.
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 import re, sys
anatofuz
parents:
diff changeset
16 MOD_MAP = {
anatofuz
parents:
diff changeset
17 'v': 'v',
anatofuz
parents:
diff changeset
18 'x': 'S',
anatofuz
parents:
diff changeset
19 'u': 'U',
anatofuz
parents:
diff changeset
20 'd': '.',
anatofuz
parents:
diff changeset
21 'g': 'q',
anatofuz
parents:
diff changeset
22 'j': 'Q',
anatofuz
parents:
diff changeset
23 'w': '>Q',
anatofuz
parents:
diff changeset
24 'n': '>',
anatofuz
parents:
diff changeset
25 'h': '<',
anatofuz
parents:
diff changeset
26 'q': '<Q',
anatofuz
parents:
diff changeset
27 'e': '<U',
anatofuz
parents:
diff changeset
28 'm': '<q',
anatofuz
parents:
diff changeset
29 'i': 'I',
anatofuz
parents:
diff changeset
30 'l': 'IU>',
anatofuz
parents:
diff changeset
31 's': '1',
anatofuz
parents:
diff changeset
32 'z': '1<',
anatofuz
parents:
diff changeset
33 'r': '1>',
anatofuz
parents:
diff changeset
34 'b': '1U',
anatofuz
parents:
diff changeset
35 '$': '1S',
anatofuz
parents:
diff changeset
36 'k': 'Q',
anatofuz
parents:
diff changeset
37 '2': '2',
anatofuz
parents:
diff changeset
38 '3': '3',
anatofuz
parents:
diff changeset
39 '4': '4',
anatofuz
parents:
diff changeset
40 'B': '2Q',
anatofuz
parents:
diff changeset
41 'C': '3Q',
anatofuz
parents:
diff changeset
42 'D': '4Q',
anatofuz
parents:
diff changeset
43 'p': '*',
anatofuz
parents:
diff changeset
44 'c': 'c*',
anatofuz
parents:
diff changeset
45 '7': '<<q',
anatofuz
parents:
diff changeset
46 '8': '<<',
anatofuz
parents:
diff changeset
47 '9': '<<Q',
anatofuz
parents:
diff changeset
48 't': 'p'
anatofuz
parents:
diff changeset
49 }
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 def typespec_elt_size(typespec):
anatofuz
parents:
diff changeset
53 if 'c' in typespec:
anatofuz
parents:
diff changeset
54 return 8
anatofuz
parents:
diff changeset
55 elif 's' in typespec or 'h' in typespec:
anatofuz
parents:
diff changeset
56 return 16
anatofuz
parents:
diff changeset
57 elif 'i' in typespec or 'f' in typespec:
anatofuz
parents:
diff changeset
58 return 32
anatofuz
parents:
diff changeset
59 elif 'l' in typespec or 'd' in typespec:
anatofuz
parents:
diff changeset
60 return 64
anatofuz
parents:
diff changeset
61 elif 'k' in typespec:
anatofuz
parents:
diff changeset
62 return 128
anatofuz
parents:
diff changeset
63
anatofuz
parents:
diff changeset
64 def get_resize(cur, desired):
anatofuz
parents:
diff changeset
65 res = ''
anatofuz
parents:
diff changeset
66 while cur < desired:
anatofuz
parents:
diff changeset
67 res += '>'
anatofuz
parents:
diff changeset
68 cur *= 2
anatofuz
parents:
diff changeset
69 while cur > desired:
anatofuz
parents:
diff changeset
70 res += '<'
anatofuz
parents:
diff changeset
71 cur /= 2
anatofuz
parents:
diff changeset
72 return res
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 def remap_protocol(proto, typespec, name):
anatofuz
parents:
diff changeset
76 key_type = 0
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 # Conversions like to see the integer type so they know signedness.
anatofuz
parents:
diff changeset
79 if 'vcvt' in name and '_f' in name and name != 'vcvt_f32_f64' and name != 'vcvt_f64_f32':
anatofuz
parents:
diff changeset
80 key_type = 1
anatofuz
parents:
diff changeset
81 default_width = typespec_elt_size(typespec)
anatofuz
parents:
diff changeset
82 inconsistent_width = False
anatofuz
parents:
diff changeset
83 for elt in typespec:
anatofuz
parents:
diff changeset
84 new_width = typespec_elt_size(elt)
anatofuz
parents:
diff changeset
85 if new_width and new_width != default_width:
anatofuz
parents:
diff changeset
86 inconsistent_width = True
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 res = ''
anatofuz
parents:
diff changeset
89 for i, c in enumerate(proto):
anatofuz
parents:
diff changeset
90 # void and pointers make for bad discriminators in CGBuiltin.cpp.
anatofuz
parents:
diff changeset
91 if c in 'vcp':
anatofuz
parents:
diff changeset
92 key_type += 1
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 if c in MOD_MAP:
anatofuz
parents:
diff changeset
95 cur_mod = MOD_MAP[c]
anatofuz
parents:
diff changeset
96 elif inconsistent_width:
anatofuz
parents:
diff changeset
97 # Otherwise it's a fixed output width modifier.
anatofuz
parents:
diff changeset
98 sys.stderr.write(f'warning: {name} uses fixed output size but has inconsistent input widths: {proto} {typespec}\n')
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 if c == 'Y':
anatofuz
parents:
diff changeset
101 # y: scalar of half float
anatofuz
parents:
diff changeset
102 resize = get_resize(default_width, 16)
anatofuz
parents:
diff changeset
103 cur_mod = f'1F{resize}'
anatofuz
parents:
diff changeset
104 elif c == 'y':
anatofuz
parents:
diff changeset
105 # y: scalar of float
anatofuz
parents:
diff changeset
106 resize = get_resize(default_width, 32)
anatofuz
parents:
diff changeset
107 cur_mod = f'1F{resize}'
anatofuz
parents:
diff changeset
108 elif c == 'o':
anatofuz
parents:
diff changeset
109 # o: scalar of double
anatofuz
parents:
diff changeset
110 resize = get_resize(default_width, 64)
anatofuz
parents:
diff changeset
111 cur_mod = f'1F{resize}'
anatofuz
parents:
diff changeset
112 elif c == 'I':
anatofuz
parents:
diff changeset
113 # I: scalar of 32-bit signed
anatofuz
parents:
diff changeset
114 resize = get_resize(default_width, 32)
anatofuz
parents:
diff changeset
115 cur_mod = f'1S{resize}'
anatofuz
parents:
diff changeset
116 elif c == 'L':
anatofuz
parents:
diff changeset
117 # L: scalar of 64-bit signed
anatofuz
parents:
diff changeset
118 resize = get_resize(default_width, 64)
anatofuz
parents:
diff changeset
119 cur_mod = f'1S{resize}'
anatofuz
parents:
diff changeset
120 elif c == 'U':
anatofuz
parents:
diff changeset
121 # I: scalar of 32-bit unsigned
anatofuz
parents:
diff changeset
122 resize = get_resize(default_width, 32)
anatofuz
parents:
diff changeset
123 cur_mod = f'1U{resize}'
anatofuz
parents:
diff changeset
124 elif c == 'O':
anatofuz
parents:
diff changeset
125 # O: scalar of 64-bit unsigned
anatofuz
parents:
diff changeset
126 resize = get_resize(default_width, 64)
anatofuz
parents:
diff changeset
127 cur_mod = f'1U{resize}'
anatofuz
parents:
diff changeset
128 elif c == 'f':
anatofuz
parents:
diff changeset
129 # f: float (int args)
anatofuz
parents:
diff changeset
130 resize = get_resize(default_width, 32)
anatofuz
parents:
diff changeset
131 cur_mod = f'F{resize}'
anatofuz
parents:
diff changeset
132 elif c == 'F':
anatofuz
parents:
diff changeset
133 # F: double (int args)
anatofuz
parents:
diff changeset
134 resize = get_resize(default_width, 64)
anatofuz
parents:
diff changeset
135 cur_mod = f'F{resize}'
anatofuz
parents:
diff changeset
136 elif c == 'H':
anatofuz
parents:
diff changeset
137 # H: half (int args)
anatofuz
parents:
diff changeset
138 resize = get_resize(default_width, 16)
anatofuz
parents:
diff changeset
139 cur_mod = f'F{resize}'
anatofuz
parents:
diff changeset
140 elif c == '0':
anatofuz
parents:
diff changeset
141 # 0: half (int args), ignore 'Q' size modifier.
anatofuz
parents:
diff changeset
142 resize = get_resize(default_width, 16)
anatofuz
parents:
diff changeset
143 cur_mod = f'Fq{resize}'
anatofuz
parents:
diff changeset
144 elif c == '1':
anatofuz
parents:
diff changeset
145 # 1: half (int args), force 'Q' size modifier.
anatofuz
parents:
diff changeset
146 resize = get_resize(default_width, 16)
anatofuz
parents:
diff changeset
147 cur_mod = f'FQ{resize}'
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 if len(cur_mod) == 0:
anatofuz
parents:
diff changeset
150 raise Exception(f'WTF: {c} in {name}')
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 if key_type != 0 and key_type == i:
anatofuz
parents:
diff changeset
153 cur_mod += '!'
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 if len(cur_mod) == 1:
anatofuz
parents:
diff changeset
156 res += cur_mod
anatofuz
parents:
diff changeset
157 else:
anatofuz
parents:
diff changeset
158 res += '(' + cur_mod + ')'
anatofuz
parents:
diff changeset
159
anatofuz
parents:
diff changeset
160 return res
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 def replace_insts(m):
anatofuz
parents:
diff changeset
163 start, end = m.span('proto')
anatofuz
parents:
diff changeset
164 start -= m.start()
anatofuz
parents:
diff changeset
165 end -= m.start()
anatofuz
parents:
diff changeset
166 new_proto = remap_protocol(m['proto'], m['kinds'], m['name'])
anatofuz
parents:
diff changeset
167 return m.group()[:start] + new_proto + m.group()[end:]
anatofuz
parents:
diff changeset
168
anatofuz
parents:
diff changeset
169 INST = re.compile(r'Inst<"(?P<name>.*?)",\s*"(?P<proto>.*?)",\s*"(?P<kinds>.*?)"')
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 new_td = INST.sub(replace_insts, sys.stdin.read())
anatofuz
parents:
diff changeset
172 sys.stdout.write(new_td)