Support for All Jump Instructions ...

Redo format for Branches and Jumps ( Must update NNPC not NPC )

Now all branches and jumps look like they auto-generate correctly from isa_parser.py!!!

arch/mips/isa/decoder.isa:
    Support for All Jump Instructions ..
arch/mips/isa/formats/branch.isa:
    Redo format for Branches and Jumps ( Must update NNPC not NPC )
arch/mips/isa/formats/util.isa:
    define clear_exe_inst_hazards for later use

--HG--
extra : convert_revision : 63618ed12ee6ed94c47d29619cc1cab2cbaf5cda
This commit is contained in:
Korey Sewell 2006-02-20 01:49:16 -05:00
parent 7c642b7106
commit 38ce95db3b
3 changed files with 46 additions and 24 deletions

View file

@ -58,15 +58,17 @@ decode OPCODE_HI default Unknown::unknown() {
//Table A-3 Note: "Specific encodings of the hint field are used
//to distinguish JR from JR.HB and JALR from JALR.HB"
format Unconditional {
format Jump {
0x0: decode HINT {
0:jr({{ }},IsReturn,IsLink);
1:jr_hb({{ }},IsReturn,IsLink);
0:jr({{ NNPC = Rs; }},IsReturn);
1:jr_hb({{ NNPC = Rs; clear_exe_inst_hazards(); }},IsReturn);
}
0x1: decode HINT {
0: jalr({{ }},'IsCall','IsReturn','IsLink');
1: jalr_hb({{ }},IsCall,IsReturn,IsLink);
0: jalr({{ NNPC = Rs; }},IsCall,IsReturn);
1: jalr_hb({{ NNPC = Rs; clear_exe_inst_hazards();}},IsCall,IsReturn);
}
}
@ -75,7 +77,6 @@ decode OPCODE_HI default Unknown::unknown() {
0x3: movn({{ if (Rt != 0) Rd = Rs; }});
}
format WarnUnimpl {
0x4: syscall();//{{ xc->syscall()}},IsNonSpeculative
0x5: break();
@ -196,9 +197,10 @@ decode OPCODE_HI default Unknown::unknown() {
}
}
format Unconditional {
0x2: j({{ }});
0x3: jal({{ }},IsCall,IsLink);
format Jump {
0x2: j({{ NNPC = (NPC & 0xF0000000) & (0x00000000 & JMPTARG << 2);}});
0x3: jal({{ NNPC = (NPC & 0xF0000000) & (0x00000000 & JMPTARG << 2);}},IsCall,IsLink);
}
format Branch {

View file

@ -250,20 +250,22 @@ output decoder {{
}};
def format Branch(code,*flags) {{
code = 'bool cond;\n\t' + code + '\n'
#Add Link Code if Link instruction
strlen = len(name)
if name[strlen-2:] == 'al':
code += 'R31 = NPC + 4;\n'
code += 'R31 = NNPC;\n'
# condition code
code += 'if (cond) {'
code += ' NPC = NPC + disp;\n'
code += ' NNPC = NNPC + disp;\n } \n'
#Condition code
code = 'bool cond;\n' + code
code += 'if (cond) {\n'
#code += '//NPC=NPC: just placeholder to force parser to writeback NPC\n'
#code += ' NPC = NPC; \n'
code += ' NNPC = NPC + disp;\n'
code += '} \n'
iop = InstObjParams(name, Name, 'Branch', CodeBlock(code),
('IsDirectControl', 'IsCondControl'))
header_output = BasicDeclare.subst(iop)
decoder_output = BasicConstructor.subst(iop)
decode_block = BasicDecode.subst(iop)
@ -272,30 +274,38 @@ def format Branch(code,*flags) {{
def format BranchLikely(code,*flags) {{
code = 'bool cond;\n\t\t\t' + code
#Add Link Code if Link instruction
strlen = len(name)
if name[strlen-3:] == 'all':
code += 'R31 = NPC + 4;\n'
code += 'R31 = NNPC;\n'
#condition code
#Condition code
code = 'bool cond;\n' + code
code += 'if (cond) {'
code += ' NPC = NPC + disp;\n'
code += ' NNPC = NNPC + disp;\n } \n'
#code += '//NPC=NPC: just placeholder to force parser to writeback NPC\n'
#code += 'NPC = NPC; \n'
code += 'NNPC = NPC + disp;\n'
code += '} \n'
iop = InstObjParams(name, Name, 'Branch', CodeBlock(code),
('IsDirectControl', 'IsCondControl','IsCondDelaySlot'))
header_output = BasicDeclare.subst(iop)
decoder_output = BasicConstructor.subst(iop)
decode_block = BasicDecode.subst(iop)
exec_output = BasicExecute.subst(iop)
}};
def format Unconditional(code,*flags) {{
iop = InstObjParams(name, Name, 'Jump', CodeBlock(code),
def format Jump(code,*flags) {{
#Add Link Code if Link instruction
strlen = len(name)
if strlen >= 3 and name[2:3] == 'al':
code = 'R31 = NNPC;\n' + code
iop = InstObjParams(name, Name, 'Jump', CodeBlock(code),\
('IsIndirectControl', 'IsUncondControl'))
header_output = BasicDeclare.subst(iop)
decoder_output = BasicConstructor.subst(iop)
decode_block = BasicDecode.subst(iop)

View file

@ -24,3 +24,13 @@ def UncondCtrlBase(name, Name, base_class, npc_expr, flags):
return (header_output, decoder_output,
JumpOrBranchDecode.subst(nolink_iop), exec_output)
}};
output exec {{
/// CLEAR ALL CPU INST/EXE HAZARDS
inline void
clear_exe_inst_hazards()
{
//CODE HERE
}
}