Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/49114 )

Change subject: cpu,arch: Turn the read|set*Operand methods into get/setRegOperand.
......................................................................

cpu,arch: Turn the read|set*Operand methods into get/setRegOperand.

This simplifies and generalizes the ExecContext interface significantly.
This does *not* change the "Writeable" accessors for the vec and pred
registers, and it also ignores MiscRegs which have some different
semantics.

Change-Id: I8cb80da890fc8915f03be04e136662a257d06946
---
M src/arch/arm/insts/tme64ruby.cc
M src/arch/generic/vec_reg.hh
M src/arch/isa_parser/operand_types.py
M src/arch/mips/isa/formats/fp.isa
M src/arch/x86/isa/operands.isa
M src/cpu/checker/cpu.hh
M src/cpu/exec_context.hh
M src/cpu/minor/exec_context.hh
M src/cpu/o3/dyn_inst.hh
M src/cpu/simple/exec_context.hh
10 files changed, 158 insertions(+), 462 deletions(-)



diff --git a/src/arch/arm/insts/tme64ruby.cc b/src/arch/arm/insts/tme64ruby.cc
index 26ff3d0..6ebaf73 100644
--- a/src/arch/arm/insts/tme64ruby.cc
+++ b/src/arch/arm/insts/tme64ruby.cc
@@ -123,7 +123,7 @@
             ArmISA::globalClearExclusive(tc);
         }

-        xc->setIntRegOperand(this, 0, (Dest64) & mask(intWidth));
+        xc->setRegOperand(this, 0, (Dest64) & mask(intWidth));


         uint64_t final_val = Dest64;
@@ -156,7 +156,7 @@

     if (fault == NoFault) {
         uint64_t final_val = Dest64;
-        xc->setIntRegOperand(this, 0, (Dest64) & mask(intWidth));
+        xc->setRegOperand(this, 0, (Dest64) & mask(intWidth));
         if (traceData) { traceData->setData(final_val); }
     }

diff --git a/src/arch/generic/vec_reg.hh b/src/arch/generic/vec_reg.hh
index 1bc9099..4f7588b 100644
--- a/src/arch/generic/vec_reg.hh
+++ b/src/arch/generic/vec_reg.hh
@@ -68,16 +68,17 @@
  * ...
  * // Usage example, for a macro op:
  * VecFloat8Add(ExecContext* xd) {
- * // Request source vector register to the execution context (const as it
- *    // is read only).
- *    const Vec512& vsrc1raw = xc->readVecRegOperand(this, 0);
+ *    // Request source vector register to the execution context.
+ *    Vec512 vsrc1raw;
+ *    xc->getRegOperand(this, 0, &vsrc1raw);
  *    // View it as a vector of floats (we could just specify the first
* // template parametre, the second has a default value that works, and the
  *    // last one is derived by the constness of vsrc1raw).
  *    VecRegT<float, 8, true>& vsrc1 = vsrc1raw->as<float, 8>();
  *
  *    // Second source and view
- *    const Vec512& vsrc2raw = xc->readVecRegOperand(this, 1);
+ *    Vec512 vsrc2raw;
+ *    xc->getRegOperand(this, 1, &vsrc2raw);
  *    VecRegT<float, 8, true>& vsrc2 = vsrc2raw->as<float, 8>();
  *
  *    // Destination and view
diff --git a/src/arch/isa_parser/operand_types.py b/src/arch/isa_parser/operand_types.py
index bed58d7..69a1131 100755
--- a/src/arch/isa_parser/operand_types.py
+++ b/src/arch/isa_parser/operand_types.py
@@ -202,16 +202,16 @@
         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, 'readIntRegOperand')
+            return self.buildReadCode(predRead, 'getRegOperand')

         int_reg_val = ''
         if predRead:
-            int_reg_val = 'xc->readIntRegOperand(this, _sourceIndex++)'
+            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->readIntRegOperand(this, %d)' % self.src_reg_idx
+            int_reg_val = 'xc->getRegOperand(this, %d)' % self.src_reg_idx

         return '%s = %s;\n' % (self.base_name, int_reg_val)

@@ -219,7 +219,7 @@
         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, 'setIntRegOperand')
+            return self.buildWriteCode(predWrite, 'setRegOperand')

         if predWrite:
             wp = 'true'
