Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: src/gen_arm32_reg_tables.py

Issue 1481133002: Subzero. ARM32. Show FP lowering some love. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 class RegAliases(object):
Jim Stichnoth 2015/12/07 20:58:15 This file should probably go into the pydir/ direc
John 2015/12/08 13:54:25 Done.
2 def __init__(self, *Aliases):
3 self.Aliases = list(Aliases)
4
5 def __str__(self):
6 return 'REGLIST{AliasCount}(RegARM32, {Aliases})'.format(
7 AliasCount=len(self.Aliases), Aliases=', '.join(self.Aliases))
8
9 def _ArgumentNames(Method):
10 import inspect
11 return (ArgName for ArgName in inspect.getargspec(Method).args \
12 if ArgName != 'self')
13
14 class RegFeatures(object):
15 def __init__(self, IsScratch=0, IsPreserved=0, IsStackPtr=0, IsFramePtr=0,
16 IsInt=0, IsI64Pair=0, IsFP32=0, IsFP64=0, IsVec128=0,
Jim Stichnoth 2015/12/07 20:58:15 Indent these 2 lines 1 extra space, to line up wit
John 2015/12/08 13:54:25 Done.
17 Aliases=None):
18 assert not (IsInt and IsI64Pair)
19 assert not ((IsFP32 and IsFP64) or (IsFP32 and IsVec128) or
Jim Stichnoth 2015/12/07 20:58:14 Can you break this up into 3 individual asserts?
John 2015/12/08 13:54:25 But I like long, confusing conditions... :P Done.
20 (IsFP64 and IsVec128))
21 assert not ((IsInt or IsI64Pair) and (IsFP32 or IsFP64 or IsVec128))
22 assert (not IsFramePtr) or IsInt
23 assert (not IsStackPtr) or not(
24 IsInt or IsI64Pair or IsFP32 or IsFP64 or IsVec128)
25 assert not (IsScratch and IsPreserved)
26 self.Features = [(x, locals()[x]) for x in _ArgumentNames(self.__init__)]
27
28 def __str__(self):
29 return '%s' % (', '.join(str(Value) for Name, Value in self.Features))
30
31 def Aliases(self):
32 for Name, Value in self.Features:
Jim Stichnoth 2015/12/07 20:58:15 I'm not a python expert by any means, but I don't
John 2015/12/08 13:54:25 Features is not a dictionary -- it is a vector of
33 if Name == 'Aliases':
34 return Value
35 assert False
36
37 def LivesInGPR(self):
38 for Name, Value in self.Features:
39 if Name in ['IsInt', 'IsI64Pair', 'IsStackPtr', 'IsFramePtr'] and Value:
40 return True
41 return not self.LivesInVFP()
42
43 def LivesInVFP(self):
44 for Name, Value in self.Features:
45 if Name in ['IsFP32', 'IsFP64', 'IsVec128'] and Value:
46 return True
47 return False
48
49 class Reg(object):
50 def __init__(self, Name, Encode, **Features):
51 self.Name = Name
52 self.Encode = Encode
53 self.Features = RegFeatures(**Features)
54
55 def __str__(self):
56 return 'Reg_{Name}, {Encode}, {Features}'.format(Name=self.Name,
57 Encode=self.Encode, Features=self.Features)
58
59 def IsAnAliasOf(self, Other):
60 return self.Name in self.Features.Aliases().Aliases
61
62 GPRs = [
63 Reg( 'r0', 0, IsScratch=1, IsInt=1, Aliases=RegAliases( 'r0', 'r0r1')),
64 Reg( 'r1', 1, IsScratch=1, IsInt=1, Aliases=RegAliases( 'r1', 'r0r1')),
65 Reg( 'r2', 2, IsScratch=1, IsInt=1, Aliases=RegAliases( 'r2', 'r2r3')),
66 Reg( 'r3', 3, IsScratch=1, IsInt=1, Aliases=RegAliases( 'r3', 'r2r3')),
67 Reg( 'r4', 4, IsPreserved=1, IsInt=1, Aliases=RegAliases( 'r4', 'r4r5')),
68 Reg( 'r5', 5, IsPreserved=1, IsInt=1, Aliases=RegAliases( 'r5', 'r4r5')),
69 Reg( 'r6', 6, IsPreserved=1, IsInt=1, Aliases=RegAliases( 'r6', 'r6r7')),
70 Reg( 'r7', 7, IsPreserved=1, IsInt=1, Aliases=RegAliases( 'r7', 'r6r7')),
71 Reg( 'r8', 8, IsPreserved=1, IsInt=1, Aliases=RegAliases( 'r8', 'r8r9')),
72 Reg( 'r9', 9, IsPreserved=1, IsInt=0, Aliases=RegAliases( 'r9', 'r8r9')),
73 Reg('r10', 10, IsPreserved=1, IsInt=1, Aliases=RegAliases('r10', 'r10fp')),
74 Reg( 'fp', 11, IsPreserved=1, IsInt=1, IsFramePtr=1, Aliases=RegAliases( 'fp', 'r10fp')),
75 Reg( 'ip', 12, IsScratch=1, IsInt=1, Aliases=RegAliases( 'ip') ),
76 Reg( 'sp', 13, IsScratch=0, IsInt=0, IsStackPtr=1, Aliases=RegAliases( 'sp') ),
77 Reg( 'lr', 14, IsScratch=0, IsInt=0, Aliases=RegAliases( 'lr') ),
78 Reg( 'pc', 15, IsScratch=0, IsInt=0, Aliases=RegAliases( 'pc') ),
79 ]
80
81 I64Pairs = [
82 Reg( 'r0r1', 0, IsScratch=1, IsI64Pair=1, Aliases=RegAliases( 'r0r1', 'r0' , 'r1')),
83 Reg( 'r2r3', 2, IsScratch=1, IsI64Pair=1, Aliases=RegAliases( 'r2r3', 'r2' , 'r3')),
84 Reg( 'r4r5', 4, IsPreserved=1, IsI64Pair=1, Aliases=RegAliases( 'r4r5', 'r4' , 'r5')),
85 Reg( 'r6r7', 6, IsPreserved=1, IsI64Pair=1, Aliases=RegAliases( 'r6r7', 'r6' , 'r7')),
86 Reg( 'r8r9', 8, IsPreserved=1, IsI64Pair=0, Aliases=RegAliases( 'r8r9', 'r8' , 'r9')),
87 Reg('r10fp', 10, IsPreserved=1, IsI64Pair=1, Aliases=RegAliases('r10fp', 'r10' , 'fp')),
88 ]
89
90 FP32 = [
91 Reg( 's0', 0, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's0', 'd0' , 'q0') ),
92 Reg( 's1', 1, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's1', 'd0' , 'q0') ),
93 Reg( 's2', 2, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's2', 'd1' , 'q0') ),
94 Reg( 's3', 3, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's3', 'd1' , 'q0') ),
95 Reg( 's4', 4, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's4', 'd2' , 'q1') ),
96 Reg( 's5', 5, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's5', 'd2' , 'q1') ),
97 Reg( 's6', 6, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's6', 'd3' , 'q1') ),
98 Reg( 's7', 7, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's7', 'd3' , 'q1') ),
99 Reg( 's8', 8, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's8', 'd4' , 'q2') ),
100 Reg( 's9', 9, IsScratch=1, IsFP32=1, Aliases=RegAliases( 's9', 'd4' , 'q2') ),
101 Reg('s10', 10, IsScratch=1, IsFP32=1, Aliases=RegAliases('s10', 'd5' , 'q2') ),
102 Reg('s11', 11, IsScratch=1, IsFP32=1, Aliases=RegAliases('s11', 'd5' , 'q2') ),
103 Reg('s12', 12, IsScratch=1, IsFP32=1, Aliases=RegAliases('s12', 'd6' , 'q3') ),
104 Reg('s13', 13, IsScratch=1, IsFP32=1, Aliases=RegAliases('s13', 'd6' , 'q3') ),
105 Reg('s14', 14, IsScratch=1, IsFP32=1, Aliases=RegAliases('s14', 'd7' , 'q3') ),
106 Reg('s15', 15, IsScratch=1, IsFP32=1, Aliases=RegAliases('s15', 'd7' , 'q3') ),
107 Reg('s16', 16, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s16', 'd8' , 'q4') ),
108 Reg('s17', 17, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s17', 'd8' , 'q4') ),
109 Reg('s18', 18, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s18', 'd9' , 'q4') ),
110 Reg('s19', 19, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s19', 'd9' , 'q4') ),
111 Reg('s20', 20, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s20', 'd10', 'q5') ),
112 Reg('s21', 21, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s21', 'd10', 'q5') ),
113 Reg('s22', 22, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s22', 'd11', 'q5') ),
114 Reg('s23', 23, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s23', 'd11', 'q5') ),
115 Reg('s24', 24, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s24', 'd12', 'q6') ),
116 Reg('s25', 25, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s25', 'd12', 'q6') ),
117 Reg('s26', 26, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s26', 'd13', 'q6') ),
118 Reg('s27', 27, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s27', 'd13', 'q6') ),
119 Reg('s28', 28, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s28', 'd14', 'q7') ),
120 Reg('s29', 29, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s29', 'd14', 'q7') ),
121 Reg('s30', 30, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s30', 'd15', 'q7') ),
122 Reg('s31', 31, IsPreserved=1, IsFP32=1, Aliases=RegAliases('s31', 'd14', 'q7') ),
123 ]
124
125 FP64 = [
126 Reg( 'd0', 0, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd0', 'q0', 's0' , 's1')),
127 Reg( 'd1', 1, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd1', 'q0', 's2' , 's3')),
128 Reg( 'd2', 2, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd2', 'q1', 's4' , 's5')),
129 Reg( 'd3', 3, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd3', 'q1', 's6' , 's7')),
130 Reg( 'd4', 4, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd4', 'q2', 's8' , 's9')),
131 Reg( 'd5', 5, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd5', 'q2', 's10' , 's11')),
132 Reg( 'd6', 6, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd6', 'q3', 's12' , 's13')),
133 Reg( 'd7', 7, IsScratch=1, IsFP64=1, Aliases=RegAliases( 'd7', 'q3', 's14' , 's15')),
134 Reg( 'd8', 8, IsPreserved=1, IsFP64=1, Aliases=RegAliases( 'd8', 'q4', 's16' , 's17')),
135 Reg( 'd9', 9, IsPreserved=1, IsFP64=1, Aliases=RegAliases( 'd9', 'q4', 's18' , 's19')),
136 Reg('d10', 10, IsPreserved=1, IsFP64=1, Aliases=RegAliases('d10', 'q5', 's20' , 's21')),
137 Reg('d11', 11, IsPreserved=1, IsFP64=1, Aliases=RegAliases('d11', 'q5', 's22' , 's24')),
138 Reg('d12', 12, IsPreserved=1, IsFP64=1, Aliases=RegAliases('d12', 'q6', 's24' , 's25')),
139 Reg('d13', 13, IsPreserved=1, IsFP64=1, Aliases=RegAliases('d13', 'q6', 's26' , 's27')),
140 Reg('d14', 14, IsPreserved=1, IsFP64=1, Aliases=RegAliases('d14', 'q7', 's28' , 's28')),
141 Reg('d15', 15, IsPreserved=1, IsFP64=1, Aliases=RegAliases('d15', 'q7', 's30' , 's31')),
142 Reg('d16', 16, IsScratch=1, IsFP64=1, Aliases=RegAliases('d16', 'q8')),
143 Reg('d17', 17, IsScratch=1, IsFP64=1, Aliases=RegAliases('d17', 'q8')),
144 Reg('d18', 18, IsScratch=1, IsFP64=1, Aliases=RegAliases('d18', 'q9')),
145 Reg('d19', 19, IsScratch=1, IsFP64=1, Aliases=RegAliases('d19', 'q9')),
146 Reg('d20', 20, IsScratch=1, IsFP64=1, Aliases=RegAliases('d20', 'q10')),
147 Reg('d21', 21, IsScratch=1, IsFP64=1, Aliases=RegAliases('d21', 'q10')),
148 Reg('d22', 22, IsScratch=1, IsFP64=1, Aliases=RegAliases('d22', 'q11')),
149 Reg('d23', 23, IsScratch=1, IsFP64=1, Aliases=RegAliases('d23', 'q11')),
150 Reg('d24', 24, IsScratch=1, IsFP64=1, Aliases=RegAliases('d24', 'q12')),
151 Reg('d25', 25, IsScratch=1, IsFP64=1, Aliases=RegAliases('d25', 'q12')),
152 Reg('d26', 26, IsScratch=1, IsFP64=1, Aliases=RegAliases('d26', 'q13')),
153 Reg('d27', 27, IsScratch=1, IsFP64=1, Aliases=RegAliases('d27', 'q13')),
154 Reg('d28', 28, IsScratch=1, IsFP64=1, Aliases=RegAliases('d28', 'q14')),
155 Reg('d29', 29, IsScratch=1, IsFP64=1, Aliases=RegAliases('d29', 'q14')),
156 Reg('d30', 30, IsScratch=1, IsFP64=1, Aliases=RegAliases('d30', 'q15')),
157 Reg('d31', 31, IsScratch=1, IsFP64=1, Aliases=RegAliases('d31', 'q15')),
158 ]
159
160 Vec128 = [
161 Reg( 'q0', 0, IsScratch=1, IsVec128=1, Aliases=RegAliases( 'q0', 'd0', 'd 1', 's0', 's1', 's2', 's3')),
162 Reg( 'q1', 1, IsScratch=1, IsVec128=1, Aliases=RegAliases( 'q1', 'd2', 'd 3', 's4', 's5', 's6', 's7')),
163 Reg( 'q2', 2, IsScratch=1, IsVec128=1, Aliases=RegAliases( 'q2', 'd4', 'd 5', 's8', 's9', 's10', 's11')),
164 Reg( 'q3', 3, IsScratch=1, IsVec128=1, Aliases=RegAliases( 'q3', 'd6', 'd 7', 's12', 's13', 's14', 's15')),
165 Reg( 'q4', 4, IsPreserved=1, IsVec128=1, Aliases=RegAliases( 'q4', 'd8', 'd 9', 's16', 's17', 's18', 's19')),
166 Reg( 'q5', 5, IsPreserved=1, IsVec128=1, Aliases=RegAliases( 'q5', 'd10', 'd1 1', 's20', 's21', 's22', 's23')),
167 Reg( 'q6', 6, IsPreserved=1, IsVec128=1, Aliases=RegAliases( 'q6', 'd12', 'd1 3', 's24', 's25', 's26', 's27')),
168 Reg( 'q7', 7, IsPreserved=1, IsVec128=1, Aliases=RegAliases( 'q7', 'd14', 'd1 5', 's28', 's29', 's30', 's31')),
169 Reg( 'q8', 8, IsScratch=1, IsVec128=1, Aliases=RegAliases( 'q8', 'd16', 'd1 7')),
170 Reg( 'q9', 9, IsScratch=1, IsVec128=1, Aliases=RegAliases( 'q9', 'd18', 'd1 9')),
171 Reg('q10', 10, IsScratch=1, IsVec128=1, Aliases=RegAliases('q10', 'd20', 'd2 1')),
172 Reg('q11', 11, IsScratch=1, IsVec128=1, Aliases=RegAliases('q11', 'd22', 'd2 3')),
173 Reg('q12', 12, IsScratch=1, IsVec128=1, Aliases=RegAliases('q12', 'd24', 'd2 5')),
174 Reg('q13', 13, IsScratch=1, IsVec128=1, Aliases=RegAliases('q13', 'd26', 'd2 7')),
175 Reg('q14', 14, IsScratch=1, IsVec128=1, Aliases=RegAliases('q14', 'd28', 'd2 9')),
176 Reg('q15', 15, IsScratch=1, IsVec128=1, Aliases=RegAliases('q15', 'd30', 'd3 1')),
177 ]
178
179 def _reverse(x):
180 return sorted(x, key=lambda x: x.Encode, reverse=True)
181 RegClasses = [GPRs, I64Pairs, FP32, _reverse(FP64), _reverse(Vec128)]
182
183 AllRegs = {}
184 for RegClass in RegClasses:
185 for Reg in RegClass:
186 assert Reg.Name not in AllRegs
187 AllRegs[Reg.Name] = Reg
188
189 for RegClass in RegClasses:
190 for Reg in RegClass:
191 for Alias in AllRegs[Reg.Name].Features.Aliases().Aliases:
192 assert AllRegs[Alias].IsAnAliasOf(Reg), '%s VS %s' % (Reg, AllRegs[Alias])
193 assert AllRegs[Alias].IsAnAliasOf(Reg), '%s VS %s' % (Reg, AllRegs[Alias])
194 assert AllRegs[Alias].Features.LivesInGPR() == \
195 Reg.Features.LivesInGPR(), '%s VS %s' % (Reg, AllRegs[Alias])
196 assert AllRegs[Alias].Features.LivesInVFP() == \
197 Reg.Features.LivesInVFP(), '%s VS %s' % (Reg, AllRegs[Alias])
198
199 for RegClass in RegClasses:
200 for Reg in RegClass:
201 print 'X({Reg})'.format(Reg=Reg)
202 print
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698