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

Change subject: arch-x86: Create a separate type for floating point reg idxs.
......................................................................

arch-x86: Create a separate type for floating point reg idxs.

This will ensure that floating point registers are used when required
and never otherwise.

Change-Id: I303c42d8a74c56b7b433b91fd36dc6aaf5ddef32
---
M src/arch/x86/insts/microldstop.hh
M src/arch/x86/insts/microop_args.hh
M src/arch/x86/insts/static_inst.hh
M src/arch/x86/isa/includes.isa
M src/arch/x86/isa/insts/simd128/integer/save_and_restore_state/save_and_restore_state.py
M src/arch/x86/isa/microasm.isa
6 files changed, 29 insertions(+), 18 deletions(-)



diff --git a/src/arch/x86/insts/microldstop.hh b/src/arch/x86/insts/microldstop.hh
index 26178cb..228c68d 100644
--- a/src/arch/x86/insts/microldstop.hh
+++ b/src/arch/x86/insts/microldstop.hh
@@ -101,7 +101,7 @@
 {
   protected:
LdStFpOp(ExtMachInst mach_inst, const char *mnem, const char *inst_mnem,
-            uint64_t set_flags, InstRegIndex _data,
+            uint64_t set_flags, FpRegIndex _data,
             uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
             uint64_t _disp, InstRegIndex _segment,
             uint8_t data_size, uint8_t address_size,
diff --git a/src/arch/x86/insts/microop_args.hh b/src/arch/x86/insts/microop_args.hh
index 85f60d1..2025e04 100644
--- a/src/arch/x86/insts/microop_args.hh
+++ b/src/arch/x86/insts/microop_args.hh
@@ -194,10 +194,10 @@
 template <class Base>
 struct FloatOp : public Base
 {
+    using ArgType = FpRegIndex;
+
     template <class InstType>
-    FloatOp(InstType *inst, typename Base::ArgType idx) :
-        Base(idx.index, inst->dataSize)
-    {}
+ FloatOp(InstType *inst, ArgType idx) : Base(idx.index, inst->dataSize) {}

     void
     print(std::ostream &os) const
diff --git a/src/arch/x86/insts/static_inst.hh b/src/arch/x86/insts/static_inst.hh
index d2768b6..9d5039b 100644
--- a/src/arch/x86/insts/static_inst.hh
+++ b/src/arch/x86/insts/static_inst.hh
@@ -46,7 +46,7 @@
 {

 /**
- * Class for register indices passed to instruction constructors. Using a
+ * Classes for register indices passed to instruction constructors. Using a
  * wrapper struct for these lets take advantage of the compiler's type
  * checking.
  */
@@ -56,6 +56,12 @@
     explicit InstRegIndex(RegIndex idx) : index(idx) {}
 };

+struct FpRegIndex
+{
+    RegIndex index;
+    explicit FpRegIndex(RegIndex idx) : index(idx) {}
+};
+
 /**
  * Base class for all X86 static instructions.
  */
diff --git a/src/arch/x86/isa/includes.isa b/src/arch/x86/isa/includes.isa
index 070d82f..59a4f9e 100644
--- a/src/arch/x86/isa/includes.isa
+++ b/src/arch/x86/isa/includes.isa
@@ -72,6 +72,8 @@
 #include "sim/faults.hh"

 using X86ISA::InstRegIndex;
+using X86ISA::FpRegIndex;
+
 }};

 output decoder {{
diff --git a/src/arch/x86/isa/insts/simd128/integer/save_and_restore_state/save_and_restore_state.py b/src/arch/x86/isa/insts/simd128/integer/save_and_restore_state/save_and_restore_state.py
index c519b56..36a3952 100644
--- a/src/arch/x86/isa/insts/simd128/integer/save_and_restore_state/save_and_restore_state.py +++ b/src/arch/x86/isa/insts/simd128/integer/save_and_restore_state/save_and_restore_state.py
@@ -43,16 +43,16 @@
 '''

 loadXMMRegTemplate =  '''
-    ldfp regIdx("FLOATREG_XMM_LOW(%(idx)i)"), seg, %(mode)s, \
+    ldfp fpRegIdx("FLOATREG_XMM_LOW(%(idx)i)"), seg, %(mode)s, \
          "DISPLACEMENT + 160 + 16 * %(idx)i", dataSize=8
-    ldfp regIdx("FLOATREG_XMM_HIGH(%(idx)i)"), seg, %(mode)s, \
+    ldfp fpRegIdx("FLOATREG_XMM_HIGH(%(idx)i)"), seg, %(mode)s, \
          "DISPLACEMENT + 160 + 16 * %(idx)i + 8", dataSize=8
 '''

 storeXMMRegTemplate =  '''
-    stfp regIdx("FLOATREG_XMM_LOW(%(idx)i)"), seg, %(mode)s, \
+    stfp fpRegIdx("FLOATREG_XMM_LOW(%(idx)i)"), seg, %(mode)s, \
          "DISPLACEMENT + 160 + 16 * %(idx)i", dataSize=8
-    stfp regIdx("FLOATREG_XMM_HIGH(%(idx)i)"), seg, %(mode)s, \
+    stfp fpRegIdx("FLOATREG_XMM_HIGH(%(idx)i)"), seg, %(mode)s, \
          "DISPLACEMENT + 160 + 16 * %(idx)i + 8", dataSize=8
 '''

diff --git a/src/arch/x86/isa/microasm.isa b/src/arch/x86/isa/microasm.isa
index 59551a5..3f0517d 100644
--- a/src/arch/x86/isa/microasm.isa
+++ b/src/arch/x86/isa/microasm.isa
@@ -57,16 +57,19 @@
assembler = MicroAssembler(X86Macroop, microopClasses, mainRom, Rom_Macroop)

     def regIdx(idx):
-        return "InstRegIndex(%s)" % idx
+        return "X86ISA::InstRegIndex(%s)" % idx
+    def fpRegIdx(idx):
+        return "X86ISA::FpRegIndex(%s)" % idx

     assembler.symbols["regIdx"] = regIdx
+    assembler.symbols["fpRegIdx"] = fpRegIdx

     # Add in symbols for the microcode registers
     for num in range(16):
         assembler.symbols["t%d" % num] = regIdx("NUM_INTREGS+%d" % num)
     for num in range(8):
         assembler.symbols["ufp%d" % num] = \
-            regIdx("FLOATREG_MICROFP(%d)" % num)
+            fpRegIdx("FLOATREG_MICROFP(%d)" % num)
     # Add in symbols for the segment descriptor registers
     for letter in ("C", "D", "E", "F", "G", "H", "S"):
         assembler.symbols["%ss" % letter.lower()] = \
@@ -87,13 +90,13 @@
     # Miscellaneous symbols
     symbols = {
         "reg" : regIdx("env.reg"),
-        "xmml" : regIdx("FLOATREG_XMM_LOW(env.reg)"),
-        "xmmh" : regIdx("FLOATREG_XMM_HIGH(env.reg)"),
+        "xmml" : fpRegIdx("FLOATREG_XMM_LOW(env.reg)"),
+        "xmmh" : fpRegIdx("FLOATREG_XMM_HIGH(env.reg)"),
         "regm" : regIdx("env.regm"),
-        "xmmlm" : regIdx("FLOATREG_XMM_LOW(env.regm)"),
-        "xmmhm" : regIdx("FLOATREG_XMM_HIGH(env.regm)"),
-        "mmx" : regIdx("FLOATREG_MMX(env.reg)"),
-        "mmxm" : regIdx("FLOATREG_MMX(env.regm)"),
+        "xmmlm" : fpRegIdx("FLOATREG_XMM_LOW(env.regm)"),
+        "xmmhm" : fpRegIdx("FLOATREG_XMM_HIGH(env.regm)"),
+        "mmx" : fpRegIdx("FLOATREG_MMX(env.reg)"),
+        "mmxm" : fpRegIdx("FLOATREG_MMX(env.regm)"),
         "imm" : "adjustedImm",
         "disp" : "adjustedDisp",
         "seg" : regIdx("env.seg"),
@@ -205,7 +208,7 @@
     assembler.symbols["rom_local_label"] = rom_local_labeler

     def stack_index(index):
-        return regIdx("NUM_FLOATREGS + (((%s) + 8) %% 8)" % index)
+        return fpRegIdx("NUM_FLOATREGS + (((%s) + 8) %% 8)" % index)

     assembler.symbols["st"] = stack_index
     assembler.symbols["sti"] = stack_index("env.reg")

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/42354
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: I303c42d8a74c56b7b433b91fd36dc6aaf5ddef32
Gerrit-Change-Number: 42354
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