Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/49750 )
Change subject: arch: Remove plumbing for an op_idx value in ISA operands.
......................................................................
arch: Remove plumbing for an op_idx value in ISA operands.
Now that op_idx is trivial to calculate (just src_reg_idx or
dest_reg_idx), there's no need to have the indirection and extra
mechanism to funnel a precalculated value around.
Change-Id: I37daeb646b85e050c4b832af28d054ecc3c338b1
---
M src/arch/arm/isa/operands.isa
M src/arch/isa_parser/operand_types.py
M src/arch/x86/isa/operands.isa
3 files changed, 104 insertions(+), 101 deletions(-)
diff --git a/src/arch/arm/isa/operands.isa b/src/arch/arm/isa/operands.isa
index 31c6f34..79fd17c 100644
--- a/src/arch/arm/isa/operands.isa
+++ b/src/arch/arm/isa/operands.isa
@@ -110,16 +110,17 @@
class IntReg(IntRegNPC):
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = ({self.reg_spec} == PCReg) ? ' \
- f'readPC(xc) : xc->getRegOperand(this, {op_idx});\n'
+ f'readPC(xc) : xc->getRegOperand(' \
+ f'this, {self.src_reg_idx});\n'
@overrideInOperand
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return f'''
if ({self.reg_spec} == PCReg)
setNextPC(xc, {self.base_name});
else
- xc->setRegOperand(this, {op_idx}, {self.base_name});
+ xc->setRegOperand(this, {self.dest_reg_idx},
{self.base_name});
if (traceData)
traceData->setData({self.base_name});
'''
@@ -130,26 +131,26 @@
class IntRegAPC(IntReg):
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = ({self.reg_spec} == PCReg) ? ' \
f'(roundDown(readPC(xc), 4)) : ' \
- f'xc->getRegOperand(this, {op_idx});\n'
+ f'xc->getRegOperand(this, {self.src_reg_idx});\n'
class IntRegIWPC(IntReg):
@overrideInOperand
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return f'''
if ({self.reg_spec} == PCReg)
setIWNextPC(xc, {self.base_name});
else
- xc->setRegOperand(this, {op_idx}, {self.base_name});
+ xc->setRegOperand(this, {self.dest_reg_idx},
{self.base_name});
if (traceData)
traceData->setData({self.base_name});
'''
class IntRegAIWPC(IntReg):
@overrideInOperand
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return f'''
if ({self.reg_spec} == PCReg) {"{"}
if ((bool)THUMB)
@@ -157,7 +158,7 @@
else
setIWNextPC(xc, {self.base_name});
{"}"} else {"{"}
- xc->setRegOperand(this, {op_idx}, {self.base_name});
+ xc->setRegOperand(this, {self.dest_reg_idx},
{self.base_name});
{"}"}
if (traceData)
traceData->setData({self.base_name});
@@ -169,13 +170,14 @@
return f'(({self.reg_spec}) == gem5::ArmISA::INTREG_ZERO) ? ' \
f'RegId() : RegId({self.reg_class}, {self.reg_spec})'
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = ' \
- f'(xc->getRegOperand(this, {op_idx})) &
mask(intWidth);\n'
+ f'(xc->getRegOperand(this, {self.src_reg_idx})) & ' \
+ f'mask(intWidth);\n'
@overrideInOperand
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return f'''
- xc->setRegOperand(this, {op_idx}, {self.base_name} &
+ xc->setRegOperand(this, {self.dest_reg_idx}, {self.base_name} &
mask(intWidth));
if (traceData)
traceData->setData({self.base_name});
@@ -185,14 +187,14 @@
class IntRegX64(IntReg64):
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = ' \
- f'(xc->getRegOperand(this, {op_idx}) & ' \
+ f'(xc->getRegOperand(this, {self.src_reg_idx}) & ' \
'mask(aarch64 ? 64 : 32));\n'
@overrideInOperand
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return f'''
- xc->setRegOperand(this, {op_idx}, {self.base_name} &
+ xc->setRegOperand(this, {self.dest_reg_idx}, {self.base_name} &
mask(aarch64 ? 64 : 32));
if (traceData)
traceData->setData({self.base_name});
@@ -200,13 +202,15 @@
class IntRegW64(IntReg64):
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = ' \
- f'(xc->getRegOperand(this, {op_idx})) & mask(32);\n'
+ f'(xc->getRegOperand(this, {self.src_reg_idx})) & ' \
+ f'mask(32);\n'
@overrideInOperand
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return f'''
- xc->setRegOperand(this, {op_idx}, {self.base_name} & mask(32));
+ xc->setRegOperand(this, {self.dest_reg_idx}, {self.base_name} &
+ mask(32));
if (traceData)
traceData->setData({self.base_name});
'''
@@ -221,11 +225,11 @@
class CntrlNsBankedReg(CntrlReg):
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = ' \
f'xc->readMiscReg(snsBankedIndex(op1, xc->tcBase()));\n'
@overrideInOperand
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return f'''
xc->setMiscReg(snsBankedIndex(dest, xc->tcBase()),
{self.base_name});
diff --git a/src/arch/isa_parser/operand_types.py
b/src/arch/isa_parser/operand_types.py
index f38fb51..eff8155 100755
--- a/src/arch/isa_parser/operand_types.py
+++ b/src/arch/isa_parser/operand_types.py
@@ -150,22 +150,14 @@
self.op_decl = self.makeDecl()
if self.is_src:
- if hasattr(self, 'src_reg_idx'):
- op_idx = str(self.src_reg_idx)
- else:
- op_idx = None
- self.op_rd = self.makeRead(op_idx)
+ self.op_rd = self.makeRead()
self.op_src_decl = self.makeDecl()
else:
self.op_rd = ''
self.op_src_decl = ''
if self.is_dest:
- if hasattr(self, 'dest_reg_idx'):
- op_idx = str(self.dest_reg_idx)
- else:
- op_idx = None
- self.op_wb = self.makeWrite(op_idx)
+ self.op_wb = self.makeWrite()
self.op_dest_decl = self.makeDecl()
else:
self.op_wb = ''
@@ -216,8 +208,8 @@
return c_src + c_dest
class RegOperand(BaseRegOperand):
- def makeRead(self, op_idx):
- reg_val = f'xc->getRegOperand(this, {op_idx})'
+ def makeRead(self):
+ reg_val = f'xc->getRegOperand(this, {self.src_reg_idx})'
if self.ctype == 'float':
reg_val = f'bitsToFloat32({reg_val})'
@@ -226,7 +218,7 @@
return f'{self.base_name} = {reg_val};\n'
- def makeWrite(self, op_idx):
+ def makeWrite(self):
reg_val = self.base_name
if self.ctype == 'float':
@@ -238,9 +230,10 @@
return f'''
{{
RegVal final_val = {reg_val};
- xc->setRegOperand(this, {op_idx}, final_val);
- if (traceData)
+ xc->setRegOperand(this, {self.dest_reg_idx}, final_val);
+ if (traceData) {{
traceData->setData(final_val);
+ }}
}}'''
class RegOperandDesc(OperandDesc):
@@ -309,16 +302,18 @@
(ctype, elem_name, self.base_name, elem_spec)
return c_read
- def makeReadW(self, op_idx):
- c_readw = f'\t\tauto &tmp_d{op_idx} = \n' \
+ def makeReadW(self):
+ tmp_name = f'tmp_d{self.dest_reg_idx}'
+ c_readw = f'\t\tauto &{tmp_name} = \n' \
f'\t\t *({self.parser.namespace}::VecRegContainer
*)\n' \
- f'\t\t xc->getWritableRegOperand(this, {op_idx});\n'
+ f'\t\t xc->getWritableRegOperand(\n' \
+ f'\t\t this, {self.dest_reg_idx});\n'
if self.elemExt:
- c_readw += '\t\tauto %s = tmp_d%s.as<%s>();\n' %
(self.base_name,
- op_idx, self.parser.operandTypeMap[self.elemExt])
+ ext = f'{self.parser.operandTypeMap[self.elemExt]}'
+ c_readw += f'\t\tauto {self.base_name} =
{tmp_name}.as<{ext}>();\n'
if self.ext:
- c_readw += '\t\tauto %s = tmp_d%s.as<%s>();\n' %
(self.base_name,
- op_idx, self.parser.operandTypeMap[self.ext])
+ ext = f'{self.parser.operandTypeMap[self.ext]}'
+ c_readw += f'\t\tauto {self.base_name} =
{tmp_name}.as<{ext}>();\n'
if hasattr(self, 'active_elems'):
if self.active_elems:
for elem in self.active_elems:
@@ -339,41 +334,42 @@
(elem_name, name, elem_spec)
return c_read
- def makeRead(self, op_idx):
+ def makeRead(self):
name = self.base_name
if self.is_dest and self.is_src:
name += '_merger'
+ tmp_name = f'tmp_s{self.src_reg_idx}'
c_read = f'\t\t{self.parser.namespace}::VecRegContainer ' \
- f'\t\t tmp_s{op_idx};\n' \
- f'\t\txc->getRegOperand(this, {op_idx},
&tmp_s{op_idx});\n'
+ f'{tmp_name};\n' \
+ f'\t\txc->getRegOperand(this, {self.src_reg_idx},\n' \
+ f'\t\t &{tmp_name});\n'
# If the parser has detected that elements are being access, create
# the appropriate view
if self.elemExt:
- c_read += '\t\tauto %s = tmp_s%s.as<%s>();\n' % \
- (name, op_idx, self.parser.operandTypeMap[self.elemExt])
+ ext = f'{self.parser.operandTypeMap[self.elemExt]}'
+ c_read += f'\t\tauto {name} = {tmp_name}.as<{ext}>();\n'
if self.ext:
- c_read += '\t\tauto %s = tmp_s%s.as<%s>();\n' % \
- (name, op_idx, self.parser.operandTypeMap[self.ext])
+ ext = f'{self.parser.operandTypeMap[self.ext]}'
+ c_read += f'\t\tauto {name} = {tmp_name}.as<{ext}>();\n'
if hasattr(self, 'active_elems'):
if self.active_elems:
for elem in self.active_elems:
c_read += self.makeReadElem(elem, name)
return c_read
- def makeWrite(self, op_idx):
- wb = '''
- if (traceData) {
- traceData->setData(tmp_d%s);
- }
- ''' % op_idx
+ def makeWrite(self):
+ wb = f'''
+ if (traceData) {{
+ traceData->setData(tmp_d{self.dest_reg_idx});
+ }}
+ '''
return wb
def finalize(self):
super(VecRegOperand, self).finalize()
if self.is_dest:
- op_idx = str(self.dest_reg_idx)
- self.op_rd = self.makeReadW(op_idx) + self.op_rd
+ self.op_rd = self.makeReadW() + self.op_rd
class VecRegOperandDesc(RegOperandDesc):
def __init__(self, *args, **kwargs):
@@ -386,40 +382,40 @@
def makeDecl(self):
return ''
- def makeRead(self, op_idx):
- c_read = f'\t\t{self.parser.namespace}::VecPredRegContainer ' \
- f'\t\t tmp_s{op_idx}; ' \
- f'xc->getRegOperand(this, {op_idx}, &tmp_s{op_idx});\n'
+ def makeRead(self):
+ tmp_name = f'tmp_s{self.src_reg_idx}'
+ c_read = f'\t\t{self.parser.namespace}::VecPredRegContainer \n' \
+ f'\t\t {tmp_name};\n' \
+ f'xc->getRegOperand(this, {self.src_reg_idx}, ' \
+ f'&{tmp_name});\n'
if self.ext:
- c_read += f'\t\tauto {self.base_name} = ' \
- f'tmp_s{op_idx}.as<' \
+ c_read += f'\t\tauto {self.base_name} = {tmp_name}.as<' \
f'{self.parser.operandTypeMap[self.ext]}>();\n'
return c_read
- def makeReadW(self, op_idx):
- c_readw = f'\t\tauto &tmp_d{op_idx} = \n' \
+ def makeReadW(self):
+ tmp_name = f'tmp_d{self.dest_reg_idx}'
+ c_readw = f'\t\tauto &{tmp_name} = \n' \
f'\t\t *({self.parser.namespace}::' \
f'VecPredRegContainer *)xc->getWritableRegOperand(' \
- f'this, {op_idx});\n'
+ f'this, {self.dest_reg_idx});\n'
if self.ext:
- c_readw += '\t\tauto %s = tmp_d%s.as<%s>();\n' % (
- self.base_name, op_idx,
- self.parser.operandTypeMap[self.ext])
+ c_readw += f'\t\tauto {self.base_name} = {tmp_name}.as<' \
+ f'{self.parser.operandTypeMap[self.ext]}>();\n'
return c_readw
- def makeWrite(self, op_idx):
- wb = '''
- if (traceData) {
- traceData->setData(tmp_d%s);
- }
- ''' % op_idx
+ def makeWrite(self):
+ wb = f'''
+ if (traceData) {{
+ traceData->setData(tmp_d{self.dest_reg_idx});
+ }}
+ '''
return wb
def finalize(self):
super(VecPredRegOperand, self).finalize()
if self.is_dest:
- op_idx = str(self.dest_reg_idx)
- self.op_rd = self.makeReadW(op_idx) + self.op_rd
+ self.op_rd = self.makeReadW() + self.op_rd
class VecPredRegOperandDesc(RegOperandDesc):
def __init__(self, *args, **kwargs):
@@ -447,21 +443,24 @@
return c_src + c_dest
- def makeRead(self, op_idx):
+ def makeRead(self):
bit_select = 0
if (self.ctype == 'float' or self.ctype == 'double'):
error('Attempt to read control register as FP')
- return '%s = xc->readMiscRegOperand(this, %s);\n' % \
- (self.base_name, op_idx)
+ return f'{self.base_name} = ' \
+ f'xc->readMiscRegOperand(this, {self.src_reg_idx});\n'
- def makeWrite(self, op_idx):
+ def makeWrite(self):
if (self.ctype == 'float' or self.ctype == 'double'):
error('Attempt to write control register as FP')
- wb = 'xc->setMiscRegOperand(this, %s, %s);\n' % \
- (op_idx, self.base_name)
- wb += 'if (traceData) { traceData->setData(%s); }' % \
- self.base_name
+ wb = f'xc->setMiscRegOperand(this, ' \
+ f'{self.dest_reg_idx}, {self.base_name});\n'
+ wb += f'''
+ if (traceData) {{
+ traceData->setData({self.base_name});
+ }}
+ '''
return wb
@@ -479,12 +478,12 @@
def makeDecl(self):
# Declare memory data variable.
- return '%s %s = {};\n' % (self.ctype, self.base_name)
+ return f'{self.ctype} {self.base_name} = {{}};\n'
- def makeRead(self, op_idx):
+ def makeRead(self):
return ''
- def makeWrite(self, op_idx):
+ def makeWrite(self):
return ''
class MemOperandDesc(OperandDesc):
@@ -495,16 +494,16 @@
def makeConstructor(self):
return ''
- def makeRead(self, op_idx):
+ def makeRead(self):
if self.reg_spec:
# A component of the PC state.
- return '%s = __parserAutoPCState.%s();\n' % \
- (self.base_name, self.reg_spec)
+ return f'{self.base_name} = ' \
+ f'__parserAutoPCState.{self.reg_spec}();\n'
else:
# The whole PC state itself.
- return '%s = xc->pcState();\n' % self.base_name
+ return f'{self.base_name} = xc->pcState();\n'
- def makeWrite(self, op_idx):
+ def makeWrite(self):
if self.reg_spec:
# A component of the PC state.
return '__parserAutoPCState.%s(%s);\n' % \
diff --git a/src/arch/x86/isa/operands.isa b/src/arch/x86/isa/operands.isa
index 4e61011..677396d 100644
--- a/src/arch/x86/isa/operands.isa
+++ b/src/arch/x86/isa/operands.isa
@@ -66,9 +66,9 @@
class PickedReg(IntReg):
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = pick(xc->getRegOperand(' \
- f'this, {op_idx}), {self.reg_spec}, ' \
+ f'this, {self.src_reg_idx}), {self.reg_spec}, ' \
f'{self.data_size});\n'
def __init__(self, idx, id, data_size='dataSize'):
@@ -76,9 +76,9 @@
class SignedPickedReg(IntReg):
@overrideInOperand
- def makeRead(self, op_idx):
+ def makeRead(self):
return f'{self.base_name} = signedPick(xc->getRegOperand(' \
- f'this, {op_idx}), {self.reg_spec}, ' \
+ f'this, {self.src_reg_idx}), {self.reg_spec}, ' \
f'{self.data_size});\n'
def __init__(self, idx, id, data_size='dataSize'):
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49750
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I37daeb646b85e050c4b832af28d054ecc3c338b1
Gerrit-Change-Number: 49750
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s