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

Change subject: arch-x86: Don't use global variables for ucode ROM labels.
......................................................................

arch-x86: Don't use global variables for ucode ROM labels.

Use a map of strings to MicroPCs. This makes it possible to accumulate
ROM microops from different segments compiled separately.

Change-Id: If5778982efb2a18892c4fc3d26e5172444fcacd8
---
M src/arch/x86/faults.cc
M src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
M src/arch/x86/microcode/romutil.ucode
M src/arch/x86/microcode_rom.hh
M src/arch/x86/ucasmlib/arch/x86/microops/base.py
M src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
M src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
M src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
M src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
M src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
M src/arch/x86/ucasmlib/arch/x86/microops/regop.py
M src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
M src/arch/x86/ucasmlib/arch/x86/microops/specop.py
M src/arch/x86/ucasmlib/arch/x86/rom.py
M src/arch/x86/ucasmlib/arch/x86/symbols.py
15 files changed, 119 insertions(+), 71 deletions(-)



diff --git a/src/arch/x86/faults.cc b/src/arch/x86/faults.cc
index 0249cb3..c25a0a4 100644
--- a/src/arch/x86/faults.cc
+++ b/src/arch/x86/faults.cc
@@ -41,7 +41,7 @@
 #include "arch/x86/faults.hh"

 #include "arch/x86/insts/static_inst.hh"
-#include "arch/x86/microcode/microcode.hh"
+#include "arch/x86/microcode_rom.hh"
 #include "arch/x86/mmu.hh"
 #include "arch/x86/regs/misc.hh"
 #include "base/loader/symtab.hh"
@@ -67,25 +67,35 @@

     PCState pc = tc->pcState().as<PCState>();
DPRINTF(Faults, "RIP %#x: vector %d: %s\n", pc.pc(), vector, describe());
-    using namespace X86ISAInst::rom_labels;
     HandyM5Reg m5reg = tc->readMiscRegNoEffect(MISCREG_M5_REG);
     MicroPC entry;
     if (m5reg.mode == LongMode) {
-        entry = extern_label_longModeInterrupt;
+        static MicroPC long_mode_interrupt =
+            X86ISAInst::microcodeRom.getLabel("longModeInterrupt");
+        entry = long_mode_interrupt;
     } else {
-        if (m5reg.submode == RealMode)
-            entry = extern_label_realModeInterrupt;
-        else
-            entry = extern_label_legacyModeInterrupt;
+        if (m5reg.submode == RealMode) {
+            static MicroPC real_mode_interrupt =
+                X86ISAInst::microcodeRom.getLabel("realModeInterrupt");
+            entry = real_mode_interrupt;
+        } else {
+            static MicroPC legacy_mode_interrupt =
+                X86ISAInst::microcodeRom.getLabel("legacyModeInterrupt");
+            entry = legacy_mode_interrupt;
+        }
     }
     tc->setIntReg(INTREG_MICRO(1), vector);
     Addr cs_base = tc->readMiscRegNoEffect(MISCREG_CS_EFF_BASE);
     tc->setIntReg(INTREG_MICRO(7), pc.pc() - cs_base);
     if (errorCode != (uint64_t)(-1)) {
         if (m5reg.mode == LongMode) {
-            entry = extern_label_longModeInterruptWithError;
+            static MicroPC long_mode = X86ISAInst::microcodeRom.getLabel(
+                    "longModeInterruptWithError");
+            entry = long_mode;
         } else {
-            entry = extern_label_legacyModeInterruptWithError;
+            static MicroPC legacy_mode = X86ISAInst::microcodeRom.getLabel(
+                    "legacyModeInterruptWithError");
+            entry = legacy_mode;
         }
         tc->setIntReg(INTREG_MICRO(15), errorCode);
     }
@@ -291,7 +301,9 @@

     // Update the handy M5 Reg.
     tc->setMiscReg(MISCREG_M5_REG, 0);
