Cleaned things up a little.

--HG--
extra : convert_revision : 7091b0d02e5b7c80be43b5ab1ac003dc89c4c136
This commit is contained in:
Gabe Black 2006-07-19 02:07:00 -04:00
parent 44974a4462
commit b7b603f9a7
7 changed files with 115 additions and 207 deletions

View file

@ -85,7 +85,12 @@ output header {{
std::string generateDisassembly(Addr pc, std::string generateDisassembly(Addr pc,
const SymbolTable *symtab) const; const SymbolTable *symtab) const;
void printReg(std::ostream &os, int reg) const; void printReg(std::ostream &os, RegIndex reg) const;
void printSrcReg(std::ostream &os, int reg) const;
void printDestReg(std::ostream &os, int reg) const;
void printRegArray(std::ostream &os,
const RegIndex indexArray[], int num) const;
}; };
bool passesCondition(uint32_t codes, uint32_t condition); bool passesCondition(uint32_t codes, uint32_t condition);
@ -150,8 +155,35 @@ output decoder {{
ccprintf(os, "\t%s ", mnemonic); ccprintf(os, "\t%s ", mnemonic);
} }
void SparcStaticInst::printRegArray(std::ostream &os,
const RegIndex indexArray[], int num) const
{
if(num <= 0)
return;
printReg(os, indexArray[0]);
for(int x = 1; x < num; x++)
{
os << ", ";
printReg(os, indexArray[x]);
}
}
void void
SparcStaticInst::printReg(std::ostream &os, int reg) const SparcStaticInst::printSrcReg(std::ostream &os, int reg) const
{
if(_numSrcRegs > reg)
printReg(os, _srcRegIdx[reg]);
}
void
SparcStaticInst::printDestReg(std::ostream &os, int reg) const
{
if(_numDestRegs > reg)
printReg(os, _destRegIdx[reg]);
}
void
SparcStaticInst::printReg(std::ostream &os, RegIndex reg) const
{ {
const int MaxGlobal = 8; const int MaxGlobal = 8;
const int MaxOutput = 16; const int MaxOutput = 16;

View file

@ -39,30 +39,30 @@ decode OP default Unknown::unknown()
{ {
//Throw an illegal instruction acception //Throw an illegal instruction acception
0x0: Trap::illtrap({{fault = new IllegalInstruction;}}); 0x0: Trap::illtrap({{fault = new IllegalInstruction;}});
format BranchN
{
0x1: decode BPCC 0x1: decode BPCC
{ {
format Branch19 0x0: bpcci(19, {{
{
0x0: bpcci({{
if(passesCondition(Ccr<3:0>, COND2)) if(passesCondition(Ccr<3:0>, COND2))
NNPC = xc->readPC() + disp; NNPC = xc->readPC() + disp;
else else
handle_annul handle_annul
}}); }});
0x2: bpccx({{ 0x2: bpccx(19, {{
if(passesCondition(Ccr<7:4>, COND2)) if(passesCondition(Ccr<7:4>, COND2))
NNPC = xc->readPC() + disp; NNPC = xc->readPC() + disp;
else else
handle_annul handle_annul
}}); }});
} }
} 0x2: bicc(22, {{
0x2: Branch22::bicc({{
if(passesCondition(Ccr<3:0>, COND2)) if(passesCondition(Ccr<3:0>, COND2))
NNPC = xc->readPC() + disp; NNPC = xc->readPC() + disp;
else else
handle_annul handle_annul
}}); }});
}
0x3: decode RCOND2 0x3: decode RCOND2
{ {
format BranchSplit format BranchSplit
@ -110,7 +110,7 @@ decode OP default Unknown::unknown()
0x5: Trap::fbpfcc({{fault = new FpDisabled;}}); 0x5: Trap::fbpfcc({{fault = new FpDisabled;}});
0x6: Trap::fbfcc({{fault = new FpDisabled;}}); 0x6: Trap::fbfcc({{fault = new FpDisabled;}});
} }
0x1: Branch30::call({{ 0x1: BranchN::call(30, {{
R15 = xc->readPC(); R15 = xc->readPC();
NNPC = R15 + disp; NNPC = R15 + disp;
}}); }});

View file

@ -63,7 +63,6 @@ def template BasicExecute {{
{ {
Fault fault = NoFault; Fault fault = NoFault;
%(fp_enable_check)s;
%(op_decl)s; %(op_decl)s;
%(op_rd)s; %(op_rd)s;
%(code)s; %(code)s;
@ -81,11 +80,6 @@ def template BasicDecode {{
return new %(class_name)s(machInst); return new %(class_name)s(machInst);
}}; }};
// Basic decode template, passing mnemonic in as string arg to constructor.
def template BasicDecodeWithMnemonic {{
return new %(class_name)s("%(mnemonic)s", machInst);
}};
// The most basic instruction format... used only for a few misc. insts // The most basic instruction format... used only for a few misc. insts
def format BasicOperate(code, *flags) {{ def format BasicOperate(code, *flags) {{
iop = InstObjParams(name, Name, 'SparcStaticInst', iop = InstObjParams(name, Name, 'SparcStaticInst',

View file

@ -69,47 +69,18 @@ output header {{
}; };
/** /**
* Base class for branches with 19 bit displacements. * Base class for branches with n bit displacements.
*/ */
class Branch19 : public BranchDisp template<int bits>
class BranchNBits : public BranchDisp
{ {
protected: protected:
// Constructor // Constructor
Branch19(const char *mnem, MachInst _machInst, BranchNBits(const char *mnem, MachInst _machInst,
OpClass __opClass) : OpClass __opClass) :
BranchDisp(mnem, _machInst, __opClass) BranchDisp(mnem, _machInst, __opClass)
{ {
disp = sign_ext(DISP19 << 2, 21); disp = sign_ext(_machInst << 2, bits + 2);
}
};
/**
* Base class for branches with 22 bit displacements.
*/
class Branch22 : public BranchDisp
{
protected:
// Constructor
Branch22(const char *mnem, MachInst _machInst,
OpClass __opClass) :
BranchDisp(mnem, _machInst, __opClass)
{
disp = sign_ext(DISP22 << 2, 24);
}
};
/**
* Base class for branches with 30 bit displacements.
*/
class Branch30 : public BranchDisp
{
protected:
// Constructor
Branch30(const char *mnem, MachInst _machInst,
OpClass __opClass) :
BranchDisp(mnem, _machInst, __opClass)
{
disp = sign_ext(DISP30 << 2, 32);
} }
}; };
@ -149,29 +120,23 @@ output header {{
}}; }};
output decoder {{ output decoder {{
template class BranchNBits<19>;
template class BranchNBits<22>;
template class BranchNBits<30>;
std::string Branch::generateDisassembly(Addr pc, std::string Branch::generateDisassembly(Addr pc,
const SymbolTable *symtab) const const SymbolTable *symtab) const
{ {
std::stringstream response; std::stringstream response;
printMnemonic(response, mnemonic); printMnemonic(response, mnemonic);
printRegArray(response, _srcRegIdx, _numSrcRegs);
if (_numSrcRegs > 0) if(_numDestRegs && _numSrcRegs)
{
printReg(response, _srcRegIdx[0]);
for(int x = 1; x < _numSrcRegs; x++)
{
response << ", "; response << ", ";
printReg(response, _srcRegIdx[x]); printDestReg(response, 0);
}
}
if (_numDestRegs > 0)
{
if(_numSrcRegs > 0)
response << ", ";
printReg(response, _destRegIdx[0]);
}
return response.str(); return response.str();
} }
@ -182,27 +147,13 @@ output decoder {{
std::stringstream response; std::stringstream response;
printMnemonic(response, mnemonic); printMnemonic(response, mnemonic);
printRegArray(response, _srcRegIdx, _numSrcRegs);
if (_numSrcRegs > 0)
{
printReg(response, _srcRegIdx[0]);
for(int x = 1; x < _numSrcRegs; x++)
{
response << ", ";
printReg(response, _srcRegIdx[x]);
}
}
if(_numSrcRegs > 0) if(_numSrcRegs > 0)
response << ", "; response << ", ";
ccprintf(response, "0x%x", imm); ccprintf(response, "0x%x", imm);
if (_numDestRegs > 0) if (_numDestRegs > 0)
{
response << ", "; response << ", ";
printReg(response, _destRegIdx[0]); printDestReg(response, 0);
}
return response.str(); return response.str();
} }
@ -292,32 +243,10 @@ def format Branch(code, *opt_flags) {{
}}; }};
// Primary format for branch instructions: // Primary format for branch instructions:
def format Branch19(code, *opt_flags) {{ def format BranchN(bits, code, *opt_flags) {{
code = re.sub(r'handle_annul', handle_annul, code) code = re.sub(r'handle_annul', handle_annul, code)
codeBlk = CodeBlock(code) codeBlk = CodeBlock(code)
iop = InstObjParams(name, Name, 'Branch19', codeBlk, opt_flags) iop = InstObjParams(name, Name, "BranchNBits<%d>" % bits, codeBlk, opt_flags)
header_output = BasicDeclare.subst(iop)
decoder_output = BasicConstructor.subst(iop)
exec_output = BranchExecute.subst(iop)
decode_block = BasicDecode.subst(iop)
}};
// Primary format for branch instructions:
def format Branch22(code, *opt_flags) {{
code = re.sub(r'handle_annul', handle_annul, code)
codeBlk = CodeBlock(code)
iop = InstObjParams(name, Name, 'Branch22', codeBlk, opt_flags)
header_output = BasicDeclare.subst(iop)
decoder_output = BasicConstructor.subst(iop)
exec_output = BranchExecute.subst(iop)
decode_block = BasicDecode.subst(iop)
}};
// Primary format for branch instructions:
def format Branch30(code, *opt_flags) {{
code = re.sub(r'handle_annul', handle_annul, code)
codeBlk = CodeBlock(code)
iop = InstObjParams(name, Name, 'Branch30', codeBlk, opt_flags)
header_output = BasicDeclare.subst(iop) header_output = BasicDeclare.subst(iop)
decoder_output = BasicConstructor.subst(iop) decoder_output = BasicConstructor.subst(iop)
exec_output = BranchExecute.subst(iop) exec_output = BranchExecute.subst(iop)

View file

@ -132,7 +132,7 @@ output header {{
OpClass __opClass) : OpClass __opClass) :
IntOpImm(mnem, _machInst, __opClass) IntOpImm(mnem, _machInst, __opClass)
{ {
imm = (IMM22 << 10) & 0xFFFFFC00; imm = (IMM22 & 0x3FFFFF) << 10;
} }
std::string generateDisassembly(Addr pc, std::string generateDisassembly(Addr pc,
@ -157,12 +157,9 @@ output decoder {{
if(!strcmp(mnemonic, "or") && _srcRegIdx[0] == 0) if(!strcmp(mnemonic, "or") && _srcRegIdx[0] == 0)
{ {
printMnemonic(os, "mov"); printMnemonic(os, "mov");
if(_numSrcRegs > 0) printSrcReg(os, 1);
printReg(os, _srcRegIdx[1]);
ccprintf(os, ", "); ccprintf(os, ", ");
if(_numDestRegs > 0) printDestReg(os, 0);
printReg(os, _destRegIdx[0]);
return true; return true;
} }
return false; return false;
@ -173,32 +170,24 @@ output decoder {{
{ {
if(!strcmp(mnemonic, "or")) if(!strcmp(mnemonic, "or"))
{ {
if(_srcRegIdx[0] == 0) if(_numSrcRegs > 0 && _srcRegIdx[0] == 0)
{ {
if(imm == 0) if(imm == 0)
{
printMnemonic(os, "clr"); printMnemonic(os, "clr");
if(_numDestRegs > 0)
printReg(os, _destRegIdx[0]);
return true;
}
else else
{ {
printMnemonic(os, "mov"); printMnemonic(os, "mov");
ccprintf(os, ", 0x%x, ", imm); ccprintf(os, " 0x%x, ", imm);
if(_numDestRegs > 0)
printReg(os, _destRegIdx[0]);
return true;
} }
printDestReg(os, 0);
return true;
} }
else if(imm == 0) else if(imm == 0)
{ {
printMnemonic(os, "mov"); printMnemonic(os, "mov");
if(_numSrcRegs > 0) printSrcReg(os, 0);
printReg(os, _srcRegIdx[0]);
ccprintf(os, ", "); ccprintf(os, ", ");
if(_numDestRegs > 0) printDestReg(os, 0);
printReg(os, _destRegIdx[0]);
return true; return true;
} }
} }
@ -210,25 +199,13 @@ output decoder {{
{ {
std::stringstream response; std::stringstream response;
if(!printPseudoOps(response, pc, symtab)) if(printPseudoOps(response, pc, symtab))
{ return response.str();
printMnemonic(response, mnemonic); printMnemonic(response, mnemonic);
if (_numSrcRegs > 0) printRegArray(response, _srcRegIdx, _numSrcRegs);
{ if(_numDestRegs && _numSrcRegs)
printReg(response, _srcRegIdx[0]);
for(int x = 1; x < _numSrcRegs; x++)
{
response << ", "; response << ", ";
printReg(response, _srcRegIdx[x]); printDestReg(response, 0);
}
}
if (_numDestRegs > 0)
{
if(_numSrcRegs > 0)
response << ", ";
printReg(response, _destRegIdx[0]);
}
}
return response.str(); return response.str();
} }
@ -237,27 +214,16 @@ output decoder {{
{ {
std::stringstream response; std::stringstream response;
if(!printPseudoOps(response, pc, symtab)) if(printPseudoOps(response, pc, symtab))
{ return response.str();
printMnemonic(response, mnemonic); printMnemonic(response, mnemonic);
if (_numSrcRegs > 0) printRegArray(response, _srcRegIdx, _numSrcRegs);
{
printReg(response, _srcRegIdx[0]);
for(int x = 1; x < _numSrcRegs - 1; x++)
{
response << ", ";
printReg(response, _srcRegIdx[x]);
}
}
if(_numSrcRegs > 0) if(_numSrcRegs > 0)
response << ", "; response << ", ";
ccprintf(response, "0x%x", imm); ccprintf(response, "0x%x", imm);
if(_numDestRegs > 0) if(_numDestRegs > 0)
{
response << ", "; response << ", ";
printReg(response, _destRegIdx[0]); printDestReg(response, 0);
}
}
return response.str(); return response.str();
} }
@ -267,10 +233,8 @@ output decoder {{
std::stringstream response; std::stringstream response;
printMnemonic(response, mnemonic); printMnemonic(response, mnemonic);
if(_numSrcRegs > 0)
response << ", ";
ccprintf(response, "%%hi(0x%x), ", imm); ccprintf(response, "%%hi(0x%x), ", imm);
printReg(response, _destRegIdx[0]); printDestReg(response, 0);
return response.str(); return response.str();
} }
}}; }};
@ -316,38 +280,29 @@ let {{
return (header_output, decoder_output, exec_output, decode_block) return (header_output, decoder_output, exec_output, decode_block)
calcCcCode = ''' calcCcCode = '''
uint8_t tmp_ccriccc; uint16_t _ic, _iv, _iz, _in, _xc, _xv, _xz, _xn;
uint8_t tmp_ccriccv;
uint8_t tmp_ccriccz;
uint8_t tmp_ccriccn;
uint8_t tmp_ccrxccc;
uint8_t tmp_ccrxccv;
uint8_t tmp_ccrxccz;
uint8_t tmp_ccrxccn;
tmp_ccriccn = (Rd >> 31) & 1; _in = (Rd >> 31) & 1;
tmp_ccriccz = ((Rd & 0xFFFFFFFF) == 0); _iz = ((Rd & 0xFFFFFFFF) == 0);
tmp_ccrxccn = (Rd >> 63) & 1; _xn = (Rd >> 63) & 1;
tmp_ccrxccz = (Rd == 0); _xz = (Rd == 0);
tmp_ccriccv = %(ivValue)s & 1; _iv = %(ivValue)s & 1;
tmp_ccriccc = %(icValue)s & 1; _ic = %(icValue)s & 1;
tmp_ccrxccv = %(xvValue)s & 1; _xv = %(xvValue)s & 1;
tmp_ccrxccc = %(xcValue)s & 1; _xc = %(xcValue)s & 1;
Ccr = tmp_ccriccc | tmp_ccriccv << 1 | Ccr = _ic << 0 | _iv << 1 | _iz << 2 | _in << 3 |
tmp_ccriccz << 2 | tmp_ccriccn << 3| _xc << 4 | _xv << 5 | _xz << 6 | _xn << 7;
tmp_ccrxccc << 4 | tmp_ccrxccv << 5|
tmp_ccrxccz << 6| tmp_ccrxccn << 7;
DPRINTF(Sparc, "in = %%d\\n", (uint16_t)tmp_ccriccn); DPRINTF(Sparc, "in = %%d\\n", _in);
DPRINTF(Sparc, "iz = %%d\\n", (uint16_t)tmp_ccriccz); DPRINTF(Sparc, "iz = %%d\\n", _iz);
DPRINTF(Sparc, "xn = %%d\\n", (uint16_t)tmp_ccrxccn); DPRINTF(Sparc, "xn = %%d\\n", _xn);
DPRINTF(Sparc, "xz = %%d\\n", (uint16_t)tmp_ccrxccz); DPRINTF(Sparc, "xz = %%d\\n", _xz);
DPRINTF(Sparc, "iv = %%d\\n", (uint16_t)tmp_ccriccv); DPRINTF(Sparc, "iv = %%d\\n", _iv);
DPRINTF(Sparc, "ic = %%d\\n", (uint16_t)tmp_ccriccc); DPRINTF(Sparc, "ic = %%d\\n", _ic);
DPRINTF(Sparc, "xv = %%d\\n", (uint16_t)tmp_ccrxccv); DPRINTF(Sparc, "xv = %%d\\n", _xv);
DPRINTF(Sparc, "xc = %%d\\n", (uint16_t)tmp_ccrxccc); DPRINTF(Sparc, "xc = %%d\\n", _xc);
''' '''
}}; }};

View file

@ -72,7 +72,11 @@ output decoder {{
std::string Priv::generateDisassembly(Addr pc, std::string Priv::generateDisassembly(Addr pc,
const SymbolTable *symtab) const const SymbolTable *symtab) const
{ {
return "Privileged Instruction"; std::stringstream response;
printMnemonic(response, mnemonic);
return response.str();
} }
}}; }};

View file

@ -36,7 +36,6 @@
output header {{ output header {{
#include <sstream> #include <sstream>
#include <iostream> #include <iostream>
#include <iomanip>
#include "cpu/static_inst.hh" #include "cpu/static_inst.hh"
#include "arch/sparc/faults.hh" #include "arch/sparc/faults.hh"
@ -50,7 +49,6 @@ output decoder {{
#include "base/loader/symtab.hh" #include "base/loader/symtab.hh"
#include "cpu/thread_context.hh" // for Jump::branchTarget() #include "cpu/thread_context.hh" // for Jump::branchTarget()
#include <math.h>
#if defined(linux) #if defined(linux)
#include <fenv.h> #include <fenv.h>
#endif #endif
@ -59,14 +57,10 @@ using namespace SparcISA;
}}; }};
output exec {{ output exec {{
#include <math.h>
#if defined(linux) #if defined(linux)
#include <fenv.h> #include <fenv.h>
#endif #endif
#ifdef FULL_SYSTEM
//#include "sim/pseudo_inst.hh"
#endif
#include "cpu/base.hh" #include "cpu/base.hh"
#include "cpu/exetrace.hh" #include "cpu/exetrace.hh"
#include "sim/sim_exit.hh" #include "sim/sim_exit.hh"