@@ -236,7 +236,7 @@
         %s
         {
             %s final_val = %s;
-            xc->setIntRegOperand(this, %s, final_val);\n
+            xc->setRegOperand(this, %s, final_val);\n
             if (traceData) { traceData->setData(final_val); }
         }''' % (wcond, self.ctype, self.base_name, windex)

@@ -266,14 +266,14 @@

     def makeRead(self, predRead):
         if self.read_code != None:
-            return self.buildReadCode(predRead, 'readFloatRegOperandBits')
+            return self.buildReadCode(predRead, 'getRegOperand')

         if predRead:
             rindex = '_sourceIndex++'
         else:
             rindex = '%d' % self.src_reg_idx

-        code = 'xc->readFloatRegOperandBits(this, %s)' % rindex
+        code = 'xc->getRegOperand(this, %s)' % rindex
         if self.ctype == 'float':
             code = 'bitsToFloat32(%s)' % code
         elif self.ctype == 'double':
@@ -282,7 +282,7 @@

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

         if predWrite:
             wp = '_destIndex++'
@@ -295,7 +295,7 @@
         elif self.ctype == 'double':
             val = 'floatToBits64(%s)' % val

-        wp = 'xc->setFloatRegOperandBits(this, %s, %s);' % (wp, val)
+        wp = 'xc->setRegOperand(this, %s, %s);' % (wp, val)

         wb = '''
         {
@@ -407,7 +407,7 @@
         return c_read

     def makeRead(self, predRead):
-        func = 'readVecRegOperand'
+        func = 'getRegOperand'
         if self.read_code != None:
             return self.buildReadCode(predRead, func)

@@ -420,8 +420,8 @@
         if self.is_dest and self.is_src:
             name += '_merger'

-        c_read =  '\t\t%s& tmp_s%s = xc->%s(this, %s);\n' \
-                % ('const TheISA::VecRegContainer', rindex, func, rindex)
+        c_read = f'\t\tTheISA::VecRegContainer tmp_s{rindex};\n' \
+                 f'\t\txc->{func}(this, {rindex}, &tmp_s{rindex});\n'
         # If the parser has detected that elements are being access, create
         # the appropriate view
         if self.elemExt:
@@ -437,7 +437,7 @@
         return c_read

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

@@ -485,27 +485,14 @@
         return c_src + c_dest

     def makeRead(self, predRead):
-        c_read = 'xc->readVecElemOperand(this, %d)' % self.src_reg_idx
+        c_read = \
+ f'xc->getRegOperand(this, {self.src_reg_idx}, &{self.base_name})'

-        if self.ctype == 'float':
-            c_read = 'bitsToFloat32(%s)' % c_read
-        elif self.ctype == 'double':
-            c_read = 'bitsToFloat64(%s)' % c_read
-
-        return '\n\t%s %s = %s;\n' % (self.ctype, self.base_name, c_read)
+        return f'\n\t{self.ctype} {self.base_name}; {c_read};\n'

     def makeWrite(self, predWrite):
-        if self.ctype == 'float':
-            c_write = 'floatToBits32(%s)' % self.base_name
-        elif self.ctype == 'double':
-            c_write = 'floatToBits64(%s)' % self.base_name
-        else:
-            c_write = self.base_name
-
-        c_write = ('\n\txc->setVecElemOperand(this, %d, %s);' %
-                  (self.dest_reg_idx, c_write))
-
-        return c_write
+        return f'\n\txc->setRegOperand(this, {self.dest_reg_idx}, ' \
+               f'&{self.base_name});'

 class VecPredRegOperand(Operand):
     reg_class = 'VecPredRegClass'
@@ -537,7 +524,7 @@
         return c_src + c_dest

     def makeRead(self, predRead):
-        func = 'readVecPredRegOperand'
+        func = 'getRegOperand'
         if self.read_code != None:
             return self.buildReadCode(predRead, func)

@@ -546,12 +533,12 @@
         else:
             rindex = '%d' % self.src_reg_idx

-        c_read =  '\t\t%s& tmp_s%s = xc->%s(this, %s);\n' % (
-                'const TheISA::VecPredRegContainer', rindex, func, rindex)
+        c_read =  f'\t\tTheISA::VecPredRegContainer tmp_s{rindex}; ' \
+                  f'xc->{func}(this, {rindex}, &tmp_s{rindex});\n'
         if self.ext:
-            c_read += '\t\tauto %s = tmp_s%s.as<%s>();\n' % (
-                    self.base_name, rindex,
-                    self.parser.operandTypeMap[self.ext])
+            c_read += f'\t\tauto {self.base_name} = ' \
+                      f'tmp_s{rindex}.as<' \
+                      f'{self.parser.operandTypeMap[self.ext]}>();\n'
         return c_read

     def makeReadW(self, predWrite):
@@ -573,7 +560,7 @@
         return c_readw

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

@@ -621,16 +608,16 @@
         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, 'readCCRegOperand')