-    MicroPC entry = X86ISAInst::rom_labels::extern_label_initIntHalt;
+    static MicroPC init_int_halt =
+        X86ISAInst::microcodeRom.getLabel("initIntHalt");
+    MicroPC entry = init_int_halt;
     pc.upc(romMicroPC(entry));
     pc.nupc(romMicroPC(entry) + 1);
     tc->pcState(pc);
diff --git a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
index bc2fcb9..c66cca9 100644
--- a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
+++ b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
@@ -133,14 +133,14 @@
     fault "std::make_shared<GeneralProtection>(0)", flags=(CEZF,)
     andi t3, t2, 0xF8, dataSize=8
     andi t0, t2, 0x4, flags=(EZF,), dataSize=2
-    br rom_local_label("farJmpGlobalDescriptor"), flags=(CEZF,)
+    br "farJmpGlobalDescriptor", flags=(CEZF,)
     ld t4, tsl, [1, t0, t3], dataSize=8, addressSize=8, atCPL0=True
-    br rom_local_label("farJmpProcessDescriptor")
+    br "farJmpProcessDescriptor"
 farJmpGlobalDescriptor:
     ld t4, tsg, [1, t0, t3], dataSize=8, addressSize=8, atCPL0=True
 farJmpProcessDescriptor:
     rcri t0, t4, 13, flags=(ECF,), dataSize=2
-    br rom_local_label("farJmpSystemDescriptor"), flags=(nCECF,)
+    br "farJmpSystemDescriptor", flags=(nCECF,)
     chks t2, t4, CSCheck, dataSize=8
     wrdl cs, t4, t2, dataSize=4
     wrsel cs, t2, dataSize=4
diff --git a/src/arch/x86/microcode/romutil.ucode b/src/arch/x86/microcode/romutil.ucode
index f4ffbb7..7dc26ae 100644
--- a/src/arch/x86/microcode/romutil.ucode
+++ b/src/arch/x86/microcode/romutil.ucode
@@ -51,9 +51,9 @@
     srli t10, t4, 16, dataSize=8
     andi t5, t10, 0xF8, dataSize=8
     andi t0, t10, 0x4, flags=(EZF,), dataSize=2
-    br rom_local_label("{start_label}_globalDescriptor"), flags=(CEZF,)
+    br "{start_label}_globalDescriptor", flags=(CEZF,)
     ld t3, tsl, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
-    br rom_local_label("{start_label}_processDescriptor")
+    br "{start_label}_processDescriptor"
 {start_label}_globalDescriptor:
     ld t3, tsg, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
 {start_label}_processDescriptor:
@@ -86,17 +86,17 @@
     srli t12, t4, 32, dataSize=8
     andi t12, t12, 0x7, dataSize=8
     subi t0, t12, 1, flags=(ECF,), dataSize=8
-    br rom_local_label("{start_label}_istStackSwitch"), flags=(nCECF,)
-    br rom_local_label("{start_label}_cplStackSwitch"), flags=(nCEZF,)
+    br "{start_label}_istStackSwitch", flags=(nCECF,)
+    br "{start_label}_cplStackSwitch", flags=(nCEZF,)

     # If we're here, it's because the stack isn't being switched.
     # Set t6 to the new aligned rsp.
     mov t6, t6, rsp, dataSize=8
-    br rom_local_label("{start_label}_stackSwitched")
+    br "{start_label}_stackSwitched"

 {start_label}_istStackSwitch:
     ld t6, tr, [8, t12, t0], 0x1c, dataSize=8, addressSize=8, atCPL0=True
-    br rom_local_label("{start_label}_stackSwitched")
+    br "{start_label}_stackSwitched"

 {start_label}_cplStackSwitch:
     # Get the new rsp from the TSS
@@ -224,9 +224,9 @@
     srli t10, t4, 16, dataSize=8
     andi t5, t10, 0xF8, dataSize=8
     andi t0, t10, 0x4, flags=(EZF,), dataSize=2
