blob: 40b61e582e7c7a06ddb025614d3c1d8518755e39 [file] [log] [blame]
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",