+            return self.buildReadCode(predRead, 'getRegOperand')

         int_reg_val = ''
         if predRead:
-            int_reg_val = 'xc->readCCRegOperand(this, _sourceIndex++)'
+            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->readCCRegOperand(this, %d)' % self.src_reg_idx
+            int_reg_val = 'xc->getRegOperand(this, %d)' % self.src_reg_idx

         return '%s = %s;\n' % (self.base_name, int_reg_val)

@@ -638,7 +625,7 @@
         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, 'setCCRegOperand')
+            return self.buildWriteCode(predWrite, 'setRegOperand')

         if predWrite:
             wp = 'true'
@@ -655,7 +642,7 @@
         %s
         {
             %s final_val = %s;
-            xc->setCCRegOperand(this, %s, final_val);\n
+            xc->setRegOperand(this, %s, final_val);\n
             if (traceData) { traceData->setData(final_val); }
         }''' % (wcond, self.ctype, self.base_name, windex)

diff --git a/src/arch/mips/isa/formats/fp.isa b/src/arch/mips/isa/formats/fp.isa
index 3f1e37e..bfcdb8c 100644
--- a/src/arch/mips/isa/formats/fp.isa
+++ b/src/arch/mips/isa/formats/fp.isa
@@ -104,11 +104,11 @@
         assert(sizeof(T) == 4);

         for (int i = 0; i < inst->numSrcRegs(); i++) {
-            uint64_t src_bits = xc->readFloatRegOperandBits(inst, 0);
+            uint64_t src_bits = xc->getRegOperand(inst, 0);

             if (isNan(&src_bits, 32) ) {
                 mips_nan = MIPS32_QNAN;
-                xc->setFloatRegOperandBits(inst, 0, mips_nan);
+                xc->setRegOperand(inst, 0, mips_nan);
                 if (traceData) { traceData->setData(mips_nan); }
                 return true;
             }
@@ -129,7 +129,7 @@
             mips_nan = MIPS32_QNAN;

             //Set value to QNAN
-            cpu->setFloatRegOperandBits(inst, 0, mips_nan);
+            cpu->setRegOperand(inst, 0, mips_nan);

             //Read FCSR from FloatRegFile
             uint32_t fcsr_bits =
diff --git a/src/arch/x86/isa/operands.isa b/src/arch/x86/isa/operands.isa
index 2bf253e..0fe1a85 100644
--- a/src/arch/x86/isa/operands.isa
+++ b/src/arch/x86/isa/operands.isa
@@ -58,11 +58,11 @@
         return ('IntReg', 'uqw', idx, 'IsInteger', id)
     def pickedReg(idx, id, size='dataSize'):
         return ('IntReg', 'uqw', idx, 'IsInteger', id,
-                'pick(xc->readIntRegOperand(this, %(op_idx)s), '
+                'pick(xc->getRegOperand(this, %(op_idx)s), '
                 '%(reg_idx)s, ' + size + ')')
     def signedPickedReg(idx, id, size='dataSize'):
         return ('IntReg', 'uqw', idx, 'IsInteger', id,
-                'signedPick(xc->readIntRegOperand(this, %(op_idx)s), '
+                'signedPick(xc->getRegOperand(this, %(op_idx)s), '
                 '%(reg_idx)s, ' + size + ')')
     def floatReg(idx, id):
         return ('FloatReg', 'df', idx, 'IsFloating', id)
diff --git a/src/cpu/checker/cpu.hh b/src/cpu/checker/cpu.hh
index cdcab6b..0935ae2 100644
--- a/src/cpu/checker/cpu.hh
+++ b/src/cpu/checker/cpu.hh
@@ -182,26 +182,15 @@
     // to do).

     RegVal
-    readIntRegOperand(const StaticInst *si, int idx) override
+    getRegOperand(const StaticInst *si, int idx) override
     {
         return thread->getReg(si->srcRegIdx(idx));
     }

-    RegVal
-    readFloatRegOperandBits(const StaticInst *si, int idx) override
+    void
+    getRegOperand(const StaticInst *si, int idx, void *val) override
     {
-        return thread->getReg(si->srcRegIdx(idx));
-    }
-
-    /**
-     * Read source vector register operand.
-     */
-    TheISA::VecRegContainer
-    readVecRegOperand(const StaticInst *si, int idx) const override
-    {
-        TheISA::VecRegContainer val;
-        thread->getReg(si->srcRegIdx(idx), &val);
-        return val;
+        thread->getReg(si->srcRegIdx(idx), val);
     }

     /**
@@ -215,21 +204,6 @@
         return thread->getWritableVecReg(reg);
     }

-    TheISA::VecElem
-    readVecElemOperand(const StaticInst *si, int idx) const override
-    {
-        const RegId& reg = si->srcRegIdx(idx);
-        return thread->readVecElem(reg);
-    }
-
-    TheISA::VecPredRegContainer
-    readVecPredRegOperand(const StaticInst *si, int idx) const override
-    {
-        TheISA::VecPredRegContainer val;
-        thread->getReg(si->srcRegIdx(idx), &val);
-        return val;
-    }
-
     TheISA::VecPredRegContainer&
     getWritableVecPredRegOperand(const StaticInst *si, int idx) override
     {
@@ -238,12 +212,6 @@
         return thread->getWritableVecPredReg(reg);
     }

-    RegVal
-    readCCRegOperand(const StaticInst *si, int idx) override
-    {
-        return thread->getReg(si->srcRegIdx(idx));
-    }
-
     template<typename T>
     void
     setScalarResult(T&& t)
@@ -277,50 +245,17 @@
     }

     void
-    setIntRegOperand(const StaticInst *si, int idx, RegVal val) override
+    setRegOperand(const StaticInst *si, int idx, RegVal val) override
     {
         thread->setReg(si->destRegIdx(idx), val);
         setScalarResult(val);
     }

     void
- setFloatRegOperandBits(const StaticInst *si, int idx, RegVal val) override
+    setRegOperand(const StaticInst *si, int idx, const void *val) override
     {
         thread->setReg(si->destRegIdx(idx), val);
-        setScalarResult(val);
-    }
-
-    void
-    setCCRegOperand(const StaticInst *si, int idx, RegVal val) override
-    {
-        thread->setReg(si->destRegIdx(idx), val);
-        setScalarResult((uint64_t)val);
-    }
-
-    void
-    setVecRegOperand(const StaticInst *si, int idx,
-                     const TheISA::VecRegContainer& val) override
-    {
-        thread->setReg(si->destRegIdx(idx), &val);
-        setVecResult(val);
-    }
-
-    void
-    setVecElemOperand(const StaticInst *si, int idx,
-                      const TheISA::VecElem val) override
-    {
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(VecElemClass));
-        thread->setVecElem(reg, val);
-        setVecElemResult(val);
-    }
-
-    void
-    setVecPredRegOperand(const StaticInst *si, int idx,
-                         const TheISA::VecPredRegContainer& val) override
-    {
-        thread->setReg(si->destRegIdx(idx), &val);
-        setVecPredResult(val);
+        //TODO setVecResult, setVecPredResult setVecElemResult?
     }

     bool readPredicate() const override { return thread->readPredicate(); }
diff --git a/src/cpu/exec_context.hh b/src/cpu/exec_context.hh
index 6192dc8..b2d4955 100644
--- a/src/cpu/exec_context.hh
+++ b/src/cpu/exec_context.hh
@@ -73,87 +73,25 @@
 class ExecContext
 {
   public:
-    /**
-     * @{
-     * @name Integer Register Interfaces
-     *
-     */

-    /** Reads an integer register. */
-    virtual RegVal readIntRegOperand(const StaticInst *si, int idx) = 0;
-
-    /** Sets an integer register to a value. */
-    virtual void setIntRegOperand(const StaticInst *si,
-                                  int idx, RegVal val) = 0;
-
-    /** @} */
-
-
-    /**
-     * @{
-     * @name Floating Point Register Interfaces
-     */
-
-    /** Reads a floating point register in its binary format, instead
-     * of by value. */
- virtual RegVal readFloatRegOperandBits(const StaticInst *si, int idx) = 0;
-
-    /** Sets the bits of a floating point register of single width
-     * to a binary value. */
-    virtual void setFloatRegOperandBits(const StaticInst *si,
-                                        int idx, RegVal val) = 0;
-
-    /** @} */
+    virtual RegVal getRegOperand(const StaticInst *si, int idx) = 0;
+ virtual void getRegOperand(const StaticInst *si, int idx, void *val) = 0; + virtual void setRegOperand(const StaticInst *si, int idx, RegVal val) = 0;
+    virtual void setRegOperand(const StaticInst *si, int idx,
+            const void *val) = 0;

     /** Vector Register Interfaces. */
     /** @{ */
-    /** Reads source vector register operand. */
-    virtual TheISA::VecRegContainer readVecRegOperand(
-            const StaticInst *si, int idx) const = 0;
-
     /** Gets destination vector register operand for modification. */
     virtual TheISA::VecRegContainer& getWritableVecRegOperand(
             const StaticInst *si, int idx) = 0;
-
-    /** Sets a destination vector register operand to a value. */
-    virtual void setVecRegOperand(const StaticInst *si, int idx,
-            const TheISA::VecRegContainer& val) = 0;
-    /** @} */
-
-    /** Vector Elem Interfaces. */
-    /** @{ */
-    /** Reads an element of a vector register. */
-    virtual TheISA::VecElem readVecElemOperand(
-            const StaticInst *si, int idx) const = 0;
-
-    /** Sets a vector register to a value. */
-    virtual void setVecElemOperand(
-            const StaticInst *si, int idx, const TheISA::VecElem val) = 0;
     /** @} */

     /** Predicate registers interface. */
     /** @{ */
-    /** Reads source predicate register operand. */
-    virtual TheISA::VecPredRegContainer readVecPredRegOperand(
-            const StaticInst *si, int idx) const = 0;
-
     /** Gets destination predicate register operand for modification. */
     virtual TheISA::VecPredRegContainer& getWritableVecPredRegOperand(
             const StaticInst *si, int idx) = 0;
-
-    /** Sets a destination predicate register operand to a value. */
-    virtual void setVecPredRegOperand(
-            const StaticInst *si, int idx,
-            const TheISA::VecPredRegContainer& val) = 0;
-    /** @} */
-
-    /**
-     * @{
-     * @name Condition Code Registers
-     */
-    virtual RegVal readCCRegOperand(const StaticInst *si, int idx) = 0;
-    virtual void setCCRegOperand(
-            const StaticInst *si, int idx, RegVal val) = 0;
     /** @} */

     /**
diff --git a/src/cpu/minor/exec_context.hh b/src/cpu/minor/exec_context.hh
index 60809ba..2630836 100644
--- a/src/cpu/minor/exec_context.hh
+++ b/src/cpu/minor/exec_context.hh
@@ -145,27 +145,15 @@
     }

     RegVal
-    readIntRegOperand(const StaticInst *si, int idx) override
+    getRegOperand(const StaticInst *si, int idx) override
     {
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(IntRegClass));
-        return thread.readIntReg(reg.index());
+        return thread.getReg(si->srcRegIdx(idx));
     }

-    RegVal
-    readFloatRegOperandBits(const StaticInst *si, int idx) override
+    void
+    getRegOperand(const StaticInst *si, int idx, void *val) override
     {
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(FloatRegClass));
-        return thread.readFloatReg(reg.index());
-    }
-
-    TheISA::VecRegContainer
-    readVecRegOperand(const StaticInst *si, int idx) const override
-    {
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(VecRegClass));
-        return thread.readVecReg(reg);
+        thread.getReg(si->srcRegIdx(idx), val);
     }

     TheISA::VecRegContainer &
@@ -176,22 +164,6 @@
         return thread.getWritableVecReg(reg);
     }

-    TheISA::VecElem
-    readVecElemOperand(const StaticInst *si, int idx) const override
-    {
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(VecElemClass));
-        return thread.readVecElem(reg);
-    }
-
-    TheISA::VecPredRegContainer
-    readVecPredRegOperand(const StaticInst *si, int idx) const override
-    {
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(VecPredRegClass));
-        return thread.readVecPredReg(reg);
-    }
-
     TheISA::VecPredRegContainer&
     getWritableVecPredRegOperand(const StaticInst *si, int idx) override
     {
@@ -201,46 +173,15 @@
     }

     void
-    setIntRegOperand(const StaticInst *si, int idx, RegVal val) override
+    setRegOperand(const StaticInst *si, int idx, RegVal val) override
     {
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(IntRegClass));
-        thread.setIntReg(reg.index(), val);
+        thread.setReg(si->destRegIdx(idx), val);
     }

     void
- setFloatRegOperandBits(const StaticInst *si, int idx, RegVal val) override
+    setRegOperand(const StaticInst *si, int idx, const void *val) override
     {
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(FloatRegClass));
-        thread.setFloatReg(reg.index(), val);
-    }
-
-    void
-    setVecRegOperand(const StaticInst *si, int idx,
-                     const TheISA::VecRegContainer& val) override
-    {
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(VecRegClass));
-        thread.setVecReg(reg, val);
-    }
-
-    void
-    setVecPredRegOperand(const StaticInst *si, int idx,
-                         const TheISA::VecPredRegContainer& val) override
-    {
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(VecPredRegClass));
-        thread.setVecPredReg(reg, val);
-    }
-
-    void
-    setVecElemOperand(const StaticInst *si, int idx,
-                      const TheISA::VecElem val) override
-    {
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(VecElemClass));
-        thread.setVecElem(reg, val);
+        thread.setReg(si->destRegIdx(idx), val);
     }

     bool
@@ -362,22 +303,6 @@
         thread.getMMUPtr()->demapPage(vaddr, asn);
     }

-    RegVal
-    readCCRegOperand(const StaticInst *si, int idx) override
-    {
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(CCRegClass));
-        return thread.readCCReg(reg.index());
-    }
-
-    void
-    setCCRegOperand(const StaticInst *si, int idx, RegVal val) override
-    {
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(CCRegClass));
-        thread.setCCReg(reg.index(), val);
-    }
-
     BaseCPU *getCpuPtr() { return &cpu; }

   public:
diff --git a/src/cpu/o3/dyn_inst.hh b/src/cpu/o3/dyn_inst.hh
index 141fee9..610cbf6 100644
--- a/src/cpu/o3/dyn_inst.hh
+++ b/src/cpu/o3/dyn_inst.hh
@@ -1180,38 +1180,32 @@
             const RegId& original_dest_reg = staticInst->destRegIdx(idx);
             switch (original_dest_reg.classValue()) {
               case IntRegClass:
-                setIntRegOperand(staticInst.get(), idx,
-                        cpu->getReg(prev_phys_reg));
-                break;
               case FloatRegClass:
-                setFloatRegOperandBits(staticInst.get(), idx,
+              case CCRegClass:
+                setRegOperand(staticInst.get(), idx,
                         cpu->getReg(prev_phys_reg));
                 break;
               case VecRegClass:
                 {
                     TheISA::VecRegContainer val;
                     cpu->getReg(prev_phys_reg, &val);
-                    setVecRegOperand(staticInst.get(), idx, val);
+                    setRegOperand(staticInst.get(), idx, &val);
                 }
                 break;
               case VecElemClass:
                 {
                     TheISA::VecElem val;
                     cpu->getReg(prev_phys_reg, &val);
-                    setVecElemOperand(staticInst.get(), idx, val);
+                    setRegOperand(staticInst.get(), idx, &val);
                 }
                 break;
               case VecPredRegClass:
                 {
                     TheISA::VecPredRegContainer val;
                     cpu->getReg(prev_phys_reg, &val);
-                    setVecPredRegOperand(staticInst.get(), idx, val);
+                    setRegOperand(staticInst.get(), idx, &val);
                 }
                 break;
-              case CCRegClass:
-                setCCRegOperand(staticInst.get(), idx,
-                        cpu->getReg(prev_phys_reg));
-                break;
               case MiscRegClass:
                 // no need to forward misc reg values
                 break;
@@ -1238,23 +1232,15 @@
     // to do).

     RegVal
-    readIntRegOperand(const StaticInst *si, int idx) override
+    getRegOperand(const StaticInst *si, int idx) override
     {
         return cpu->getReg(regs.renamedSrcIdx(idx));
     }

-    RegVal
-    readFloatRegOperandBits(const StaticInst *si, int idx) override
+    void
+    getRegOperand(const StaticInst *si, int idx, void *val) override
     {
-        return cpu->getReg(regs.renamedSrcIdx(idx));
-    }
-
-    TheISA::VecRegContainer
-    readVecRegOperand(const StaticInst *si, int idx) const override
-    {
-        TheISA::VecRegContainer val;
-        cpu->getReg(regs.renamedSrcIdx(idx), &val);
-        return val;
+        cpu->getReg(regs.renamedSrcIdx(idx), val);
     }

     /**
@@ -1266,80 +1252,27 @@
         return cpu->getWritableVecReg(regs.renamedDestIdx(idx));
     }

-    TheISA::VecElem
-    readVecElemOperand(const StaticInst *si, int idx) const override
-    {
-        TheISA::VecElem val;
-        cpu->getReg(regs.renamedSrcIdx(idx), &val);
-        return val;
-    }
-
-    TheISA::VecPredRegContainer
-    readVecPredRegOperand(const StaticInst *si, int idx) const override
-    {
-        TheISA::VecPredRegContainer val;
-        cpu->getReg(regs.renamedSrcIdx(idx), &val);
-        return val;
-    }
-
     TheISA::VecPredRegContainer&
     getWritableVecPredRegOperand(const StaticInst *si, int idx) override
     {
         return cpu->getWritableVecPredReg(regs.renamedDestIdx(idx));
     }

-    RegVal
-    readCCRegOperand(const StaticInst *si, int idx) override
-    {
-        return cpu->getReg(regs.renamedSrcIdx(idx));
-    }
-
     /** @todo: Make results into arrays so they can handle multiple dest
      *  registers.
      */
     void
-    setIntRegOperand(const StaticInst *si, int idx, RegVal val) override
+    setRegOperand(const StaticInst *si, int idx, RegVal val) override
     {
         cpu->setReg(regs.renamedDestIdx(idx), val);
         setScalarResult(val);
     }

     void
- setFloatRegOperandBits(const StaticInst *si, int idx, RegVal val) override
+    setRegOperand(const StaticInst *si, int idx, const void *val) override
     {
         cpu->setReg(regs.renamedDestIdx(idx), val);
-        setScalarResult(val);
-    }
-
-    void
-    setVecRegOperand(const StaticInst *si, int idx,
-                     const TheISA::VecRegContainer& val) override
-    {
-        cpu->setReg(regs.renamedDestIdx(idx), &val);
-        setVecResult(val);
-    }
-
-    void
-    setVecElemOperand(const StaticInst *si, int idx,
-            const TheISA::VecElem val) override
-    {
-        cpu->setReg(regs.renamedDestIdx(idx), &val);
-        setVecElemResult(val);
-    }
-
-    void
-    setVecPredRegOperand(const StaticInst *si, int idx,
-                         const TheISA::VecPredRegContainer& val) override
-    {
-        cpu->setReg(regs.renamedDestIdx(idx), &val);
-        setVecPredResult(val);
-    }
-
-    void
-    setCCRegOperand(const StaticInst *si, int idx, RegVal val) override
-    {
-        cpu->setReg(regs.renamedDestIdx(idx), val);
-        setScalarResult(val);
+        //TODO set*Result
     }
 };

diff --git a/src/cpu/simple/exec_context.hh b/src/cpu/simple/exec_context.hh
index 494bed6..e454927 100644
--- a/src/cpu/simple/exec_context.hh
+++ b/src/cpu/simple/exec_context.hh
@@ -288,56 +288,102 @@
         lastDcacheStall(0), execContextStats(cpu, thread)
     { }

-    /** Reads an integer register. */
     RegVal
-    readIntRegOperand(const StaticInst *si, int idx) override
+    getRegOperand(const StaticInst *si, int idx) override
     {
-        execContextStats.numIntRegReads++;
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(IntRegClass));
-        return thread->readIntReg(reg.index());
+        const RegId &reg = si->srcRegIdx(idx);
+        const RegClassType type = reg.classValue();
+        switch (type) {
+          case IntRegClass:
+            execContextStats.numIntRegReads++;
+            break;
+          case FloatRegClass:
+            execContextStats.numFpRegReads++;
+            break;
+          case CCRegClass:
+            execContextStats.numCCRegReads++;
+            break;
+          default:
+            break;
+        }
+        return thread->getReg(reg);
     }

-    /** Sets an integer register to a value. */
     void
-    setIntRegOperand(const StaticInst *si, int idx, RegVal val) override
+    getRegOperand(const StaticInst *si, int idx, void *val) override
     {
-        execContextStats.numIntRegWrites++;
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(IntRegClass));
-        thread->setIntReg(reg.index(), val);
+        const RegId &reg = si->srcRegIdx(idx);
+        const RegClassType type = reg.classValue();
+        switch (type) {
+          case IntRegClass:
+            execContextStats.numIntRegReads++;
+            break;
+          case FloatRegClass:
+            execContextStats.numFpRegReads++;
+            break;
+          case VecRegClass:
+          case VecElemClass:
+            execContextStats.numVecRegReads++;
+            break;
+          case VecPredRegClass:
+            execContextStats.numVecPredRegReads++;
+            break;
+          case CCRegClass:
+            execContextStats.numCCRegReads++;
+            break;
+          default:
+            break;
+        }
+        thread->getReg(reg, val);
     }

-    /** Reads a floating point register in its binary format, instead
-     * of by value. */
-    RegVal
-    readFloatRegOperandBits(const StaticInst *si, int idx) override
-    {
-        execContextStats.numFpRegReads++;
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(FloatRegClass));
-        return thread->readFloatReg(reg.index());
-    }
-
-    /** Sets the bits of a floating point register of single width
-     * to a binary value. */
     void
- setFloatRegOperandBits(const StaticInst *si, int idx, RegVal val) override
+    setRegOperand(const StaticInst *si, int idx, RegVal val) override
     {
-        execContextStats.numFpRegWrites++;
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(FloatRegClass));
-        thread->setFloatReg(reg.index(), val);
+        const RegId &reg = si->destRegIdx(idx);
+        const RegClassType type = reg.classValue();
+        switch (type) {
+          case IntRegClass:
+            execContextStats.numIntRegWrites++;
+            break;
+          case FloatRegClass:
+            execContextStats.numFpRegWrites++;
+            break;
+          case CCRegClass:
+            execContextStats.numCCRegWrites++;
+            break;
+          default:
+            break;
+        }
+        thread->setReg(reg, val);
     }

-    /** Reads a vector register. */
-    TheISA::VecRegContainer
-    readVecRegOperand(const StaticInst *si, int idx) const override
+    void
+    setRegOperand(const StaticInst *si, int idx, const void *val) override
     {
-        execContextStats.numVecRegReads++;
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(VecRegClass));
-        return thread->readVecReg(reg);
+        const RegId &reg = si->destRegIdx(idx);
+        const RegClassType type = reg.classValue();
+        switch (type) {
+          case IntRegClass:
+            execContextStats.numIntRegWrites++;
+            break;
+          case FloatRegClass:
+            execContextStats.numFpRegWrites++;
+            break;
+          case VecRegClass:
+          case VecElemClass:
+            execContextStats.numVecRegWrites++;
+            break;
+          case VecPredRegClass:
+            execContextStats.numVecPredRegWrites++;
+            break;
+          case CCRegClass:
+            execContextStats.numCCRegWrites++;
+            break;
+          default:
+            break;
+        }
+        thread->setReg(reg, val);
     }

     /** Reads a vector register for modification. */
@@ -350,47 +396,6 @@
         return thread->getWritableVecReg(reg);
     }

-    /** Sets a vector register to a value. */
-    void
-    setVecRegOperand(const StaticInst *si, int idx,
-                     const TheISA::VecRegContainer& val) override
-    {
-        execContextStats.numVecRegWrites++;
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(VecRegClass));
-        thread->setVecReg(reg, val);
-    }
-
-    /** Reads an element of a vector register. */
-    TheISA::VecElem
-    readVecElemOperand(const StaticInst *si, int idx) const override
-    {
-        execContextStats.numVecRegReads++;
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(VecElemClass));
-        return thread->readVecElem(reg);
-    }
-
-    /** Sets an element of a vector register to a value. */
-    void
-    setVecElemOperand(const StaticInst *si, int idx,
-                      const TheISA::VecElem val) override
-    {
-        execContextStats.numVecRegWrites++;
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(VecElemClass));
-        thread->setVecElem(reg, val);
-    }
-
-    TheISA::VecPredRegContainer
-    readVecPredRegOperand(const StaticInst *si, int idx) const override
-    {
-        execContextStats.numVecPredRegReads++;
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(VecPredRegClass));
-        return thread->readVecPredReg(reg);
-    }
-
     TheISA::VecPredRegContainer&
     getWritableVecPredRegOperand(const StaticInst *si, int idx) override
     {
@@ -400,34 +405,6 @@
         return thread->getWritableVecPredReg(reg);
     }

-    void
-    setVecPredRegOperand(const StaticInst *si, int idx,
-                         const TheISA::VecPredRegContainer& val) override
-    {
-        execContextStats.numVecPredRegWrites++;
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(VecPredRegClass));
-        thread->setVecPredReg(reg, val);
-    }
-
-    RegVal
-    readCCRegOperand(const StaticInst *si, int idx) override
-    {
-        execContextStats.numCCRegReads++;
-        const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.is(CCRegClass));
-        return thread->readCCReg(reg.index());
-    }
-
-    void
-    setCCRegOperand(const StaticInst *si, int idx, RegVal val) override
-    {
-        execContextStats.numCCRegWrites++;
-        const RegId& reg = si->destRegIdx(idx);
-        assert(reg.is(CCRegClass));
-        thread->setCCReg(reg.index(), val);
-    }
-
     RegVal
     readMiscRegOperand(const StaticInst *si, int idx) override
     {

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49114
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: I8cb80da890fc8915f03be04e136662a257d06946
Gerrit-Change-Number: 49114
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
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