-    br rom_local_label("{start_label}_globalCS"), flags=(CEZF,)
+    br "{start_label}_globalCS", flags=(CEZF,)
     ld t3, tsl, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
-    br rom_local_label("{start_label}_processCS")
+    br "{start_label}_processCS"
 {start_label}_globalCS:
     ld t3, tsg, [1, t0, t5], dataSize=8, addressSize=8, atCPL0=True
 {start_label}_processCS:
@@ -256,7 +256,7 @@
     wrsel cs, t13, dataSize=8
     wrdl cs, t3, t13, dataSize=8

-    br rom_local_label("{start_label}_noStackSwitch"), flags=(CEZF,)
+    br "{start_label}_noStackSwitch", flags=(CEZF,)

     # Get the new ESP from the TSS
     ld t6, tr, [8, t10, t0], 4, dataSize=4, addressSize=8, atCPL0=True
@@ -271,9 +271,9 @@
     andi t11, t8, 0xF8, dataSize=8
     # Check if this is a global or local descriptor.
     andi t0, t8, 0x4, flags=(EZF,), dataSize=2
-    br rom_local_label("{start_label}_globalSS"), flags=(CEZF,)
+    br "{start_label}_globalSS", flags=(CEZF,)
     ld t12, tsl, [1, t0, t11], dataSize=8, addressSize=8, atCPL0=True
-    br rom_local_label("{start_label}_processSS")
+    br "{start_label}_processSS"
 {start_label}_globalSS:
     ld t12, tsg, [1, t0, t11], dataSize=8, addressSize=8, atCPL0=True
 {start_label}_processSS:
@@ -284,8 +284,8 @@
     rdattr t14, hs, dataSize=8
     andi t0, t14, 0x8, flags=(EZF,), dataSize=8

-    br rom_local_label("{start_label}_sszIs4Switched"), flags=(nCEZF,)
-    br rom_local_label("{start_label}_sszIs2DszIs4Switched"), flags=(CECF,)
+    br "{start_label}_sszIs4Switched", flags=(nCEZF,)
+    br "{start_label}_sszIs2DszIs4Switched", flags=(CECF,)

     # ssz = 2, dsz = 2

@@ -308,7 +308,7 @@
     wrsel ss, t8, dataSize=8
     {error_code_code}, dataSize=2, addressSize=2

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"

 {start_label}_sszIs2DszIs4Switched:

@@ -333,10 +333,10 @@
     wrsel ss, t8, dataSize=8
     {error_code_code}, dataSize=4, addressSize=2

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"

 {start_label}_sszIs4Switched:
-    br rom_local_label("{start_label}_sszIs4DszIs4Switched"), flags=(CECF,)
+    br "{start_label}_sszIs4DszIs4Switched", flags=(CECF,)

     # ssz = 4, dsz = 2

@@ -358,7 +358,7 @@
     wrsel ss, t8, dataSize=8
     {error_code_code}, dataSize=2, addressSize=4

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"

 {start_label}_sszIs4DszIs4Switched:

@@ -382,7 +382,7 @@
     wrsel ss, t8, dataSize=8
     {error_code_code}, dataSize=2, addressSize=4

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"


 {start_label}_noStackSwitch:
@@ -391,8 +391,8 @@
     rdattr t14, ss, dataSize=8
     andi t0, t14, 0x8, flags=(EZF,), dataSize=8

-    br rom_local_label("{start_label}_sszIs4"), flags=(nCEZF,)
-    br rom_local_label("{start_label}_sszIs2DszIs4"), flags=(CECF,)
+    br "{start_label}_sszIs4", flags=(nCEZF,)
+    br "{start_label}_sszIs2DszIs4", flags=(CECF,)

     # Make sure the space on the stack is accessible.
     cda ss, [1, t0, rsp], -1, dataSize=1, addressSize=2
@@ -407,7 +407,7 @@
     subi rsp, rsp, 6 + {error_code_size} / 2, dataSize=2
     {error_code_code}, dataSize=2, addressSize=2

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"

 {start_label}_sszIs2DszIs4:

