Gabe Black has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/49723 )

 (

58 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one. )Change subject: arch: Consolidate most of the RegVal based operands into a base class.
......................................................................

arch: Consolidate most of the RegVal based operands into a base class.

All the RegVal based operands except MiscRegs are consolidated, and
those classes are almost all consolidated, except for the RegClassType
they use.

Change-Id: I8494c7066e9d19411fd97d7cc5ac2078f799c2ac
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49723
Reviewed-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/isa_parser/operand_types.py
1 file changed, 58 insertions(+), 138 deletions(-)

Approvals:
  Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass




diff --git a/src/arch/isa_parser/operand_types.py b/src/arch/isa_parser/operand_types.py
index cdca6a6..13f7108 100755
--- a/src/arch/isa_parser/operand_types.py
+++ b/src/arch/isa_parser/operand_types.py
@@ -172,56 +172,7 @@

         return c_src + c_dest

-class IntRegOperand(RegOperand):
-    reg_class = 'IntRegClass'
-
-    def makeRead(self, predRead):
-        if (self.ctype == 'float' or self.ctype == 'double'):
-            error('Attempt to read integer register as FP')
-        if self.read_code != None:
-            return self.buildReadCode(predRead, 'getRegOperand')
-
-        int_reg_val = ''
-        if predRead:
-            int_reg_val = 'xc->getRegOperand(this, _sourceIndex++)'
-            if self.hasReadPred():
-                int_reg_val = '(%s) ? %s : 0' % \
-                              (self.read_predicate, int_reg_val)
-        else:
-            int_reg_val = 'xc->getRegOperand(this, %d)' % self.src_reg_idx
-
-        return '%s = %s;\n' % (self.base_name, int_reg_val)
-
-    def makeWrite(self, predWrite):
-        if (self.ctype == 'float' or self.ctype == 'double'):
-            error('Attempt to write integer register as FP')
-        if self.write_code != None:
-            return self.buildWriteCode(predWrite, 'setRegOperand')
-
-        if predWrite:
-            wp = 'true'
-            if self.hasWritePred():
-                wp = self.write_predicate
-
-            wcond = 'if (%s)' % (wp)
-            windex = '_destIndex++'
-        else:
-            wcond = ''
-            windex = '%d' % self.dest_reg_idx
-
-        wb = '''
-        %s
-        {
-            %s final_val = %s;
-            xc->setRegOperand(this, %s, final_val);\n
-            if (traceData) { traceData->setData(final_val); }
-        }''' % (wcond, self.ctype, self.base_name, windex)
-
-        return wb
-
-class FloatRegOperand(RegOperand):
-    reg_class = 'FloatRegClass'
-
+class RegValOperand(RegOperand):
     def makeRead(self, predRead):
         if self.read_code != None:
             return self.buildReadCode(predRead, 'getRegOperand')
@@ -229,39 +180,59 @@
         if predRead:
             rindex = '_sourceIndex++'
         else:
-            rindex = '%d' % self.src_reg_idx
+            rindex = str(self.src_reg_idx)
+        reg_val = f'xc->getRegOperand(this, {rindex})'

-        code = 'xc->getRegOperand(this, %s)' % rindex
         if self.ctype == 'float':
-            code = 'bitsToFloat32(%s)' % code
+            reg_val = f'bitsToFloat32({reg_val})'
         elif self.ctype == 'double':
-            code = 'bitsToFloat64(%s)' % code
-        return '%s = %s;\n' % (self.base_name, code)
+            reg_val = f'bitsToFloat64({reg_val})'
+
+        if predRead and self.hasReadPred():
+            reg_val = f'({self.read_predicate}) ? {reg_val} : 0'
+
+        return f'{self.base_name} = {reg_val};\n'

     def makeWrite(self, predWrite):
         if self.write_code != None:
             return self.buildWriteCode(predWrite, 'setRegOperand')

-        if predWrite:
-            wp = '_destIndex++'
-        else:
-            wp = '%d' % self.dest_reg_idx
+        reg_val = self.base_name

-        val = 'final_val'
         if self.ctype == 'float':
-            val = 'floatToBits32(%s)' % val
+            reg_val = f'floatToBits32({reg_val})'
         elif self.ctype == 'double':
-            val = 'floatToBits64(%s)' % val
+            reg_val = f'floatToBits64({reg_val})'

