| // -*- 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) |
| }}; |
| |
| |