Implemented fbfss and fbpfcc instructions, and cleaned up branch code a little.

src/arch/sparc/isa/base.isa:
    Added passesFpCondition function to help with fbfcc and fbpfcc instructions.
src/arch/sparc/isa/decoder.isa:
    Added fbfcc and fbpfcc instructions, and cleaned up branch code slightly.
src/arch/sparc/isa/formats/branch.isa:
    Minor cleanup.

--HG--
extra : convert_revision : 6586b46418f1f70bace41407f267fee30c657714
This commit is contained in:
Gabe Black 2007-01-30 16:12:38 -05:00
parent 0cdcd207ac
commit efb14c585b
3 changed files with 161 additions and 16 deletions

View file

@ -67,6 +67,26 @@ output header {{
OverflowSet=0x7
};
enum FpCondTest
{
FAlways=0x8,
FNever=0x0,
FUnordered=0x7,
FGreater=0x6,
FUnorderedOrGreater=0x5,
FLess=0x4,
FUnorderedOrLess=0x3,
FLessOrGreater=0x2,
FNotEqual=0x1,
FEqual=0x9,
FUnorderedOrEqual=0xA,
FGreaterOrEqual=0xB,
FUnorderedOrGreaterOrEqual=0xC,
FLessOrEqual=0xD,
FUnorderedOrLessOrEqual=0xE,
FOrdered=0xF
};
extern char * CondTestAbbrev[];
/**
@ -93,6 +113,8 @@ output header {{
const RegIndex indexArray[], int num) const;
};
bool passesFpCondition(uint32_t fcc, uint32_t condition);
bool passesCondition(uint32_t codes, uint32_t condition);
inline int64_t sign_ext(uint64_t data, int origWidth)
@ -367,6 +389,51 @@ output decoder {{
return ss.str();
}
bool passesFpCondition(uint32_t fcc, uint32_t condition)
{
bool u = (fcc == 3);
bool g = (fcc == 2);
bool l = (fcc == 1);
bool e = (fcc == 0);
switch(condition)
{
case FAlways:
return 1;
case FNever:
return 0;
case FUnordered:
return u;
case FGreater:
return g;
case FUnorderedOrGreater:
return u || g;
case FLess:
return l;
case FUnorderedOrLess:
return u || l;
case FLessOrGreater:
return l || g;
case FNotEqual:
return l || g || u;
case FEqual:
return e;
case FUnorderedOrEqual:
return u || e;
case FGreaterOrEqual:
return g || e;
case FUnorderedOrGreaterOrEqual:
return u || g || e;
case FLessOrEqual:
return l || e;
case FUnorderedOrLessOrEqual:
return u || l || e;
case FOrdered:
return e || l || g;
}
panic("Tried testing condition nonexistant "
"condition code %d", condition);
}
bool passesCondition(uint32_t codes, uint32_t condition)
{
CondCodes condCodes;

View file

@ -62,8 +62,8 @@ decode OP default Unknown::unknown()
NNPC = NNPC;//Don't do anything
}});
0x1: bpn(19, {{
NPC = xc->readNextPC() + 4;
NNPC = NPC + 4;
NNPC = NPC + 8;
NPC = NPC + 4;
}}, ',a');
}
default: decode BPCC
@ -76,15 +76,9 @@ decode OP default Unknown::unknown()
}});
0x2: bpccx(19, {{
if(passesCondition(Ccr<7:4>, COND2))
{
//warn("Took branch!\n");
NNPC = xc->readPC() + disp;
}
else
{
//warn("Didn't take branch!\n");
handle_annul
}
}});
}
}
@ -109,8 +103,8 @@ decode OP default Unknown::unknown()
NNPC = NNPC;//Don't do anything
}});
0x1: bn(22, {{
NPC = xc->readNextPC() + 4;
NNPC = NPC + 4;
NNPC = NPC + 8;
NPC = NPC + 4;
}}, ',a');
}
default: bicc(22, {{
@ -165,8 +159,92 @@ decode OP default Unknown::unknown()
}
//SETHI (or NOP if rd == 0 and imm == 0)
0x4: SetHi::sethi({{Rd.udw = imm;}});
0x5: FailUnimpl::fbpfcc();
0x6: FailUnimpl::fbfcc();
//fbpfcc
0x5: decode COND2 {
format BranchN {
//Branch Always
0x8: decode A
{
0x0: fbpa(22, {{
NNPC = xc->readPC() + disp;
}});
0x1: fbpa(22, {{
NPC = xc->readPC() + disp;
NNPC = NPC + 4;
}}, ',a');
}
//Branch Never
0x0: decode A
{
0x0: fbpn(22, {{
NNPC = NNPC;//Don't do anything
}});
0x1: fbpn(22, {{
NNPC = NPC + 8;
NPC = NPC + 4;
}}, ',a');
}
default: decode BPCC {
0x0: fbpcc0(22, {{
if(passesFpCondition(Fsr<11:10>, COND2))
NNPC = xc->readPC() + disp;
else
handle_annul
}});
0x1: fbpcc1(22, {{
if(passesFpCondition(Fsr<33:32>, COND2))
NNPC = xc->readPC() + disp;
else
handle_annul
}});
0x2: fbpcc2(22, {{
if(passesFpCondition(Fsr<35:34>, COND2))
NNPC = xc->readPC() + disp;
else
handle_annul
}});
0x3: fbpcc3(22, {{
if(passesFpCondition(Fsr<37:36>, COND2))
NNPC = xc->readPC() + disp;
else
handle_annul
}});
}
}
}
//fbfcc
0x6: decode COND2 {
format BranchN {
//Branch Always
0x8: decode A
{
0x0: fba(22, {{
NNPC = xc->readPC() + disp;
}});
0x1: fba(22, {{
NPC = xc->readPC() + disp;
NNPC = NPC + 4;
}}, ',a');
}
//Branch Never
0x0: decode A
{
0x0: fbn(22, {{
NNPC = NNPC;//Don't do anything
}});
0x1: fbn(22, {{
NNPC = NPC + 8;
NPC = NPC + 4;
}}, ',a');
}
default: fbfcc(22, {{
if(passesFpCondition(Fsr<11:10>, COND2))
NNPC = xc->readPC() + disp;
else
handle_annul
}});
}
}
}
0x1: BranchN::call(30, {{
if (Pstate<3:>)

View file

@ -211,13 +211,13 @@ let {{
{
if(A)
{
NPC = xc->readNextNPC();
NNPC = NPC + 4;
NNPC = NPC + 8;
NPC = NPC + 4;
}
else
{
NPC = xc->readNextPC();
NNPC = xc->readNextNPC();
NPC = NPC;
NNPC = NNPC;
}
}'''
}};