@@ -426,10 +426,10 @@
     subi rsp, rsp, 12 + {error_code_size}, dataSize=2
     {error_code_code}, dataSize=4, addressSize=2

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"

 {start_label}_sszIs4:
-    br rom_local_label("{start_label}_sszIs4DszIs4"), flags=(CECF,)
+    br "{start_label}_sszIs4DszIs4", flags=(CECF,)

     # ssz = 4, dsz = 2

@@ -446,7 +446,7 @@
     subi rsp, rsp, 6 + {error_code_size} / 2, dataSize=4
     {error_code_code}, dataSize=2, addressSize=4

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"

 {start_label}_sszIs4DszIs4:

@@ -465,7 +465,7 @@
     subi rsp, rsp, 12 + {error_code_size}, dataSize=4
     {error_code_code}, dataSize=4, addressSize=4

-    br rom_local_label("{start_label}_doneWithStack")
+    br "{start_label}_doneWithStack"

 {start_label}_doneWithStack:

diff --git a/src/arch/x86/microcode_rom.hh b/src/arch/x86/microcode_rom.hh
index 4dd559e..10e3023 100644
--- a/src/arch/x86/microcode_rom.hh
+++ b/src/arch/x86/microcode_rom.hh
@@ -30,6 +30,8 @@
 #define __ARCH_X86_MICROCODE_ROM_HH__

 #include <functional>
+#include <map>
+#include <string>
 #include <vector>

 #include "arch/x86/emulenv.hh"
@@ -45,17 +47,27 @@

 class MicrocodeRom
 {
-  protected:
-
+  public:
+    using Labels = std::map<std::string, MicroPC>;
     using GenFunc = std::function<StaticInstPtr(const char *macrocodeBlock,
- const X86ISA::ExtMachInst &machInst, const X86ISA::EmulEnv &env)>;
+            const Labels &labels, const X86ISA::ExtMachInst &machInst,
+            const X86ISA::EmulEnv &env)>;

+  protected:
     std::vector<GenFunc> genFuncs;
+    Labels labels;
+    Labels externs;

   public:
     //Constructor.
     MicrocodeRom();

+    MicroPC
+    getLabel(std::string label)
+    {
+        return externs.at(label);
+    }
+
     StaticInstPtr
     fetchMicroop(MicroPC micro_pc, StaticInstPtr macroop)
     {
@@ -69,11 +81,11 @@
         if (macroop) {
             auto *x86_macroop =
                 static_cast<X86ISA::MacroopBase *>(macroop.get());
-            return genFuncs[micro_pc]("Microcode_ROM",
+            return genFuncs[micro_pc]("Microcode_ROM", labels,
x86_macroop->getExtMachInst(), x86_macroop->getEmulEnv());
         } else {
-            return genFuncs[micro_pc]("Microcode_ROM", DummyExtMachInst,
-                    DummyEmulEnv);
+            return genFuncs[micro_pc]("Microcode_ROM", labels,
+                    DummyExtMachInst, DummyEmulEnv);
         }
     }
 };
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/base.py b/src/arch/x86/ucasmlib/arch/x86/microops/base.py
index d9ca4c3..b74545b 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/base.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/base.py
@@ -33,18 +33,23 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 class X86Microop(object):
-    def __init__(self, name):
-        self.name = name
+    def __init__(self):
+        self.labels = []

     def microFlagsText(self, flags):
         wrapped = ("(1ULL << StaticInst::%s)" % flag for flag in flags)
         return " | ".join(wrapped)

