branch.isa revision 6724
16019Shines@cs.fsu.edu// -*- mode:c++ -*-
26019Shines@cs.fsu.edu
36019Shines@cs.fsu.edu// Copyright (c) 2007-2008 The Florida State University
46019Shines@cs.fsu.edu// All rights reserved.
56019Shines@cs.fsu.edu//
66019Shines@cs.fsu.edu// Redistribution and use in source and binary forms, with or without
76019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are
86019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright
96019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer;
106019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright
116019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the
126019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution;
136019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its
146019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from
156019Shines@cs.fsu.edu// this software without specific prior written permission.
166019Shines@cs.fsu.edu//
176019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286019Shines@cs.fsu.edu//
296019Shines@cs.fsu.edu// Authors: Stephen Hines
306019Shines@cs.fsu.edu
316019Shines@cs.fsu.edu////////////////////////////////////////////////////////////////////
326019Shines@cs.fsu.edu//
336019Shines@cs.fsu.edu// Control transfer instructions
346019Shines@cs.fsu.edu//
356019Shines@cs.fsu.edu
366019Shines@cs.fsu.edudef format Branch(code,*opt_flags) {{
376019Shines@cs.fsu.edu
386019Shines@cs.fsu.edu    #Build Instruction Flags
396019Shines@cs.fsu.edu    #Use Link & Likely Flags to Add Link/Condition Code
406019Shines@cs.fsu.edu    inst_flags = ('IsDirectControl', )
416259Sjack-m5ml2@cs.york.ac.uk    linking = False
426019Shines@cs.fsu.edu    for x in opt_flags:
436019Shines@cs.fsu.edu        if x == 'Link':
446259Sjack-m5ml2@cs.york.ac.uk            linking = True
456019Shines@cs.fsu.edu            code += 'LR = NPC;\n'
466019Shines@cs.fsu.edu        else:
476019Shines@cs.fsu.edu            inst_flags += (x, )
486019Shines@cs.fsu.edu
496019Shines@cs.fsu.edu    #Take into account uncond. branch instruction
506019Shines@cs.fsu.edu    if 'cond == 1' in code:
516019Shines@cs.fsu.edu         inst_flags += ('IsUnCondControl', )
526019Shines@cs.fsu.edu    else:
536019Shines@cs.fsu.edu         inst_flags += ('IsCondControl', )
546019Shines@cs.fsu.edu
556724Sgblack@eecs.umich.edu    icode =  'if (testPredicate(CondCodes, condCode)) {\n'
566019Shines@cs.fsu.edu    icode += code
576019Shines@cs.fsu.edu    icode += '  NPC = NPC + 4 + disp;\n'
586019Shines@cs.fsu.edu    icode += '} else {\n'
596019Shines@cs.fsu.edu    icode += '  NPC = NPC;\n'
606259Sjack-m5ml2@cs.york.ac.uk    if linking:
616259Sjack-m5ml2@cs.york.ac.uk        icode += '  LR = LR;\n'
626019Shines@cs.fsu.edu    icode += '};\n'
636019Shines@cs.fsu.edu
646019Shines@cs.fsu.edu    code = icode
656019Shines@cs.fsu.edu
666019Shines@cs.fsu.edu    iop = InstObjParams(name, Name, 'Branch', code, inst_flags)
676019Shines@cs.fsu.edu    header_output = BasicDeclare.subst(iop)
686019Shines@cs.fsu.edu    decoder_output = BasicConstructor.subst(iop)
696019Shines@cs.fsu.edu    decode_block = BasicDecode.subst(iop)
706019Shines@cs.fsu.edu    exec_output = BasicExecute.subst(iop)
716019Shines@cs.fsu.edu}};
726019Shines@cs.fsu.edu
736019Shines@cs.fsu.edudef format BranchExchange(code,*opt_flags) {{
746019Shines@cs.fsu.edu    #Build Instruction Flags
756019Shines@cs.fsu.edu    #Use Link & Likely Flags to Add Link/Condition Code
766019Shines@cs.fsu.edu    inst_flags = ('IsIndirectControl', )
776259Sjack-m5ml2@cs.york.ac.uk    linking = False
786019Shines@cs.fsu.edu    for x in opt_flags:
796019Shines@cs.fsu.edu        if x == 'Link':
806259Sjack-m5ml2@cs.york.ac.uk            linking = True
816019Shines@cs.fsu.edu            code += 'LR = NPC;\n'
826019Shines@cs.fsu.edu        else:
836019Shines@cs.fsu.edu            inst_flags += (x, )
846019Shines@cs.fsu.edu
856019Shines@cs.fsu.edu    #Take into account uncond. branch instruction
866019Shines@cs.fsu.edu    if 'cond == 1' in code:
876019Shines@cs.fsu.edu         inst_flags += ('IsUnCondControl', )
886019Shines@cs.fsu.edu    else:
896019Shines@cs.fsu.edu         inst_flags += ('IsCondControl', )
906019Shines@cs.fsu.edu
916019Shines@cs.fsu.edu    #Condition code
926019Shines@cs.fsu.edu
936724Sgblack@eecs.umich.edu    icode =  'if (testPredicate(CondCodes, condCode)) {\n'
946019Shines@cs.fsu.edu    icode += code
956019Shines@cs.fsu.edu    icode += '  NPC = Rm & 0xfffffffe; // Masks off bottom bit\n'
966019Shines@cs.fsu.edu    icode += '} else {\n'
976019Shines@cs.fsu.edu    icode += '  NPC = NPC;\n'
986259Sjack-m5ml2@cs.york.ac.uk    if linking:
996259Sjack-m5ml2@cs.york.ac.uk        icode += '  LR = LR;\n'
1006019Shines@cs.fsu.edu    icode += '};\n'
1016019Shines@cs.fsu.edu
1026019Shines@cs.fsu.edu    code = icode
1036019Shines@cs.fsu.edu
1046019Shines@cs.fsu.edu    iop = InstObjParams(name, Name, 'BranchExchange', code, inst_flags)
1056019Shines@cs.fsu.edu    header_output = BasicDeclare.subst(iop)
1066019Shines@cs.fsu.edu    decoder_output = BasicConstructor.subst(iop)
1076019Shines@cs.fsu.edu    decode_block = BasicDecode.subst(iop)
1086019Shines@cs.fsu.edu    exec_output = BasicExecute.subst(iop)
1096019Shines@cs.fsu.edu}};
1106019Shines@cs.fsu.edu
1116019Shines@cs.fsu.edudef format Jump(code, *opt_flags) {{
1126019Shines@cs.fsu.edu    #Build Instruction Flags
1136019Shines@cs.fsu.edu    #Use Link Flag to Add Link Code
1146019Shines@cs.fsu.edu    inst_flags = ('IsIndirectControl', 'IsUncondControl')
1156019Shines@cs.fsu.edu    for x in opt_flags:
1166019Shines@cs.fsu.edu        if x == 'Link':
1176019Shines@cs.fsu.edu            code = 'LR = NPC;\n' + code
1186019Shines@cs.fsu.edu        elif x == 'ClearHazards':
1196019Shines@cs.fsu.edu            code += '/* Code Needed to Clear Execute & Inst Hazards */\n'
1206019Shines@cs.fsu.edu        else:
1216019Shines@cs.fsu.edu            inst_flags += (x, )
1226019Shines@cs.fsu.edu
1236019Shines@cs.fsu.edu    iop = InstObjParams(name, Name, 'Jump', code, inst_flags)
1246019Shines@cs.fsu.edu    header_output = BasicDeclare.subst(iop)
1256019Shines@cs.fsu.edu    decoder_output = BasicConstructor.subst(iop)
1266019Shines@cs.fsu.edu    decode_block = BasicDecode.subst(iop)
1276019Shines@cs.fsu.edu    exec_output = BasicExecute.subst(iop)
1286019Shines@cs.fsu.edu    #exec_output = PredOpExecute.subst(iop)
1296019Shines@cs.fsu.edu}};
1306019Shines@cs.fsu.edu
1316019Shines@cs.fsu.edu
132