|  | import os | 
|  | import sys | 
|  |  | 
|  | class RegAliases(object): | 
|  | def __init__(self, AliasesStr): | 
|  | self.Aliases = list(Alias.strip() for Alias in AliasesStr.split(',')) | 
|  |  | 
|  | def __str__(self): | 
|  | return 'REGLIST{AliasCount}(RegARM32, {Aliases})'.format( | 
|  | AliasCount=len(self.Aliases), Aliases=', '.join(self.Aliases)) | 
|  |  | 
|  | def _ArgumentNames(Method): | 
|  | import inspect | 
|  | return (ArgName for ArgName in inspect.getargspec(Method).args | 
|  | if ArgName != 'self') | 
|  |  | 
|  | class RegFeatures(object): | 
|  | def __init__(self, AsmStr=None, CCArg=0, IsScratch=0, IsPreserved=0, | 
|  | IsStackPtr=0, IsFramePtr=0, IsGPR=0, IsInt=0, IsI64Pair=0, | 
|  | IsFP32=0, IsFP64=0, IsVec128=0, Aliases=None): | 
|  | assert (not IsInt) or IsGPR | 
|  | assert (not IsI64Pair) or (not IsGPR) | 
|  | assert not (IsInt and IsI64Pair) | 
|  | assert not (IsFP32 and IsFP64) | 
|  | assert not (IsFP32 and IsVec128) | 
|  | assert not (IsFP64 and IsVec128) | 
|  | assert not ((IsGPR) and (IsFP32 or IsFP64 or IsVec128)) | 
|  | assert (not IsFramePtr) or IsGPR | 
|  | assert (not IsStackPtr) or IsGPR | 
|  | assert not (IsScratch and IsPreserved) | 
|  | self.Features = [x for x in _ArgumentNames(self.__init__)] | 
|  | self.FeaturesDict = {} | 
|  | # The argument Aliases is a string with the register aliasing information. | 
|  | # The next line convert it to a RegAlias object, for pretty printing. | 
|  | Aliases = RegAliases(Aliases) | 
|  | AsmStr = '"%s"' % AsmStr | 
|  | for Feature in self.Features: | 
|  | self.FeaturesDict[Feature] = locals()[Feature] | 
|  |  | 
|  | def __str__(self): | 
|  | return '%s' % (', '.join(str(self.FeaturesDict[Feature]) for | 
|  | Feature in self.Features)) | 
|  |  | 
|  | def Aliases(self): | 
|  | return self.FeaturesDict['Aliases'] | 
|  |  | 
|  | def LivesInGPR(self): | 
|  | return (any(self.FeaturesDict[IntFeature] for IntFeature in ( | 
|  | 'IsInt', 'IsI64Pair', 'IsStackPtr', 'IsFramePtr')) or | 
|  | not self.LivesInVFP()) | 
|  |  | 
|  | def LivesInVFP(self): | 
|  | return any(self.FeaturesDict[FpFeature] for FpFeature in ( | 
|  | 'IsFP32', 'IsFP64', 'IsVec128')) | 
|  |  | 
|  | def DefiningXMacro(self, OtherFeatures): | 
|  | return 'define X({parameters})'.format( | 
|  | parameters=', '.join(OtherFeatures + self.Features)) | 
|  |  | 
|  | class Reg(object): | 
|  | def __init__(self, Name, Encode, AsmStr=None, **Features): | 
|  | self.Name = Name | 
|  | self.Encode = Encode | 
|  | if not AsmStr: | 
|  | AsmStr = '%s' % Name | 
|  | self.Features = RegFeatures(AsmStr=AsmStr, **Features) | 
|  |  | 
|  | def __str__(self): | 
|  | return 'Reg_{Name}, {Encode}, {Features}'.format(Name=self.Name, | 
|  | Encode=self.Encode, Features=self.Features) | 
|  |  | 
|  | def IsAnAliasOf(self, Other): | 
|  | return Other.Name in self.Features.Aliases().Aliases | 
|  |  | 
|  | def DefiningXMacro(self): | 
|  | return self.Features.DefiningXMacro(['Tag', 'Encoding']) | 
|  |  | 
|  | # Note: The following tables break the usual 80-col on purpose -- it is easier | 
|  | # to read the register tables if each register entry is contained on a single | 
|  | # line. | 
|  | GPRs = [ | 
|  | Reg( 'r0',  0,   IsScratch=1, CCArg=1, IsGPR = 1, IsInt=1,               Aliases= 'r0,  r0r1'), | 
|  | Reg( 'r1',  1,   IsScratch=1, CCArg=2, IsGPR = 1, IsInt=1,               Aliases= 'r1,  r0r1'), | 
|  | Reg( 'r2',  2,   IsScratch=1, CCArg=3, IsGPR = 1, IsInt=1,               Aliases= 'r2,  r2r3'), | 
|  | Reg( 'r3',  3,   IsScratch=1, CCArg=4, IsGPR = 1, IsInt=1,               Aliases= 'r3,  r2r3'), | 
|  | Reg( 'r4',  4, IsPreserved=1,          IsGPR = 1, IsInt=1,               Aliases= 'r4,  r4r5'), | 
|  | Reg( 'r5',  5, IsPreserved=1,          IsGPR = 1, IsInt=1,               Aliases= 'r5,  r4r5'), | 
|  | Reg( 'r6',  6, IsPreserved=1,          IsGPR = 1, IsInt=1,               Aliases= 'r6,  r6r7'), | 
|  | Reg( 'r7',  7, IsPreserved=1,          IsGPR = 1, IsInt=1,               Aliases= 'r7,  r6r7'), | 
|  | Reg( 'r8',  8, IsPreserved=1,          IsGPR = 1, IsInt=1,               Aliases= 'r8,  r8r9'), | 
|  | Reg( 'r9',  9, IsPreserved=1,          IsGPR = 1, IsInt=0,               Aliases= 'r9,  r8r9'), | 
|  | Reg('r10', 10, IsPreserved=1,          IsGPR = 1, IsInt=1,               Aliases='r10, r10fp'), | 
|  | Reg( 'fp', 11, IsPreserved=1,          IsGPR = 1, IsInt=1, IsFramePtr=1, Aliases= 'fp, r10fp'), | 
|  | Reg( 'ip', 12,   IsScratch=1,          IsGPR = 1, IsInt=0,               Aliases= 'ip'), | 
|  | Reg( 'sp', 13,   IsScratch=0,          IsGPR = 1, IsInt=0, IsStackPtr=1, Aliases= 'sp'), | 
|  | Reg( 'lr', 14,   IsScratch=0,          IsGPR = 1, IsInt=0,               Aliases= 'lr'), | 
|  | Reg( 'pc', 15,   IsScratch=0,          IsGPR = 1, IsInt=0,               Aliases= 'pc'), | 
|  | ] | 
|  |  | 
|  | I64Pairs = [ | 
|  | Reg( 'r0r1',  0, AsmStr= 'r0, r1',   IsScratch=1, CCArg=1, IsI64Pair=1, Aliases= 'r0r1,  r0, r1'), | 
|  | Reg( 'r2r3',  2, AsmStr= 'r2, r3',   IsScratch=1, CCArg=2, IsI64Pair=1, Aliases= 'r2r3,  r2, r3'), | 
|  | Reg( 'r4r5',  4, AsmStr= 'r4, r5', IsPreserved=1,          IsI64Pair=1, Aliases= 'r4r5,  r4, r5'), | 
|  | Reg( 'r6r7',  6, AsmStr= 'r6, r7', IsPreserved=1,          IsI64Pair=1, Aliases= 'r6r7,  r6, r7'), | 
|  | Reg( 'r8r9',  8, AsmStr= 'r8, r9', IsPreserved=1,          IsI64Pair=0, Aliases= 'r8r9,  r8, r9'), | 
|  | Reg('r10fp', 10, AsmStr='r10, fp', IsPreserved=1,          IsI64Pair=0, Aliases='r10fp, r10, fp'), | 
|  | ] | 
|  |  | 
|  | FP32 = [ | 
|  | Reg( 's0',  0,   IsScratch=1, CCArg=1,  IsFP32=1, Aliases= 's0, d0 , q0'), | 
|  | Reg( 's1',  1,   IsScratch=1, CCArg=2,  IsFP32=1, Aliases= 's1, d0 , q0'), | 
|  | Reg( 's2',  2,   IsScratch=1, CCArg=3,  IsFP32=1, Aliases= 's2, d1 , q0'), | 
|  | Reg( 's3',  3,   IsScratch=1, CCArg=4,  IsFP32=1, Aliases= 's3, d1 , q0'), | 
|  | Reg( 's4',  4,   IsScratch=1, CCArg=5,  IsFP32=1, Aliases= 's4, d2 , q1'), | 
|  | Reg( 's5',  5,   IsScratch=1, CCArg=6,  IsFP32=1, Aliases= 's5, d2 , q1'), | 
|  | Reg( 's6',  6,   IsScratch=1, CCArg=7,  IsFP32=1, Aliases= 's6, d3 , q1'), | 
|  | Reg( 's7',  7,   IsScratch=1, CCArg=8,  IsFP32=1, Aliases= 's7, d3 , q1'), | 
|  | Reg( 's8',  8,   IsScratch=1, CCArg=9,  IsFP32=1, Aliases= 's8, d4 , q2'), | 
|  | Reg( 's9',  9,   IsScratch=1, CCArg=10, IsFP32=1, Aliases= 's9, d4 , q2'), | 
|  | Reg('s10', 10,   IsScratch=1, CCArg=11, IsFP32=1, Aliases='s10, d5 , q2'), | 
|  | Reg('s11', 11,   IsScratch=1, CCArg=12, IsFP32=1, Aliases='s11, d5 , q2'), | 
|  | Reg('s12', 12,   IsScratch=1, CCArg=13, IsFP32=1, Aliases='s12, d6 , q3'), | 
|  | Reg('s13', 13,   IsScratch=1, CCArg=14, IsFP32=1, Aliases='s13, d6 , q3'), | 
|  | Reg('s14', 14,   IsScratch=1, CCArg=15, IsFP32=1, Aliases='s14, d7 , q3'), | 
|  | Reg('s15', 15,   IsScratch=1, CCArg=16, IsFP32=1, Aliases='s15, d7 , q3'), | 
|  | Reg('s16', 16, IsPreserved=1,           IsFP32=1, Aliases='s16, d8 , q4'), | 
|  | Reg('s17', 17, IsPreserved=1,           IsFP32=1, Aliases='s17, d8 , q4'), | 
|  | Reg('s18', 18, IsPreserved=1,           IsFP32=1, Aliases='s18, d9 , q4'), | 
|  | Reg('s19', 19, IsPreserved=1,           IsFP32=1, Aliases='s19, d9 , q4'), | 
|  | Reg('s20', 20, IsPreserved=1,           IsFP32=1, Aliases='s20, d10, q5'), | 
|  | Reg('s21', 21, IsPreserved=1,           IsFP32=1, Aliases='s21, d10, q5'), | 
|  | Reg('s22', 22, IsPreserved=1,           IsFP32=1, Aliases='s22, d11, q5'), | 
|  | Reg('s23', 23, IsPreserved=1,           IsFP32=1, Aliases='s23, d11, q5'), | 
|  | Reg('s24', 24, IsPreserved=1,           IsFP32=1, Aliases='s24, d12, q6'), | 
|  | Reg('s25', 25, IsPreserved=1,           IsFP32=1, Aliases='s25, d12, q6'), | 
|  | Reg('s26', 26, IsPreserved=1,           IsFP32=1, Aliases='s26, d13, q6'), | 
|  | Reg('s27', 27, IsPreserved=1,           IsFP32=1, Aliases='s27, d13, q6'), | 
|  | Reg('s28', 28, IsPreserved=1,           IsFP32=1, Aliases='s28, d14, q7'), | 
|  | Reg('s29', 29, IsPreserved=1,           IsFP32=1, Aliases='s29, d14, q7'), | 
|  | Reg('s30', 30, IsPreserved=1,           IsFP32=1, Aliases='s30, d15, q7'), | 
|  | Reg('s31', 31, IsPreserved=1,           IsFP32=1, Aliases='s31, d15, q7'), | 
|  | ] | 
|  |  | 
|  | FP64 = [ | 
|  | Reg( 'd0',  0,   IsScratch=1, CCArg=1, IsFP64=1, Aliases= 'd0,  q0,  s0,  s1'), | 
|  | Reg( 'd1',  1,   IsScratch=1, CCArg=2, IsFP64=1, Aliases= 'd1,  q0,  s2,  s3'), | 
|  | Reg( 'd2',  2,   IsScratch=1, CCArg=3, IsFP64=1, Aliases= 'd2,  q1,  s4,  s5'), | 
|  | Reg( 'd3',  3,   IsScratch=1, CCArg=4, IsFP64=1, Aliases= 'd3,  q1,  s6,  s7'), | 
|  | Reg( 'd4',  4,   IsScratch=1, CCArg=5, IsFP64=1, Aliases= 'd4,  q2,  s8,  s9'), | 
|  | Reg( 'd5',  5,   IsScratch=1, CCArg=6, IsFP64=1, Aliases= 'd5,  q2, s10, s11'), | 
|  | Reg( 'd6',  6,   IsScratch=1, CCArg=7, IsFP64=1, Aliases= 'd6,  q3, s12, s13'), | 
|  | Reg( 'd7',  7,   IsScratch=1, CCArg=8, IsFP64=1, Aliases= 'd7,  q3, s14, s15'), | 
|  | Reg( 'd8',  8, IsPreserved=1,          IsFP64=1, Aliases= 'd8,  q4, s16, s17'), | 
|  | Reg( 'd9',  9, IsPreserved=1,          IsFP64=1, Aliases= 'd9,  q4, s18, s19'), | 
|  | Reg('d10', 10, IsPreserved=1,          IsFP64=1, Aliases='d10,  q5, s20, s21'), | 
|  | Reg('d11', 11, IsPreserved=1,          IsFP64=1, Aliases='d11,  q5, s22, s23'), | 
|  | Reg('d12', 12, IsPreserved=1,          IsFP64=1, Aliases='d12,  q6, s24, s25'), | 
|  | Reg('d13', 13, IsPreserved=1,          IsFP64=1, Aliases='d13,  q6, s26, s27'), | 
|  | Reg('d14', 14, IsPreserved=1,          IsFP64=1, Aliases='d14,  q7, s28, s29'), | 
|  | Reg('d15', 15, IsPreserved=1,          IsFP64=1, Aliases='d15,  q7, s30, s31'), | 
|  | Reg('d16', 16,   IsScratch=1,          IsFP64=1, Aliases='d16,  q8'), | 
|  | Reg('d17', 17,   IsScratch=1,          IsFP64=1, Aliases='d17,  q8'), | 
|  | Reg('d18', 18,   IsScratch=1,          IsFP64=1, Aliases='d18,  q9'), | 
|  | Reg('d19', 19,   IsScratch=1,          IsFP64=1, Aliases='d19,  q9'), | 
|  | Reg('d20', 20,   IsScratch=1,          IsFP64=1, Aliases='d20, q10'), | 
|  | Reg('d21', 21,   IsScratch=1,          IsFP64=1, Aliases='d21, q10'), | 
|  | Reg('d22', 22,   IsScratch=1,          IsFP64=1, Aliases='d22, q11'), | 
|  | Reg('d23', 23,   IsScratch=1,          IsFP64=1, Aliases='d23, q11'), | 
|  | Reg('d24', 24,   IsScratch=1,          IsFP64=1, Aliases='d24, q12'), | 
|  | Reg('d25', 25,   IsScratch=1,          IsFP64=1, Aliases='d25, q12'), | 
|  | Reg('d26', 26,   IsScratch=1,          IsFP64=1, Aliases='d26, q13'), | 
|  | Reg('d27', 27,   IsScratch=1,          IsFP64=1, Aliases='d27, q13'), | 
|  | Reg('d28', 28,   IsScratch=1,          IsFP64=1, Aliases='d28, q14'), | 
|  | Reg('d29', 29,   IsScratch=1,          IsFP64=1, Aliases='d29, q14'), | 
|  | Reg('d30', 30,   IsScratch=1,          IsFP64=1, Aliases='d30, q15'), | 
|  | Reg('d31', 31,   IsScratch=1,          IsFP64=1, Aliases='d31, q15'), | 
|  | ] | 
|  |  | 
|  | Vec128 = [ | 
|  | Reg( 'q0',  0,   IsScratch=1, CCArg=1, IsVec128=1, Aliases= 'q0,  d0,  d1,  s0,  s1,  s2,  s3'), | 
|  | Reg( 'q1',  1,   IsScratch=1, CCArg=2, IsVec128=1, Aliases= 'q1,  d2,  d3,  s4,  s5,  s6,  s7'), | 
|  | Reg( 'q2',  2,   IsScratch=1, CCArg=3, IsVec128=1, Aliases= 'q2,  d4,  d5,  s8,  s9, s10, s11'), | 
|  | Reg( 'q3',  3,   IsScratch=1, CCArg=4, IsVec128=1, Aliases= 'q3,  d6,  d7, s12, s13, s14, s15'), | 
|  | Reg( 'q4',  4, IsPreserved=1,          IsVec128=1, Aliases= 'q4,  d8,  d9, s16, s17, s18, s19'), | 
|  | Reg( 'q5',  5, IsPreserved=1,          IsVec128=1, Aliases= 'q5, d10, d11, s20, s21, s22, s23'), | 
|  | Reg( 'q6',  6, IsPreserved=1,          IsVec128=1, Aliases= 'q6, d12, d13, s24, s25, s26, s27'), | 
|  | Reg( 'q7',  7, IsPreserved=1,          IsVec128=1, Aliases= 'q7, d14, d15, s28, s29, s30, s31'), | 
|  | Reg( 'q8',  8,   IsScratch=1,          IsVec128=1, Aliases= 'q8, d16, d17'), | 
|  | Reg( 'q9',  9,   IsScratch=1,          IsVec128=1, Aliases= 'q9, d18, d19'), | 
|  | Reg('q10', 10,   IsScratch=1,          IsVec128=1, Aliases='q10, d20, d21'), | 
|  | Reg('q11', 11,   IsScratch=1,          IsVec128=1, Aliases='q11, d22, d23'), | 
|  | Reg('q12', 12,   IsScratch=1,          IsVec128=1, Aliases='q12, d24, d25'), | 
|  | Reg('q13', 13,   IsScratch=1,          IsVec128=1, Aliases='q13, d26, d27'), | 
|  | Reg('q14', 14,   IsScratch=1,          IsVec128=1, Aliases='q14, d28, d29'), | 
|  | Reg('q15', 15,   IsScratch=1,          IsVec128=1, Aliases='q15, d30, d31'), | 
|  | ] | 
|  |  | 
|  | # TODO(jpp): Fix the pop emission, then emit FP64/Vec128 reverted. | 
|  | RegClasses = [('GPR', GPRs),  ('I64PAIR', I64Pairs), ('FP32', FP32), | 
|  | ('FP64', FP64), ('VEC128', Vec128)] | 
|  |  | 
|  | AllRegs = {} | 
|  | for _, RegClass in RegClasses: | 
|  | for Reg in RegClass: | 
|  | assert Reg.Name not in AllRegs | 
|  | AllRegs[Reg.Name] = Reg | 
|  |  | 
|  | for _, RegClass in RegClasses: | 
|  | for Reg in RegClass: | 
|  | for Alias in AllRegs[Reg.Name].Features.Aliases().Aliases: | 
|  | assert AllRegs[Alias].IsAnAliasOf(Reg), '%s VS %s' % (Reg, AllRegs[Alias]) | 
|  | assert (AllRegs[Alias].Features.LivesInGPR() == | 
|  | Reg.Features.LivesInGPR()), '%s VS %s' % (Reg, AllRegs[Alias]) | 
|  | assert (AllRegs[Alias].Features.LivesInVFP() == | 
|  | Reg.Features.LivesInVFP()), '%s VS %s' % (Reg, AllRegs[Alias]) | 
|  |  | 
|  | print ("// This file was auto generated by the {script} script.\n" | 
|  | "// Do not modify it: modify the script instead.\n" | 
|  | "\n" | 
|  | "#ifndef SUBZERO_SRC_ICEREGISTERSARM32_DEF\n" | 
|  | "#define SUBZERO_SRC_ICEREGISTERSARM32_DEF\n".format(script=os.path.basename(sys.argv[0]))) | 
|  |  | 
|  | for Name, RegClass in RegClasses: | 
|  | print '//{xmacro}'.format(xmacro=Reg.DefiningXMacro()) | 
|  | print "#define REGARM32_%s_TABLE" % Name, | 
|  | for Reg in RegClass: | 
|  | sys.stdout.write(' \\\n  X({Reg})'.format(Reg=Reg)) | 
|  | print '\n' | 
|  | print "#endif // SUBZERO_SRC_ICEREGISTERSARM32_DEF", |