35a36,129
> output header {{
> /**
> * Base class for memory operations.
> */
> class Mem : public SparcStaticInst
> {
> protected:
>
> // Constructor
> Mem(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
> SparcStaticInst(mnem, _machInst, __opClass)
> {
> }
>
> std::string generateDisassembly(Addr pc,
> const SymbolTable *symtab) const;
> };
>
> /**
> * Class for memory operations which use an immediate offset.
> */
> class MemImm : public Mem
> {
> protected:
>
> // Constructor
> MemImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
> Mem(mnem, _machInst, __opClass), imm(sext<13>(SIMM13))
> {}
>
> std::string generateDisassembly(Addr pc,
> const SymbolTable *symtab) const;
>
> const int32_t imm;
> };
> }};
>
> output decoder {{
> std::string Mem::generateDisassembly(Addr pc,
> const SymbolTable *symtab) const
> {
> std::stringstream response;
> bool load = flags[IsLoad];
> bool save = flags[IsStore];
>
> printMnemonic(response, mnemonic);
> if(save)
> {
> printReg(response, _srcRegIdx[0]);
> ccprintf(response, ", ");
> }
> ccprintf(response, "[ ");
> printReg(response, _srcRegIdx[!save ? 0 : 1]);
> ccprintf(response, " + ");
> printReg(response, _srcRegIdx[!save ? 1 : 2]);
> ccprintf(response, " ]");
> if(load)
> {
> ccprintf(response, ", ");
> printReg(response, _destRegIdx[0]);
> }
>
> return response.str();
> }
>
> std::string MemImm::generateDisassembly(Addr pc,
> const SymbolTable *symtab) const
> {
> std::stringstream response;
> bool load = flags[IsLoad];
> bool save = flags[IsStore];
>
> printMnemonic(response, mnemonic);
> if(save)
> {
> printReg(response, _srcRegIdx[0]);
> ccprintf(response, ", ");
> }
> ccprintf(response, "[ ");
> printReg(response, _srcRegIdx[!save ? 0 : 1]);
> if(imm >= 0)
> ccprintf(response, " + 0x%x ]", imm);
> else
> ccprintf(response, " + -0x%x ]", -imm);
> if(load)
> {
> ccprintf(response, ", ");
> printReg(response, _destRegIdx[0]);
> }
>
> return response.str();
> }
> }};
>