+    def lookUpLabels(self):
+        labels = [f'static MicroPC {label} = labels.at("{label}");'
+                for label in self.labels]
+        return '\n'.join(labels)
+
     def getGenerator(self):
         return f'''
-        [](const char *macrocodeBlock, const ExtMachInst &machInst,
-                const EmulEnv &env)
+        [](const char *macrocodeBlock, const MicrocodeRom::Labels &labels,
+                const ExtMachInst &machInst, const EmulEnv &env)
         {{
-            using namespace rom_labels;
+            {self.lookUpLabels()}
             return {self.getAllocator(["IsMicroop", "IsDelayedCommit"])};
         }}'''
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py b/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
index ae8817a..f43f0f3 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/debugop.py
@@ -38,6 +38,7 @@

 class MicroDebug(X86Microop):
     def __init__(self, name, fault, message, once, flags):
+        super().__init__()
         self.name = name
         self.fault = fault
         self.message = message
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py b/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
index 5dda099..727a017 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/fpop.py
@@ -68,6 +68,7 @@

     def __init__(self, *ops, spm=0,
             SetStatus=False, UpdateFTW=True, dataSize="env.dataSize"):
+        super().__init__()
         self.ops = list(map(str, ops))
         self.spm = spm
         self.dataSize = dataSize
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py b/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
index c2a5828..69c42f0 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/ldstop.py
@@ -44,6 +44,7 @@
     def __init__(self, data, segment, addr, disp,
             dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
             uncacheable):
+        super().__init__()
         self.data = data
         [self.scale, self.index, self.base] = addr
         self.disp = disp
@@ -84,6 +85,7 @@
     def __init__(self, data, segment, addr, disp,
             dataSize, addressSize, baseFlags, atCPL0, prefetch, nonSpec,
             uncacheable):
+        super().__init__()
         self.data = data
         [self.scale, self.index, self.base] = addr
         self.disp = disp
@@ -159,6 +161,7 @@
     def __init__(self, segment, addr, disp=0,
             dataSize="env.dataSize", addressSize="env.addressSize",
             baseFlags="0"):
+        super().__init__()
         [self.scale, self.index, self.base] = addr
         self.disp = disp
         self.segment = segment
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py b/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
index 889fa61..4cd81e4 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/limmop.py
@@ -38,6 +38,7 @@

 class LimmOp(X86Microop):
     def __init__(self, dest, imm, dataSize="env.dataSize"):
+        super().__init__()
         self.className = "Limm"
         self.mnemonic = "limm"
         self.dest = dest
@@ -68,6 +69,7 @@

 class LfpimmOp(X86Microop):
     def __init__(self, dest, imm, dataSize="env.dataSize"):
+        super().__init__()
         self.className = "Lfpimm"
         self.mnemonic = "lfpimm"
         self.dest = dest
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py b/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
index ef91623..d828d5c 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/mediaop.py
@@ -61,6 +61,7 @@

     def __init__(self, *args, size=None, destSize=None, srcSize=None,
             ext=None):
+        super().__init__()
         self.args = list(map(str, args))
         self.srcSize = None
         self.destSize = None
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/regop.py b/src/arch/x86/ucasmlib/arch/x86/microops/regop.py
index dbd8ef3..b5efbcf 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/regop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/regop.py
@@ -81,6 +81,7 @@
     op_class = "IntAluOp"

     def __init__(self, *ops, flags=None, dataSize="env.dataSize"):
+        super().__init__()
         self.ops = list(map(str, ops))
         self.flags = flags
         self.dataSize = dataSize
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py b/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
index 35e076c..1365501 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/seqop.py
@@ -38,8 +38,10 @@

 class Br(X86Microop):
     def __init__(self, target, flags=None):
+        super().__init__()
         self.className = 'Br'
         self.target = target
+        self.labels.append(target)
         if flags:
             if not isinstance(flags, (list, tuple)):
                 raise Exception('flags must be a list or tuple of flags')
@@ -62,6 +64,7 @@

 class Eret(X86Microop):
     def __init__(self, flags=None):
+        super().__init__()
         self.className = 'Eret'
         if flags:
             if not isinstance(flags, (list, tuple)):