-        wp = 'xc->setRegOperand(this, %s, %s);' % (wp, val)
+        if predWrite:
+            wcond = ''
+            if self.hasWritePred():
+                wcond = f'if ({self.write_predicate})'
+            windex = '_destIndex++'
+        else:
+            wcond = ''
+            windex = str(self.dest_reg_idx)

-        wb = '''
-        {
-            %s final_val = %s;
-            %s\n
-            if (traceData) { traceData->setData(final_val); }
-        }''' % (self.ctype, self.base_name, wp)
-        return wb
+        return f'''
+        {wcond}
+        {{
+            RegVal final_val = {reg_val};
+            xc->setRegOperand(this, {windex}, final_val);
+            if (traceData)
+                traceData->setData(final_val);
+        }}'''
+
+class IntRegOperand(RegValOperand):
+    reg_class = 'IntRegClass'
+
+class FloatRegOperand(RegValOperand):
+    reg_class = 'FloatRegClass'
+
+class CCRegOperand(RegValOperand):
+    reg_class = 'CCRegClass'
+
+class VecElemOperand(RegValOperand):
+    reg_class = 'VecElemClass'

 class VecRegOperand(RegOperand):
     reg_class = 'VecRegClass'
@@ -391,27 +362,6 @@
         if self.is_dest:
             self.op_rd = self.makeReadW(predWrite) + self.op_rd

-class VecElemOperand(RegOperand):
-    reg_class = 'VecElemClass'
-
-    def makeRead(self, predRead):
-        c_read = f'xc->getRegOperand(this, {self.src_reg_idx})'
-
-        if self.ctype == 'float':
-            c_read = f'bitsToFloat32({c_read})'
-        elif self.ctype == 'double':
-            c_read = f'bitsToFloat64({c_read})'
-
-        return f'{self.base_name} = {c_read};\n'
-
-    def makeWrite(self, predWrite):
-        val = self.base_name
-        if self.ctype == 'float':
-            val = f'floatToBits32({val})'
-        elif self.ctype == 'double':
-            val = f'floatToBits64({val})'
-        return f'\n\txc->setRegOperand(this, {self.dest_reg_idx}, {val});'
-
 class VecPredRegOperand(RegOperand):
     reg_class = 'VecPredRegClass'

@@ -473,53 +423,6 @@
         if self.is_dest:
             self.op_rd = self.makeReadW(predWrite) + self.op_rd

-class CCRegOperand(RegOperand):
-    reg_class = 'CCRegClass'
-
-    def makeRead(self, predRead):
-        if (self.ctype == 'float' or self.ctype == 'double'):
-            error('Attempt to read condition-code register as FP')
-        if self.read_code != None:
-            return self.buildReadCode(predRead, 'getRegOperand')
-
-        int_reg_val = ''
-        if predRead:
-            int_reg_val = 'xc->getRegOperand(this, _sourceIndex++)'
-            if self.hasReadPred():
-                int_reg_val = '(%s) ? %s : 0' % \
-                              (self.read_predicate, int_reg_val)
-        else:
-            int_reg_val = 'xc->getRegOperand(this, %d)' % self.src_reg_idx
-
-        return '%s = %s;\n' % (self.base_name, int_reg_val)
-
-    def makeWrite(self, predWrite):
-        if (self.ctype == 'float' or self.ctype == 'double'):
-            error('Attempt to write condition-code register as FP')
-        if self.write_code != None:
-            return self.buildWriteCode(predWrite, 'setRegOperand')
-
-        if predWrite:
-            wp = 'true'
-            if self.hasWritePred():
-                wp = self.write_predicate
-
-            wcond = 'if (%s)' % (wp)
-            windex = '_destIndex++'
-        else:
-            wcond = ''
-            windex = '%d' % self.dest_reg_idx
-
-        wb = '''
-        %s
-        {
-            %s final_val = %s;
-            xc->setRegOperand(this, %s, final_val);\n
-            if (traceData) { traceData->setData(final_val); }
-        }''' % (wcond, self.ctype, self.base_name, windex)
-
-        return wb
-
 class ControlRegOperand(Operand):
     reg_class = 'MiscRegClass'


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49723
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: I8494c7066e9d19411fd97d7cc5ac2078f799c2ac
Gerrit-Change-Number: 49723
Gerrit-PatchSet: 60
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to