These patches let you trace the macroops that go with the currently executing microops. By default, microops are traced and macroops aren't. Instructions that are neither still work the same way. That means if you don't do anything differently, you shouldn't really see a difference. If you turn on ExecMacro, macroops will be disassembled before their first microop. If you turn on ExecMacro and turn off ExecMicro, the macroop will print when the last microop commits. The idea is that if microops are printing, the macroop is for context, and otherwise it follows the convention for regular instructions where it's only traced if it commits.
Gabe Gabe Black wrote: > changeset 6d4161a36ca1 in /z/repo/m5 > details: http://repo.m5sim.org/m5?cmd=changeset;node=6d4161a36ca1 > description: > X86: Autogenerate macroop generateDisassemble function. > > diffstat: > > 3 files changed, 7 insertions(+), 4 deletions(-) > src/arch/x86/insts/macroop.hh | 4 +++- > src/arch/x86/isa/macroop.isa | 1 - > src/arch/x86/isa/specialize.isa | 6 ++++-- > > diffs (truncated from 409 to 300 lines): > > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/insts/macroop.hh > --- a/src/arch/x86/insts/macroop.hh Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/insts/macroop.hh Tue Jan 06 22:55:27 2009 -0800 > @@ -65,17 +65,19 @@ > namespace X86ISA > { > // Base class for combinationally generated macroops > -class MacroopBase : public StaticInst > +class MacroopBase : public X86StaticInst > { > protected: > + const char *macrocodeBlock; > + > const uint32_t numMicroops; > - X86ISA::EmulEnv emulEnv; > + X86ISA::EmulEnv env; > > //Constructor. > MacroopBase(const char *mnem, ExtMachInst _machInst, > - uint32_t _numMicroops, X86ISA::EmulEnv _emulEnv) > - : StaticInst(mnem, _machInst, No_OpClass), > - numMicroops(_numMicroops), emulEnv(_emulEnv) > + uint32_t _numMicroops, X86ISA::EmulEnv _env) : > + X86StaticInst(mnem, _machInst, No_OpClass), > + numMicroops(_numMicroops), env(_env) > { > assert(numMicroops); > microops = new StaticInstPtr[numMicroops]; > @@ -95,8 +97,8 @@ > return microops[microPC]; > } > > - std::string generateDisassembly(Addr pc, > - const SymbolTable *symtab) const > + std::string > + generateDisassembly(Addr pc, const SymbolTable *symtab) const > { > return mnemonic; > } > @@ -111,7 +113,7 @@ > X86ISA::EmulEnv > getEmulEnv() > { > - return emulEnv; > + return env; > } > }; > } > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/macroop.isa > --- a/src/arch/x86/isa/macroop.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/macroop.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -76,8 +76,8 @@ > { > public: > Macroop(const char *mnem, ExtMachInst _machInst, > - uint32_t _numMicroops, X86ISA::EmulEnv _emulEnv) > - : MacroopBase(mnem, _machInst, _numMicroops, > _emulEnv) > + uint32_t _numMicroops, X86ISA::EmulEnv _env) > + : MacroopBase(mnem, _machInst, _numMicroops, _env) > {} > %(MacroExecPanic)s > }; > @@ -102,22 +102,42 @@ > %(declareLabels)s > public: > // Constructor. > - %(class_name)s(ExtMachInst machInst, X86ISA::EmulEnv env); > + %(class_name)s(ExtMachInst machInst, X86ISA::EmulEnv _env); > + > + std::string > + generateDisassembly(Addr pc, const SymbolTable *symtab) > const; > }; > }; > +}}; > + > +def template MacroDisassembly {{ > + std::string > + X86Macroop::%(class_name)s::generateDisassembly(Addr pc, > + const SymbolTable *symtab) const > + { > + std::stringstream out; > + out << mnemonic << "\t"; > + > + int regSize = %(regSize)s; > + %(disassembly)s > + // Shut up gcc. > + regSize = regSize; > + return out.str(); > + } > }}; > > // Basic instruction class constructor template. > def template MacroConstructor {{ > inline X86Macroop::%(class_name)s::%(class_name)s( > - ExtMachInst machInst, EmulEnv env) > - : %(base_class)s("%(mnemonic)s", machInst, %(num_microops)s, env) > + ExtMachInst machInst, EmulEnv _env) > + : %(base_class)s("%(mnemonic)s", machInst, %(num_microops)s, > _env) > { > %(adjust_env)s; > %(adjust_imm)s; > %(adjust_disp)s; > %(do_modrm)s; > %(constructor)s; > + const char *macrocodeBlock = "%(class_name)s"; > //alloc_microops is the code that sets up the microops > //array in the parent class. > %(alloc_microops)s; > @@ -158,7 +178,12 @@ > adjustedDisp = adjustedDisp; > ''' > def getAllocator(self, env): > - return "new X86Macroop::%s(machInst, %s)" % (self.name, > env.getAllocator()) > + return "new X86Macroop::%s(machInst, %s)" % \ > + (self.name, env.getAllocator()) > + def getMnemonic(self): > + mnemonic = self.name.lower() > + mnemonic = re.match(r'[^_]*', mnemonic).group(0) > + return mnemonic > def getDeclaration(self): > #FIXME This first parameter should be the mnemonic. I need to > #write some code which pulls that out > @@ -166,12 +191,12 @@ > for (label, microop) in self.labels.items(): > declareLabels += "const static uint64_t label_%s = %d;\n" \ > % (label, microop.micropc) > - iop = InstObjParams(self.name, self.name, "Macroop", > + iop = InstObjParams(self.getMnemonic(), self.name, "Macroop", > {"code" : "", > "declareLabels" : declareLabels > }) > return MacroDeclare.subst(iop); > - def getDefinition(self): > + def getDefinition(self, env): > #FIXME This first parameter should be the mnemonic. I need to > #write some code which pulls that out > numMicroops = len(self.microops) > @@ -184,14 +209,28 @@ > (micropc, op.getAllocator(True, not isLast, > micropc == 0, isLast)) > micropc += 1 > - iop = InstObjParams(self.name, self.name, "Macroop", > + if env.useStackSize: > + useStackSize = "true" > + else: > + useStackSize = "false" > + if env.memoryInst: > + memoryInst = "true" > + else: > + memoryInst = "false" > + regSize = '''(%s || (env.base == INTREG_RSP && %s) ? > + env.stackSize : > + env.dataSize)''' % (useStackSize, memoryInst) > + iop = InstObjParams(self.getMnemonic(), self.name, "Macroop", > {"code" : "", "num_microops" : numMicroops, > "alloc_microops" : allocMicroops, > "adjust_env" : self.adjust_env, > "adjust_imm" : self.adjust_imm, > "adjust_disp" : self.adjust_disp, > + "disassembly" : env.disassembly, > + "regSize" : regSize, > "do_modrm" : self.doModRM}) > - return MacroConstructor.subst(iop); > + return MacroConstructor.subst(iop) + \ > + MacroDisassembly.subst(iop); > }}; > > let {{ > @@ -207,6 +246,16 @@ > self.dataSize = "OPSIZE" > self.stackSize = "STACKSIZE" > self.doModRM = False > + self.disassembly = "" > + self.firstArgument = True > + self.useStackSize = False > + self.memoryInst = False > + > + def addToDisassembly(self, code): > + if not self.firstArgument: > + self.disassembly += "out << \", \";\n" > + self.firstArgument = False > + self.disassembly += code > > def getAllocator(self): > if self.size == 'b': > @@ -264,7 +313,7 @@ > if env.doModRM: > macroop.doModRM = doModRMString > blocks.header_output = macroop.getDeclaration() > - blocks.decoder_output = macroop.getDefinition() > + blocks.decoder_output = macroop.getDefinition(env) > macroop.declared = True > blocks.decode_block = "return %s;\n" % macroop.getAllocator(env) > return blocks > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/base.isa > --- a/src/arch/x86/isa/microops/base.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/base.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -76,7 +76,7 @@ > StaticInstPtr > ''' + generatorNameTemplate + '''(StaticInstPtr curMacroop) > { > - static const char * mnemonic = romMnemonic; > + static const char *macrocodeBlock = romMnemonic; > static const ExtMachInst dummyExtMachInst; > static const EmulEnv dummyEmulEnv(0, 0, 1, 1, 1); > > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/debug.isa > --- a/src/arch/x86/isa/microops/debug.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/debug.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -183,7 +183,7 @@ > self.cond = "0" > > def getAllocator(self, *microFlags): > - allocator = '''new %(class_name)s(machInst, mnemonic > + allocator = '''new %(class_name)s(machInst, macrocodeBlock > %(flags)s, "%(message)s", %(cc)s)''' % { > "class_name" : self.className, > "flags" : self.microFlagsText(microFlags), > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/fpop.isa > --- a/src/arch/x86/isa/microops/fpop.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/fpop.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -245,7 +245,7 @@ > self.className += "Top" > > def getAllocator(self, *microFlags): > - return '''new %(class_name)s(machInst, mnemonic > + return '''new %(class_name)s(machInst, macrocodeBlock > %(flags)s, %(src1)s, %(src2)s, %(dest)s, > %(dataSize)s, %(spm)d)''' % { > "class_name" : self.className, > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/ldstop.isa > --- a/src/arch/x86/isa/microops/ldstop.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/ldstop.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -362,7 +362,7 @@ > self.addressSize = addressSize > > def getAllocator(self, *microFlags): > - allocator = '''new %(class_name)s(machInst, mnemonic > + allocator = '''new %(class_name)s(machInst, macrocodeBlock > %(flags)s, %(scale)s, %(index)s, %(base)s, > %(disp)s, %(segment)s, %(data)s, > %(dataSize)s, %(addressSize)s)''' % { > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/limmop.isa > --- a/src/arch/x86/isa/microops/limmop.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/limmop.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -154,7 +154,7 @@ > self.dataSize = dataSize > > def getAllocator(self, *microFlags): > - allocator = '''new %(class_name)s(machInst, mnemonic > + allocator = '''new %(class_name)s(machInst, macrocodeBlock > %(flags)s, %(dest)s, %(imm)s, %(dataSize)s)''' % { > "class_name" : self.className, > "mnemonic" : self.mnemonic, > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/regop.isa > --- a/src/arch/x86/isa/microops/regop.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/regop.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -438,7 +438,7 @@ > className = self.className > if self.mnemonic == self.base_mnemonic + 'i': > className += "Imm" > - allocator = '''new %(class_name)s(machInst, mnemonic > + allocator = '''new %(class_name)s(machInst, macrocodeBlock > %(flags)s, %(src1)s, %(op2)s, %(dest)s, > %(dataSize)s, %(ext)s)''' % { > "class_name" : className, > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/seqop.isa > --- a/src/arch/x86/isa/microops/seqop.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/seqop.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -181,7 +181,7 @@ > self.cond = "0" > > def getAllocator(self, *microFlags): > - allocator = '''new %(class_name)s(machInst, mnemonic > + allocator = '''new %(class_name)s(machInst, macrocodeBlock > %(flags)s, %(target)s, %(cc)s)''' % { > "class_name" : self.className, > "flags" : self.microFlagsText(microFlags), > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/microops/specop.isa > --- a/src/arch/x86/isa/microops/specop.isa Tue Jan 06 22:46:28 2009 -0800 > +++ b/src/arch/x86/isa/microops/specop.isa Tue Jan 06 22:55:27 2009 -0800 > @@ -230,7 +230,7 @@ > self.cond = "0" > > def getAllocator(self, *microFlags): > - allocator = '''new %(class_name)s(machInst, mnemonic > + allocator = '''new %(class_name)s(machInst, macrocodeBlock > %(flags)s, %(fault)s, %(cc)s)''' % { > "class_name" : self.className, > "flags" : self.microFlagsText(microFlags), > @@ -257,7 +257,7 @@ > pass > > def getAllocator(self, *microFlags): > - return "new MicroHalt(machInst, mnemonic %s)" % \ > + return "new MicroHalt(machInst, macrocodeBlock %s)" % \ > self.microFlagsText(microFlags) > > microopClasses["halt"] = Halt > diff -r e3a6f53818fe -r 6d4161a36ca1 src/arch/x86/isa/specialize.isa > _______________________________________________ > m5-dev mailing list > [email protected] > http://m5sim.org/mailman/listinfo/m5-dev > _______________________________________________ m5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/m5-dev