diff --git a/src/arch/x86/ucasmlib/arch/x86/microops/specop.py b/src/arch/x86/ucasmlib/arch/x86/microops/specop.py
index fa5066f..b0dd46d 100644
--- a/src/arch/x86/ucasmlib/arch/x86/microops/specop.py
+++ b/src/arch/x86/ucasmlib/arch/x86/microops/specop.py
@@ -40,6 +40,7 @@
 class Fault(X86Microop):
     className = 'MicroFault'
     def __init__(self, fault, flags=None):
+        super().__init__()
         self.fault = fault
         if flags:
             if not isinstance(flags, (list, tuple)):
@@ -59,9 +60,6 @@

 class Halt(X86Microop):
     className = 'MicroHalt'
-    def __init__(self):
-        pass
-
     def getAllocator(self, microFlags):
         return 'new X86ISA::MicroHalt(machInst, macrocodeBlock, ' \
                 f'{self.microFlagsText(microFlags)})'
@@ -70,6 +68,7 @@

 class MfenceOp(X86Microop):
     def __init__(self):
+        super().__init__()
         self.className = 'Mfence'
         self.mnemonic = 'mfence'
         self.instFlags = '| (1ULL << StaticInst::IsReadBarrier)' \
diff --git a/src/arch/x86/ucasmlib/arch/x86/rom.py b/src/arch/x86/ucasmlib/arch/x86/rom.py
index 74ddeb6..c84fc39 100644
--- a/src/arch/x86/ucasmlib/arch/x86/rom.py
+++ b/src/arch/x86/ucasmlib/arch/x86/rom.py
@@ -28,21 +28,21 @@

 class Rom(ucasmlib.containers.Rom):
     def getDeclaration(self):
-        declareLabels = "namespace rom_labels\n{\n"
-        for (label, micropc) in self.labels.items():
-            declareLabels += "const static uint64_t label_%s = %d;\n" \
-                              % (label, micropc)
-        for (label, micropc) in self.externs.items():
-            declareLabels += \
-                "const static MicroPC extern_label_%s = %d;\n" \
-                    % (label, micropc)
-        declareLabels += "}\n"
-        return declareLabels;
+        return '';

     def getDefinition(self):
         elements = map(lambda op: op.getGenerator(), self.microops)
-        allocator = "{" + ',\n'.join(elements) + "}"
+        allocator = '{' + ',\n'.join(elements) + '}'

-        return '''
-X86ISAInst::MicrocodeRom::MicrocodeRom() : genFuncs(%s) {}
-''' % allocator
+        label_items = list([f'{{ "{label}", romMicroPC({micropc}) }}' for
+                label, micropc in self.labels.items()])
+        extern_items = list([f'{{ "{label}", romMicroPC({micropc}) }}' for
+                label, micropc in self.externs.items()])
+        labels = f'{{ {", ".join(label_items + extern_items)} }}'
+        externs = f'{{ {", ".join(extern_items)} }}'
+
+        return f'''
+X86ISAInst::MicrocodeRom::MicrocodeRom() : genFuncs({allocator}),
+    labels({labels}), externs({externs})
+{{}}
+'''
diff --git a/src/arch/x86/ucasmlib/arch/x86/symbols.py b/src/arch/x86/ucasmlib/arch/x86/symbols.py
index 0a369e8..7367825 100644
--- a/src/arch/x86/ucasmlib/arch/x86/symbols.py
+++ b/src/arch/x86/ucasmlib/arch/x86/symbols.py
@@ -178,12 +178,8 @@
     lambda width: f'adjustedImm = adjustedImm & mask({width});'

 symbols["label"] = lambda label_str: f'label_{label_str}'
-
 symbols["rom_label"] = \
-    lambda label_str: f'romMicroPC(rom_labels::extern_label_{label_str})'
-
-symbols['rom_local_label'] = \
-    lambda label_str: f'romMicroPC(rom_labels::label_{label_str})'
+    lambda label_str: f'microcodeRom.getLabel("{label_str}")'

 def stack_index(index):
     return fpRegIdx(f'NUM_FLOATREGS + ((({index}) + 8) % 8)')

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