123 lines
4.2 KiB
C++
123 lines
4.2 KiB
C++
// -*- mode:c++ -*-
|
|
|
|
// Copyright (c) 2007-2008 The Florida State University
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met: redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer;
|
|
// redistributions in binary form must reproduce the above copyright
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
// documentation and/or other materials provided with the distribution;
|
|
// neither the name of the copyright holders nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
//
|
|
// Authors: Stephen Hines
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Control transfer instructions
|
|
//
|
|
|
|
def format Branch(code,*opt_flags) {{
|
|
|
|
#Build Instruction Flags
|
|
#Use Link & Likely Flags to Add Link/Condition Code
|
|
inst_flags = ('IsDirectControl', )
|
|
for x in opt_flags:
|
|
if x == 'Link':
|
|
code += 'LR = NPC;\n'
|
|
else:
|
|
inst_flags += (x, )
|
|
|
|
#Take into account uncond. branch instruction
|
|
if 'cond == 1' in code:
|
|
inst_flags += ('IsUnCondControl', )
|
|
else:
|
|
inst_flags += ('IsCondControl', )
|
|
|
|
icode = 'if (testPredicate(Cpsr, condCode)) {\n'
|
|
icode += code
|
|
icode += ' NPC = NPC + 4 + disp;\n'
|
|
icode += '} else {\n'
|
|
icode += ' NPC = NPC;\n'
|
|
icode += '};\n'
|
|
|
|
code = icode
|
|
|
|
iop = InstObjParams(name, Name, 'Branch', code, inst_flags)
|
|
header_output = BasicDeclare.subst(iop)
|
|
decoder_output = BasicConstructor.subst(iop)
|
|
decode_block = BasicDecode.subst(iop)
|
|
exec_output = BasicExecute.subst(iop)
|
|
}};
|
|
|
|
def format BranchExchange(code,*opt_flags) {{
|
|
#Build Instruction Flags
|
|
#Use Link & Likely Flags to Add Link/Condition Code
|
|
inst_flags = ('IsIndirectControl', )
|
|
for x in opt_flags:
|
|
if x == 'Link':
|
|
code += 'LR = NPC;\n'
|
|
else:
|
|
inst_flags += (x, )
|
|
|
|
#Take into account uncond. branch instruction
|
|
if 'cond == 1' in code:
|
|
inst_flags += ('IsUnCondControl', )
|
|
else:
|
|
inst_flags += ('IsCondControl', )
|
|
|
|
#Condition code
|
|
|
|
icode = 'if (testPredicate(Cpsr, condCode)) {\n'
|
|
icode += code
|
|
icode += ' NPC = Rm & 0xfffffffe; // Masks off bottom bit\n'
|
|
icode += '} else {\n'
|
|
icode += ' NPC = NPC;\n'
|
|
icode += '};\n'
|
|
|
|
code = icode
|
|
|
|
iop = InstObjParams(name, Name, 'BranchExchange', code, inst_flags)
|
|
header_output = BasicDeclare.subst(iop)
|
|
decoder_output = BasicConstructor.subst(iop)
|
|
decode_block = BasicDecode.subst(iop)
|
|
exec_output = BasicExecute.subst(iop)
|
|
}};
|
|
|
|
def format Jump(code, *opt_flags) {{
|
|
#Build Instruction Flags
|
|
#Use Link Flag to Add Link Code
|
|
inst_flags = ('IsIndirectControl', 'IsUncondControl')
|
|
for x in opt_flags:
|
|
if x == 'Link':
|
|
code = 'LR = NPC;\n' + code
|
|
elif x == 'ClearHazards':
|
|
code += '/* Code Needed to Clear Execute & Inst Hazards */\n'
|
|
else:
|
|
inst_flags += (x, )
|
|
|
|
iop = InstObjParams(name, Name, 'Jump', code, inst_flags)
|
|
header_output = BasicDeclare.subst(iop)
|
|
decoder_output = BasicConstructor.subst(iop)
|
|
decode_block = BasicDecode.subst(iop)
|
|
exec_output = BasicExecute.subst(iop)
|
|
#exec_output = PredOpExecute.subst(iop)
|
|
}};
|
|
|
|
|