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

Reply via email to