summaryrefslogtreecommitdiff
path: root/src/arch/mips/isa
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2009-07-20 20:14:15 -0700
committerGabe Black <gblack@eecs.umich.edu>2009-07-20 20:14:15 -0700
commit5161bc19d9ce5199ec48a6f57c4d058a6db6cb15 (patch)
tree06bd63f9edf9b5f28dbac29dfa60f0d9056a2004 /src/arch/mips/isa
parent225de2eaff57bdf27d367531f25a654e4cd06fe6 (diff)
downloadgem5-5161bc19d9ce5199ec48a6f57c4d058a6db6cb15.tar.xz
MIPS: Use BitUnions instead of bits() functions and constants.
Also fix style issues in regions around these changes.
Diffstat (limited to 'src/arch/mips/isa')
-rw-r--r--src/arch/mips/isa/decoder.isa528
-rw-r--r--src/arch/mips/isa/formats/mt.isa27
-rw-r--r--src/arch/mips/isa/operands.isa39
3 files changed, 305 insertions, 289 deletions
diff --git a/src/arch/mips/isa/decoder.isa b/src/arch/mips/isa/decoder.isa
index a463093ec..7a6d5db05 100644
--- a/src/arch/mips/isa/decoder.isa
+++ b/src/arch/mips/isa/decoder.isa
@@ -120,8 +120,22 @@ decode OPCODE_HI default Unknown::unknown() {
//used to distinguish JR from JR.HB and JALR from JALR.HB"
format Jump {
0x0: decode HINT {
- 0x1: jr_hb({{ if(Config1_CA == 0){NNPC = Rs;}else{panic("MIPS16e not supported\n");}; }}, IsReturn, ClearHazards);
- default: jr({{ if(Config1_CA == 0){NNPC = Rs;}else{panic("MIPS16e not supported\n");};}}, IsReturn);
+ 0x1: jr_hb({{
+ Config1Reg config1 = Config1;
+ if (config1.ca == 0) {
+ NNPC = Rs;
+ } else {
+ panic("MIPS16e not supported\n");
+ }
+ }}, IsReturn, ClearHazards);
+ default: jr({{
+ Config1Reg config1 = Config1;
+ if (config1.ca == 0) {
+ NNPC = Rs;
+ } else {
+ panic("MIPS16e not supported\n");
+ }
+ }}, IsReturn);
}
0x1: decode HINT {
@@ -351,25 +365,32 @@ decode OPCODE_HI default Unknown::unknown() {
0x0: decode RS_MSB {
0x0: decode RS {
format CP0Control {
- 0x0: mfc0({{ Rt = CP0_RD_SEL;
- /* Hack for PageMask */
- if(RD == 5) // PageMask
- if(Config3_SP == 0 || PageGrain_ESP == 0)
- Rt &= 0xFFFFE7FF;
- }});
- 0x4: mtc0({{ CP0_RD_SEL = Rt;
-
- if(RD == 11) // Compare{
- if(Cause_TI == 1){
- Cause_TI = 0;
- MiscReg cause = xc->readMiscRegNoEffect(MipsISA::Cause);
- int Offset = 10; // corresponding to Cause_IP0
- Offset += ((IntCtl_IPTI) - 2);
- replaceBits(cause,Offset,Offset,0);
- xc->setMiscRegNoEffect(MipsISA::Cause,cause);
- }
-
- }});
+ 0x0: mfc0({{
+ Config3Reg config3 = Config3;
+ PageGrainReg pageGrain = PageGrain;
+ Rt = CP0_RD_SEL;
+ /* Hack for PageMask */
+ if (RD == 5) {
+ // PageMask
+ if(config3.sp == 0 || pageGrain.esp == 0)
+ Rt &= 0xFFFFE7FF;
+ }
+ }});
+ 0x4: mtc0({{
+ CP0_RD_SEL = Rt;
+ CauseReg cause = Cause;
+ IntCtlReg intCtl = IntCtl;
+ if (RD == 11) {
+ // Compare
+ if (cause.ti == 1) {
+ cause.ti = 0;
+ int offset = 10; // corresponding to cause.ip0
+ offset += intCtl.ipti - 2;
+ replaceBits(cause, offset, offset, 0);
+ }
+ }
+ Cause = cause;
+ }});
}
format CP0Unimpl {
0x1: dmfc0();
@@ -378,9 +399,10 @@ decode OPCODE_HI default Unknown::unknown() {
}
format MT_MFTR { // Decode MIPS MT MFTR instruction into sub-instructions
0x8: decode MT_U {
- 0x0: mftc0({{ data = xc->readRegOtherThread((RT << 3 | SEL) +
- Ctrl_Base_DepTag);
- }});
+ 0x0: mftc0({{
+ data = xc->readRegOtherThread((RT << 3 | SEL) +
+ Ctrl_Base_DepTag);
+ }});
0x1: decode SEL {
0x0: mftgpr({{ data = xc->readRegOtherThread(RT); }});
0x1: decode RT {
@@ -537,16 +559,22 @@ decode OPCODE_HI default Unknown::unknown() {
0x0: decode POS {
0x0: decode SEL {
0x1: decode SC {
- 0x0: dvpe({{ Rt = MVPControl;
- if (VPEConf0<VPEC0_MVP:> == 1) {
- MVPControl = insertBits(MVPControl, MVPC_EVP, 0);
- }
- }});
- 0x1: evpe({{ Rt = MVPControl;
- if (VPEConf0<VPEC0_MVP:> == 1) {
- MVPControl = insertBits(MVPControl, MVPC_EVP, 1);
- }
- }});
+ 0x0: dvpe({{
+ MVPControlReg mvpControl = MVPControl;
+ VPEConf0Reg vpeConf0 = VPEConf0;
+ Rt = MVPControl;
+ if (vpeConf0.mvp == 1)
+ mvpControl.evp = 0;
+ MVPControl = mvpControl;
+ }});
+ 0x1: evpe({{
+ MVPControlReg mvpControl = MVPControl;
+ VPEConf0Reg vpeConf0 = VPEConf0;
+ Rt = MVPControl;
+ if (vpeConf0.mvp == 1)
+ mvpControl.evp = 1;
+ MVPControl = mvpControl;
+ }});
default:CP0Unimpl::unknown();
}
default:CP0Unimpl::unknown();
@@ -557,12 +585,18 @@ decode OPCODE_HI default Unknown::unknown() {
0x1: decode POS {
0xF: decode SEL {
0x1: decode SC {
- 0x0: dmt({{ Rt = VPEControl;
- VPEControl = insertBits(VPEControl, VPEC_TE, 0);
- }});
- 0x1: emt({{ Rt = VPEControl;
- VPEControl = insertBits(VPEControl, VPEC_TE, 1);
- }});
+ 0x0: dmt({{
+ VPEControlReg vpeControl = VPEControl;
+ Rt = vpeControl;
+ vpeControl.te = 0;
+ VPEControl = vpeControl;
+ }});
+ 0x1: emt({{
+ VPEControlReg vpeControl = VPEControl;
+ Rt = vpeControl;
+ vpeControl.te = 1;
+ VPEControl = vpeControl;
+ }});
default:CP0Unimpl::unknown();
}
default:CP0Unimpl::unknown();
@@ -573,27 +607,29 @@ decode OPCODE_HI default Unknown::unknown() {
0xC: decode POS {
0x0: decode SC {
0x0: CP0Control::di({{
- if(Config_AR >= 1) // Rev 2.0 or beyond?
- {
- Rt = Status;
- Status_IE = 0;
- }
- else // Enable this else branch once we actually set values for Config on init
- {
+ StatusReg status = Status;
+ ConfigReg config = Config;
+ // Rev 2.0 or beyond?
+ if (config.ar >= 1) {
+ Rt = status;
+ status.ie = 0;
+ } else {
+ // Enable this else branch once we
+ // actually set values for Config on init
fault = new ReservedInstructionFault();
- }
- }});
+ }
+ Status = status;
+ }});
0x1: CP0Control::ei({{
- if(Config_AR >= 1)
- {
- Rt = Status;
- Status_IE = 1;
- }
- else
- {
+ StatusReg status = Status;
+ ConfigReg config = Config;
+ if (config.ar >= 1) {
+ Rt = status;
+ status.ie = 1;
+ } else {
fault = new ReservedInstructionFault();
- }
- }});
+ }
+ }});
default:CP0Unimpl::unknown();
}
}
@@ -601,29 +637,23 @@ decode OPCODE_HI default Unknown::unknown() {
}
format CP0Control {
0xA: rdpgpr({{
- if(Config_AR >= 1)
- { // Rev 2 of the architecture
- panic("Shadow Sets Not Fully Implemented.\n");
- //Rd = xc->tcBase()->readIntReg(RT + NumIntRegs * SRSCtl_PSS);
- }
- else
- {
+ ConfigReg config = Config;
+ if (config.ar >= 1) {
+ // Rev 2 of the architecture
+ panic("Shadow Sets Not Fully Implemented.\n");
+ } else {
fault = new ReservedInstructionFault();
}
- }});
+ }});
0xE: wrpgpr({{
- if(Config_AR >= 1)
- { // Rev 2 of the architecture
- panic("Shadow Sets Not Fully Implemented.\n");
- //xc->tcBase()->setIntReg(RD + NumIntRegs * SRSCtl_PSS,Rt);
- // warn("Writing %d to %d, PSS: %d, SRS: %x\n",Rt,RD + NumIntRegs * SRSCtl_PSS, SRSCtl_PSS,SRSCtl);
+ ConfigReg config = Config;
+ if (config.ar >= 1) {
+ // Rev 2 of the architecture
+ panic("Shadow Sets Not Fully Implemented.\n");
+ } else {
+ fault = new ReservedInstructionFault();
}
- else
- {
- fault = new ReservedInstructionFault();
- }
-
- }});
+ }});
}
}
@@ -632,44 +662,43 @@ decode OPCODE_HI default Unknown::unknown() {
0x1: decode FUNCTION {
format CP0Control {
0x18: eret({{
- DPRINTF(MipsPRA,"Restoring PC - %x\n",EPC);
- // Ugly hack to get the value of Status_EXL
- if(Status_EXL == 1){
- DPRINTF(MipsPRA,"ERET EXL Hack\n");
- }
- if(Status_ERL == 1){
- Status_ERL = 0;
- NPC = ErrorEPC;
- NNPC = ErrorEPC + sizeof(MachInst); // Need to adjust NNPC, otherwise things break
- }
- else {
- NPC = EPC;
- NNPC = EPC + sizeof(MachInst); // Need to adjust NNPC, otherwise things break
- Status_EXL = 0;
- if(Config_AR >=1 && SRSCtl_HSS > 0 && Status_BEV == 0){
- SRSCtl_CSS = SRSCtl_PSS;
- //xc->setShadowSet(SRSCtl_PSS);
+ StatusReg status = Status;
+ ConfigReg config = Config;
+ SRSCtlReg srsCtl = SRSCtl;
+ DPRINTF(MipsPRA,"Restoring PC - %x\n",EPC);
+ if (status.erl == 1) {
+ status.erl = 0;
+ NPC = ErrorEPC;
+ // Need to adjust NNPC, otherwise things break
+ NNPC = ErrorEPC + sizeof(MachInst);
+ } else {
+ NPC = EPC;
+ // Need to adjust NNPC, otherwise things break
+ NNPC = EPC + sizeof(MachInst);
+ status.exl = 0;
+ if (config.ar >=1 &&
+ srsCtl.hss > 0 &&
+ status.bev == 0) {
+ srsCtl.css = srsCtl.pss;
+ //xc->setShadowSet(srsCtl.pss);
+ }
}
- }
- LLFlag = 0;
- }},IsReturn,IsSerializing,IsERET);
+ LLFlag = 0;
+ Status = status;
+ SRSCtl = srsCtl;
+ }},IsReturn,IsSerializing,IsERET);
0x1F: deret({{
- // if(EJTagImplemented()) {
- if(Debug_DM == 1){
- Debug_DM = 1;
- Debug_IEXI = 0;
- NPC = DEPC;
- }
- else
- {
- // Undefined;
- }
- //} // EJTag Implemented
- //else {
- // Reserved Instruction Exception
- //}
- }},IsReturn,IsSerializing,IsERET);
+ DebugReg debug = Debug;
+ if (debug.dm == 1) {
+ debug.dm = 1;
+ debug.iexi = 0;
+ NPC = DEPC;
+ } else {
+ // Undefined;
+ }
+ Debug = debug;
+ }}, IsReturn, IsSerializing, IsERET);
}
format CP0TLB {
0x01: tlbr({{
@@ -689,140 +718,157 @@ decode OPCODE_HI default Unknown::unknown() {
}}); // Need to hook up to TLB
0x02: tlbwi({{
- //Create PTE
- MipsISA::PTE NewEntry;
- //Write PTE
- NewEntry.Mask = (Addr)(PageMask >> 11);
- NewEntry.VPN = (Addr)(EntryHi >> 11);
- /* PageGrain _ ESP Config3 _ SP */
- if(((PageGrain>>28) & 1) == 0 || ((Config3>>4)&1) ==0) {
- NewEntry.Mask |= 0x3; // If 1KB pages are *NOT* enabled, lowest bits of the mask are 0b11 for TLB writes
- NewEntry.VPN &= 0xFFFFFFFC; // Reset bits 0 and 1 if 1KB pages are not enabled
- }
- NewEntry.asid = (uint8_t)(EntryHi & 0xFF);
-
- NewEntry.PFN0 = (Addr)(EntryLo0 >> 6);
- NewEntry.PFN1 = (Addr)(EntryLo1 >> 6);
- NewEntry.D0 = (bool)((EntryLo0 >> 2) & 1);
- NewEntry.D1 = (bool)((EntryLo1 >> 2) & 1);
- NewEntry.V1 = (bool)((EntryLo1 >> 1) & 1);
- NewEntry.V0 = (bool)((EntryLo0 >> 1) & 1);
- NewEntry.G = (bool)((EntryLo0 & EntryLo1) & 1);
- NewEntry.C0 = (uint8_t)((EntryLo0 >> 3) & 0x7);
- NewEntry.C1 = (uint8_t)((EntryLo1 >> 3) & 0x7);
- /* Now, compute the AddrShiftAmount and OffsetMask - TLB optimizations */
- /* Addr Shift Amount for 1KB or larger pages */
- // warn("PTE->Mask: %x\n",pte->Mask);
- if((NewEntry.Mask & 0xFFFF) == 3){
- NewEntry.AddrShiftAmount = 12;
- } else if((NewEntry.Mask & 0xFFFF) == 0x0000){
- NewEntry.AddrShiftAmount = 10;
- } else if((NewEntry.Mask & 0xFFFC) == 0x000C){
- NewEntry.AddrShiftAmount = 14;
- } else if((NewEntry.Mask & 0xFFF0) == 0x0030){
- NewEntry.AddrShiftAmount = 16;
- } else if((NewEntry.Mask & 0xFFC0) == 0x00C0){
- NewEntry.AddrShiftAmount = 18;
- } else if((NewEntry.Mask & 0xFF00) == 0x0300){
- NewEntry.AddrShiftAmount = 20;
- } else if((NewEntry.Mask & 0xFC00) == 0x0C00){
- NewEntry.AddrShiftAmount = 22;
- } else if((NewEntry.Mask & 0xF000) == 0x3000){
- NewEntry.AddrShiftAmount = 24;
- } else if((NewEntry.Mask & 0xC000) == 0xC000){
- NewEntry.AddrShiftAmount = 26;
- } else if((NewEntry.Mask & 0x30000) == 0x30000){
- NewEntry.AddrShiftAmount = 28;
- } else {
- fatal("Invalid Mask Pattern Detected!\n");
- }
- NewEntry.OffsetMask = ((1<<NewEntry.AddrShiftAmount)-1);
-
- MipsISA::TLB *Ptr=xc->tcBase()->getITBPtr();
- MiscReg c3=xc->readMiscReg(MipsISA::Config3);
- MiscReg pg=xc->readMiscReg(MipsISA::PageGrain);
- int SP=0;
- if(bits(c3,Config3_SP)==1 && bits(pg,PageGrain_ESP)==1){
- SP=1;
- }
- Ptr->insertAt(NewEntry,Index & 0x7FFFFFFF,SP);
+ //Create PTE
+ MipsISA::PTE NewEntry;
+ //Write PTE
+ NewEntry.Mask = (Addr)(PageMask >> 11);
+ NewEntry.VPN = (Addr)(EntryHi >> 11);
+ /* PageGrain _ ESP Config3 _ SP */
+ if(((PageGrain>>28) & 1) == 0 || ((Config3>>4)&1) ==0) {
+ // If 1KB pages are *NOT* enabled, lowest bits of the
+ // mask are 0b11 for TLB writes
+ NewEntry.Mask |= 0x3;
+ // Reset bits 0 and 1 if 1KB pages are not enabled
+ NewEntry.VPN &= 0xFFFFFFFC;
+ }
+ NewEntry.asid = (uint8_t)(EntryHi & 0xFF);
+
+ NewEntry.PFN0 = (Addr)(EntryLo0 >> 6);
+ NewEntry.PFN1 = (Addr)(EntryLo1 >> 6);
+ NewEntry.D0 = (bool)((EntryLo0 >> 2) & 1);
+ NewEntry.D1 = (bool)((EntryLo1 >> 2) & 1);
+ NewEntry.V1 = (bool)((EntryLo1 >> 1) & 1);
+ NewEntry.V0 = (bool)((EntryLo0 >> 1) & 1);
+ NewEntry.G = (bool)((EntryLo0 & EntryLo1) & 1);
+ NewEntry.C0 = (uint8_t)((EntryLo0 >> 3) & 0x7);
+ NewEntry.C1 = (uint8_t)((EntryLo1 >> 3) & 0x7);
+ /* Now, compute the AddrShiftAmount and OffsetMask - TLB
+ optimizations */
+ /* Addr Shift Amount for 1KB or larger pages */
+ if ((NewEntry.Mask & 0xFFFF) == 3) {
+ NewEntry.AddrShiftAmount = 12;
+ } else if ((NewEntry.Mask & 0xFFFF) == 0x0000) {
+ NewEntry.AddrShiftAmount = 10;
+ } else if ((NewEntry.Mask & 0xFFFC) == 0x000C) {
+ NewEntry.AddrShiftAmount = 14;
+ } else if ((NewEntry.Mask & 0xFFF0) == 0x0030) {
+ NewEntry.AddrShiftAmount = 16;
+ } else if ((NewEntry.Mask & 0xFFC0) == 0x00C0) {
+ NewEntry.AddrShiftAmount = 18;
+ } else if ((NewEntry.Mask & 0xFF00) == 0x0300) {
+ NewEntry.AddrShiftAmount = 20;
+ } else if ((NewEntry.Mask & 0xFC00) == 0x0C00) {
+ NewEntry.AddrShiftAmount = 22;
+ } else if ((NewEntry.Mask & 0xF000) == 0x3000) {
+ NewEntry.AddrShiftAmount = 24;
+ } else if ((NewEntry.Mask & 0xC000) == 0xC000) {
+ NewEntry.AddrShiftAmount = 26;
+ } else if ((NewEntry.Mask & 0x30000) == 0x30000) {
+ NewEntry.AddrShiftAmount = 28;
+ } else {
+ fatal("Invalid Mask Pattern Detected!\n");
+ }
+ NewEntry.OffsetMask = ((1<<NewEntry.AddrShiftAmount)-1);
+
+ MipsISA::TLB *Ptr = xc->tcBase()->getITBPtr();
+ Config3Reg config3 = Config3
+ PageGrainReg pageGrain = PageGrain;
+ int SP = 0;
+ if (bits(config3, config3.sp) == 1 &&
+ bits(pageGrain, pageGrain.esp) == 1) {
+ SP = 1;
+ }
+ IndexReg index = Index;
+ Ptr->insertAt(NewEntry, Index & 0x7FFFFFFF, SP);
}});
0x06: tlbwr({{
- //Create PTE
- MipsISA::PTE NewEntry;
- //Write PTE
- NewEntry.Mask = (Addr)(PageMask >> 11);
- NewEntry.VPN = (Addr)(EntryHi >> 11);
- /* PageGrain _ ESP Config3 _ SP */
- if(((PageGrain>>28) & 1) == 0 || ((Config3>>4)&1) ==0) {
- NewEntry.Mask |= 0x3; // If 1KB pages are *NOT* enabled, lowest bits of the mask are 0b11 for TLB writes
- NewEntry.VPN &= 0xFFFFFFFC; // Reset bits 0 and 1 if 1KB pages are not enabled
- }
- NewEntry.asid = (uint8_t)(EntryHi & 0xFF);
-
- NewEntry.PFN0 = (Addr)(EntryLo0 >> 6);
- NewEntry.PFN1 = (Addr)(EntryLo1 >> 6);
- NewEntry.D0 = (bool)((EntryLo0 >> 2) & 1);
- NewEntry.D1 = (bool)((EntryLo1 >> 2) & 1);
- NewEntry.V1 = (bool)((EntryLo1 >> 1) & 1);
- NewEntry.V0 = (bool)((EntryLo0 >> 1) & 1);
- NewEntry.G = (bool)((EntryLo0 & EntryLo1) & 1);
- NewEntry.C0 = (uint8_t)((EntryLo0 >> 3) & 0x7);
- NewEntry.C1 = (uint8_t)((EntryLo1 >> 3) & 0x7);
- /* Now, compute the AddrShiftAmount and OffsetMask - TLB optimizations */
- /* Addr Shift Amount for 1KB or larger pages */
- // warn("PTE->Mask: %x\n",pte->Mask);
- if((NewEntry.Mask & 0xFFFF) == 3){
- NewEntry.AddrShiftAmount = 12;
- } else if((NewEntry.Mask & 0xFFFF) == 0x0000){
- NewEntry.AddrShiftAmount = 10;
- } else if((NewEntry.Mask & 0xFFFC) == 0x000C){
- NewEntry.AddrShiftAmount = 14;
- } else if((NewEntry.Mask & 0xFFF0) == 0x0030){
- NewEntry.AddrShiftAmount = 16;
- } else if((NewEntry.Mask & 0xFFC0) == 0x00C0){
- NewEntry.AddrShiftAmount = 18;
- } else if((NewEntry.Mask & 0xFF00) == 0x0300){
- NewEntry.AddrShiftAmount = 20;
- } else if((NewEntry.Mask & 0xFC00) == 0x0C00){
- NewEntry.AddrShiftAmount = 22;
- } else if((NewEntry.Mask & 0xF000) == 0x3000){
- NewEntry.AddrShiftAmount = 24;
- } else if((NewEntry.Mask & 0xC000) == 0xC000){
- NewEntry.AddrShiftAmount = 26;
- } else if((NewEntry.Mask & 0x30000) == 0x30000){
- NewEntry.AddrShiftAmount = 28;
- } else {
- fatal("Invalid Mask Pattern Detected!\n");
- }
- NewEntry.OffsetMask = ((1<<NewEntry.AddrShiftAmount)-1);
-
- MipsISA::TLB *Ptr=xc->tcBase()->getITBPtr();
- MiscReg c3=xc->readMiscReg(MipsISA::Config3);
- MiscReg pg=xc->readMiscReg(MipsISA::PageGrain);
- int SP=0;
- if(bits(c3,Config3_SP)==1 && bits(pg,PageGrain_ESP)==1){
- SP=1;
- }
- Ptr->insertAt(NewEntry,Random,SP);
+ //Create PTE
+ MipsISA::PTE NewEntry;
+ //Write PTE
+ NewEntry.Mask = (Addr)(PageMask >> 11);
+ NewEntry.VPN = (Addr)(EntryHi >> 11);
+ /* PageGrain _ ESP Config3 _ SP */
+ if (((PageGrain >> 28) & 1) == 0 ||
+ (( Config3 >> 4) & 1) ==0) {
+ // If 1KB pages are *NOT* enabled, lowest bits of
+ // the mask are 0b11 for TLB writes
+ NewEntry.Mask |= 0x3;
+ // Reset bits 0 and 1 if 1KB pages are not enabled
+ NewEntry.VPN &= 0xFFFFFFFC;
+ }
+ NewEntry.asid = (uint8_t)(EntryHi & 0xFF);
+
+ NewEntry.PFN0 = (Addr)(EntryLo0 >> 6);
+ NewEntry.PFN1 = (Addr)(EntryLo1 >> 6);
+ NewEntry.D0 = (bool)((EntryLo0 >> 2) & 1);
+ NewEntry.D1 = (bool)((EntryLo1 >> 2) & 1);
+ NewEntry.V1 = (bool)((EntryLo1 >> 1) & 1);
+ NewEntry.V0 = (bool)((EntryLo0 >> 1) & 1);
+ NewEntry.G = (bool)((EntryLo0 & EntryLo1) & 1);
+ NewEntry.C0 = (uint8_t)((EntryLo0 >> 3) & 0x7);
+ NewEntry.C1 = (uint8_t)((EntryLo1 >> 3) & 0x7);
+ /* Now, compute the AddrShiftAmount and OffsetMask -
+ TLB optimizations */
+ /* Addr Shift Amount for 1KB or larger pages */
+ if ((NewEntry.Mask & 0xFFFF) == 3){
+ NewEntry.AddrShiftAmount = 12;
+ } else if ((NewEntry.Mask & 0xFFFF) == 0x0000) {
+ NewEntry.AddrShiftAmount = 10;
+ } else if ((NewEntry.Mask & 0xFFFC) == 0x000C) {
+ NewEntry.AddrShiftAmount = 14;
+ } else if ((NewEntry.Mask & 0xFFF0) == 0x0030) {
+ NewEntry.AddrShiftAmount = 16;
+ } else if ((NewEntry.Mask & 0xFFC0) == 0x00C0) {
+ NewEntry.AddrShiftAmount = 18;
+ } else if ((NewEntry.Mask & 0xFF00) == 0x0300) {
+ NewEntry.AddrShiftAmount = 20;
+ } else if ((NewEntry.Mask & 0xFC00) == 0x0C00) {
+ NewEntry.AddrShiftAmount = 22;
+ } else if ((NewEntry.Mask & 0xF000) == 0x3000) {
+ NewEntry.AddrShiftAmount = 24;
+ } else if ((NewEntry.Mask & 0xC000) == 0xC000) {
+ NewEntry.AddrShiftAmount = 26;
+ } else if ((NewEntry.Mask & 0x30000) == 0x30000) {
+ NewEntry.AddrShiftAmount = 28;
+ } else {
+ fatal("Invalid Mask Pattern Detected!\n");
+ }
+ NewEntry.OffsetMask = ((1 << NewEntry.AddrShiftAmount) - 1);
+
+ MipsISA::TLB *Ptr = xc->tcBase()->getITBPtr();
+ Config3Reg config3 = Config3
+ PageGrainReg pageGrain = PageGrain;
+ int SP = 0;
+ if (bits(config3, config3.sp) == 1 &&
+ bits(pageGrain, pageGrain.esp) == 1) {
+ SP = 1;
+ }
+ IndexReg index = Index;
+ Ptr->insertAt(NewEntry, Random, SP);
}});
0x08: tlbp({{
- int TLB_Index;
- Addr VPN;
- if(PageGrain_ESP == 1 && Config3_SP ==1){
- VPN = EntryHi >> 11;
- } else {
- VPN = ((EntryHi >> 11) & 0xFFFFFFFC); // Mask off lower 2 bits
- }
- TLB_Index = xc->tcBase()->getITBPtr()->probeEntry(VPN,EntryHi_ASID);
- if(TLB_Index != -1){ // Check TLB for entry matching EntryHi
- Index=TLB_Index;
- // warn("\ntlbp: Match Found!\n");
- } else {// else, set Index = 1<<31
- Index = (1<<31);
- }
- }});
+ Config3Reg config3 = Config3;
+ PageGrainReg pageGrain = PageGrain;
+ EntryHiReg entryHi = EntryHi;
+ int TLB_Index;
+ Addr VPN;
+ if (pageGrain.esp == 1 && config3.sp ==1) {
+ VPN = EntryHi >> 11;
+ } else {
+ // Mask off lower 2 bits
+ VPN = ((EntryHi >> 11) & 0xFFFFFFFC);
+ }
+ TLB_Index = xc->tcBase()->getITBPtr()->
+ probeEntry(VPN, entryHi.asid);
+ // Check TLB for entry matching EntryHi
+ if (TLB_Index != -1) {
+ Index = TLB_Index;
+ } else {
+ // else, set Index = 1 << 31
+ Index = (1 << 31);
+ }
+ }});
}
format CP0Unimpl {
0x20: wait();
diff --git a/src/arch/mips/isa/formats/mt.isa b/src/arch/mips/isa/formats/mt.isa
index 1928ee903..4f2d33709 100644
--- a/src/arch/mips/isa/formats/mt.isa
+++ b/src/arch/mips/isa/formats/mt.isa
@@ -85,7 +85,10 @@ output decoder {{
}};
output exec {{
- void getThrRegExValues(%(CPU_exec_context)s *xc, unsigned &vpe_conf0, unsigned &tc_bind_mt, unsigned &tc_bind, unsigned &vpe_control, unsigned &mvp_conf0)
+ void getThrRegExValues(%(CPU_exec_context)s *xc,
+ VPEConf0Reg &vpe_conf0, TCBindReg &tc_bind_mt,
+ TCBindReg &tc_bind, VPEControlReg &vpe_control,
+ MVPConf0Reg &mvp_conf0)
{
vpe_conf0 = xc->readMiscReg(VPEConf0);
tc_bind_mt = xc->readRegOtherThread(TCBind + Ctrl_Base_DepTag);
@@ -94,7 +97,7 @@ output exec {{
mvp_conf0 = xc->readMiscReg(MVPConf0);
}
- void getMTExValues(%(CPU_exec_context)s *xc, unsigned &config3)
+ void getMTExValues(%(CPU_exec_context)s *xc, Config3Reg &config3)
{
config3 = xc->readMiscReg(Config3);
}
@@ -108,17 +111,19 @@ def template ThreadRegisterExecute {{
%(op_decl)s;
%(op_rd)s;
- unsigned vpe_conf0, tc_bind_mt, tc_bind, vpe_control, mvp_conf0;
+ VPEConf0Reg vpeConf0;
+ TCBindReg tcBindMT;
+ TCBindReg tcBind;
+ VPEControlReg vpeControl;
+ MVPConf0Reg mvpConf0;
- getThrRegExValues(xc, vpe_conf0, tc_bind_mt, tc_bind, vpe_control, mvp_conf0);
+ getThrRegExValues(xc, vpeConf0, tcBindMT,
+ tcBind, vpeControl, mvpConf0);
if (isCoprocessorEnabled(xc, 0)) {
- if (bits(vpe_conf0, VPEC0_MVP) == 0 &&
- bits(tc_bind_mt, TCB_CUR_VPE_HI, TCB_CUR_VPE_LO) !=
- bits(tc_bind, TCB_CUR_VPE_HI, TCB_CUR_VPE_LO)) {
+ if (vpeConf0.mvp == 0 && tcBindMT.curVPE != tcBind.curVPE) {
data = -1;
- } else if (bits(vpe_control, VPEC_TARG_TC_HI, VPEC_TARG_TC_LO) >
- bits(mvp_conf0, MVPC0_PTC_HI, MVPC0_PTC_LO)) {
+ } else if (vpeControl.targTC > mvpConf0.ptc) {
data = -1;
} else {
int top_bit = 0;
@@ -154,12 +159,12 @@ def template MTExecute{{
%(op_decl)s;
%(op_rd)s;
- unsigned config3;
+ Config3Reg config3;
getMTExValues(xc, config3);
if (isCoprocessorEnabled(xc, 0)) {
- if (bits(config3, CFG3_MT) == 1) {
+ if (config3.mt == 1) {
%(code)s;
} else {
fault = new ReservedInstructionFault();
diff --git a/src/arch/mips/isa/operands.isa b/src/arch/mips/isa/operands.isa
index c2733be9d..1af8857cc 100644
--- a/src/arch/mips/isa/operands.isa
+++ b/src/arch/mips/isa/operands.isa
@@ -140,43 +140,8 @@ def operands {{
'Config1': ('ControlReg','uw', 'MipsISA::Config1',None,1),
'Config2': ('ControlReg','uw', 'MipsISA::Config2',None,1),
'PageGrain': ('ControlReg','uw', 'MipsISA::PageGrain',None,1),
-
-
- # named bitfields of Control Regs
- 'Status_IE': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'Status_ERL': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'Status_EXL': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'Status_BEV': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'Status_CU3': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'Status_CU2': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'Status_CU1': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'Status_CU0': ('ControlBitfield', 'uw', 'MipsISA::Status', None, 1),
- 'SRSCtl_HSS': ('ControlBitfield', 'uw', 'MipsISA::SRSCtl', None, 4),
- 'SRSCtl_PSS': ('ControlBitfield', 'uw', 'MipsISA::SRSCtl', None, 4),
- 'SRSCtl_CSS': ('ControlBitfield', 'uw', 'MipsISA::SRSCtl', None, 4),
- 'Config_AR': ('ControlBitfield', 'uw', 'MipsISA::Config', None, 3),
- 'Config_MT': ('ControlBitfield', 'uw', 'MipsISA::Config', None, 1),
- 'Config1_CA': ('ControlBitfield', 'uw', 'MipsISA::Config1', None, 1),
- 'Config3_SP': ('ControlBitfield', 'uw', 'MipsISA::Config3', None, 1),
- 'PageGrain_ESP': ('ControlBitfield', 'uw', 'MipsISA::PageGrain', None, 1),
- 'Cause_EXCCODE': ('ControlBitfield', 'uw', 'MipsISA::Cause', None, 4),
- 'Cause_TI': ('ControlBitfield', 'uw', 'MipsISA::Cause', None, 4),
- 'IntCtl_IPTI': ('ControlBitfield', 'uw', 'MipsISA::IntCtl', None, 4),
- 'EntryHi_ASID': ('ControlBitfield', 'uw', 'MipsISA::EntryHi', None, 1),
- 'EntryLo0_PFN': ('ControlBitfield', 'uw', 'MipsISA::EntryLo0', None, 1),
- 'EntryLo0_C': ('ControlBitfield', 'uw', 'MipsISA::EntryLo0', None, 3),
- 'EntryLo0_D': ('ControlBitfield', 'uw', 'MipsISA::EntryLo0', None, 1),
- 'EntryLo0_V': ('ControlBitfield', 'uw', 'MipsISA::EntryLo0', None, 1),
- 'EntryLo0_G': ('ControlBitfield', 'uw', 'MipsISA::EntryLo0', None, 1),
- 'EntryLo1_PFN': ('ControlBitfield', 'uw', 'MipsISA::EntryLo1', None, 1),
- 'EntryLo1_C': ('ControlBitfield', 'uw', 'MipsISA::EntryLo1', None, 3),
- 'EntryLo1_D': ('ControlBitfield', 'uw', 'MipsISA::EntryLo1', None, 1),
- 'EntryLo1_V': ('ControlBitfield', 'uw', 'MipsISA::EntryLo1', None, 1),
- 'EntryLo1_G': ('ControlBitfield', 'uw', 'MipsISA::EntryLo1', None, 1),
-
- # named bitfields of Debug Regs
- 'Debug_DM': ('ControlBitfield', 'uw', 'MipsISA::Debug', None, 1),
- 'Debug_IEXI': ('ControlBitfield', 'uw', 'MipsISA::Debug', None, 1),
+ 'Debug': ('ControlReg','uw', 'MipsISA::Debug',None,1),
+ 'Cause': ('ControlReg','uw', 'MipsISA::Cause',None,1),
#Memory Operand
'Mem': ('Mem', 'uw', None, ('IsMemRef', 'IsLoad', 'IsStore'), 4),