branch.isa revision 7797
17151Sgblack@eecs.umich.edu// -*- mode:c++ -*- 27151Sgblack@eecs.umich.edu 37151Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 47151Sgblack@eecs.umich.edu// All rights reserved 57151Sgblack@eecs.umich.edu// 67151Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall 77151Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual 87151Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating 97151Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software 107151Sgblack@eecs.umich.edu// licensed hereunder. You may use the software subject to the license 117151Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated 127151Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software, 137151Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 147151Sgblack@eecs.umich.edu// 157151Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 167151Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 177151Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 187151Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 197151Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 207151Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 217151Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 227151Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 237151Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 247151Sgblack@eecs.umich.edu// this software without specific prior written permission. 257151Sgblack@eecs.umich.edu// 267151Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 277151Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 287151Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 297151Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 307151Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 317151Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 327151Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 337151Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 347151Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 357151Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 367151Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 377151Sgblack@eecs.umich.edu// 387151Sgblack@eecs.umich.edu// Authors: Gabe Black 397151Sgblack@eecs.umich.edu 407151Sgblack@eecs.umich.edulet {{ 417151Sgblack@eecs.umich.edu 427151Sgblack@eecs.umich.edu header_output = "" 437151Sgblack@eecs.umich.edu decoder_output = "" 447151Sgblack@eecs.umich.edu exec_output = "" 457151Sgblack@eecs.umich.edu 467151Sgblack@eecs.umich.edu # B, BL 477151Sgblack@eecs.umich.edu for (mnem, link) in (("b", False), ("bl", True)): 487151Sgblack@eecs.umich.edu bCode = ''' 497797Sgblack@eecs.umich.edu NPC = (uint32_t)(PC + imm); 507151Sgblack@eecs.umich.edu ''' 517151Sgblack@eecs.umich.edu if (link): 527151Sgblack@eecs.umich.edu bCode += ''' 537797Sgblack@eecs.umich.edu if (Thumb) 547797Sgblack@eecs.umich.edu LR = PC | 1; 557720Sgblack@eecs.umich.edu else 567797Sgblack@eecs.umich.edu LR = PC - 4; 577151Sgblack@eecs.umich.edu ''' 587151Sgblack@eecs.umich.edu 597151Sgblack@eecs.umich.edu bIop = InstObjParams(mnem, mnem.capitalize(), "BranchImmCond", 607151Sgblack@eecs.umich.edu {"code": bCode, 617151Sgblack@eecs.umich.edu "predicate_test": predicateTest}) 627151Sgblack@eecs.umich.edu header_output += BranchImmCondDeclare.subst(bIop) 637151Sgblack@eecs.umich.edu decoder_output += BranchImmCondConstructor.subst(bIop) 647151Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(bIop) 657151Sgblack@eecs.umich.edu 667151Sgblack@eecs.umich.edu # BX, BLX 677151Sgblack@eecs.umich.edu blxCode = ''' 687151Sgblack@eecs.umich.edu %(link)s 697151Sgblack@eecs.umich.edu // Switch modes 707151Sgblack@eecs.umich.edu %(branch)s 717151Sgblack@eecs.umich.edu ''' 727151Sgblack@eecs.umich.edu 737151Sgblack@eecs.umich.edu blxList = (("blx", True, True), 747151Sgblack@eecs.umich.edu ("blx", False, True), 757151Sgblack@eecs.umich.edu ("bx", False, False)) 767151Sgblack@eecs.umich.edu 777151Sgblack@eecs.umich.edu for (mnem, imm, link) in blxList: 787151Sgblack@eecs.umich.edu Name = mnem.capitalize() 797151Sgblack@eecs.umich.edu if imm: 807151Sgblack@eecs.umich.edu Name += "Imm" 817151Sgblack@eecs.umich.edu # Since we're switching ISAs, the target ISA will be the opposite 827797Sgblack@eecs.umich.edu # of the current ISA. Thumb is whether the target is ARM. 837797Sgblack@eecs.umich.edu newPC = '(Thumb ? (roundDown(PC, 4) + imm) : (PC + imm))' 847602SGene.Wu@arm.com base = "BranchImmCond" 857602SGene.Wu@arm.com declare = BranchImmCondDeclare 867602SGene.Wu@arm.com constructor = BranchImmCondConstructor 877151Sgblack@eecs.umich.edu else: 887151Sgblack@eecs.umich.edu Name += "Reg" 897282Sgblack@eecs.umich.edu newPC = 'Op1' 907151Sgblack@eecs.umich.edu base = "BranchRegCond" 917151Sgblack@eecs.umich.edu declare = BranchRegCondDeclare 927151Sgblack@eecs.umich.edu constructor = BranchRegCondConstructor 937151Sgblack@eecs.umich.edu if link and imm: 947151Sgblack@eecs.umich.edu linkStr = ''' 957151Sgblack@eecs.umich.edu // The immediate version of the blx thumb instruction 967151Sgblack@eecs.umich.edu // is 32 bits wide, but "next pc" doesn't reflect that 977151Sgblack@eecs.umich.edu // so we don't want to substract 2 from it at this point 987797Sgblack@eecs.umich.edu if (Thumb) 997797Sgblack@eecs.umich.edu LR = PC | 1; 1007720Sgblack@eecs.umich.edu else 1017797Sgblack@eecs.umich.edu LR = PC - 4; 1027151Sgblack@eecs.umich.edu ''' 1037151Sgblack@eecs.umich.edu elif link: 1047151Sgblack@eecs.umich.edu linkStr = ''' 1057797Sgblack@eecs.umich.edu if (Thumb) 1067797Sgblack@eecs.umich.edu LR = (PC - 2) | 1; 1077720Sgblack@eecs.umich.edu else 1087797Sgblack@eecs.umich.edu LR = PC - 4; 1097151Sgblack@eecs.umich.edu ''' 1107151Sgblack@eecs.umich.edu else: 1117151Sgblack@eecs.umich.edu linkStr = "" 1127282Sgblack@eecs.umich.edu 1137282Sgblack@eecs.umich.edu if imm and link: #blx with imm 1147282Sgblack@eecs.umich.edu branchStr = ''' 1157797Sgblack@eecs.umich.edu NextThumb = !Thumb; 1167797Sgblack@eecs.umich.edu NPC = %(newPC)s; 1177282Sgblack@eecs.umich.edu ''' 1187282Sgblack@eecs.umich.edu else: 1197797Sgblack@eecs.umich.edu branchStr = "IWNPC = %(newPC)s;" 1207282Sgblack@eecs.umich.edu branchStr = branchStr % { "newPC" : newPC } 1217282Sgblack@eecs.umich.edu 1227151Sgblack@eecs.umich.edu code = blxCode % {"link": linkStr, 1237151Sgblack@eecs.umich.edu "newPC": newPC, 1247151Sgblack@eecs.umich.edu "branch": branchStr} 1257151Sgblack@eecs.umich.edu blxIop = InstObjParams(mnem, Name, base, 1267151Sgblack@eecs.umich.edu {"code": code, 1277151Sgblack@eecs.umich.edu "predicate_test": predicateTest}) 1287151Sgblack@eecs.umich.edu header_output += declare.subst(blxIop) 1297151Sgblack@eecs.umich.edu decoder_output += constructor.subst(blxIop) 1307151Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(blxIop) 1317151Sgblack@eecs.umich.edu 1327151Sgblack@eecs.umich.edu #Ignore BXJ for now 1337151Sgblack@eecs.umich.edu 1347151Sgblack@eecs.umich.edu #CBNZ, CBZ. These are always unconditional as far as predicates 1357151Sgblack@eecs.umich.edu for (mnem, test) in (("cbz", "=="), ("cbnz", "!=")): 1367797Sgblack@eecs.umich.edu code = 'NPC = (uint32_t)(PC + imm);\n' 1377151Sgblack@eecs.umich.edu predTest = "Op1 %(test)s 0" % {"test": test} 1387151Sgblack@eecs.umich.edu iop = InstObjParams(mnem, mnem.capitalize(), "BranchImmReg", 1397151Sgblack@eecs.umich.edu {"code": code, "predicate_test": predTest}) 1407151Sgblack@eecs.umich.edu header_output += BranchImmRegDeclare.subst(iop) 1417151Sgblack@eecs.umich.edu decoder_output += BranchImmRegConstructor.subst(iop) 1427151Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(iop) 1437151Sgblack@eecs.umich.edu 1447151Sgblack@eecs.umich.edu #TBB, TBH 1457151Sgblack@eecs.umich.edu for isTbh in (0, 1): 1467151Sgblack@eecs.umich.edu if isTbh: 1477294Sgblack@eecs.umich.edu eaCode = ''' 1487294Sgblack@eecs.umich.edu unsigned memAccessFlags = ArmISA::TLB::AllowUnaligned | 1497294Sgblack@eecs.umich.edu ArmISA::TLB::AlignHalfWord | 1507294Sgblack@eecs.umich.edu ArmISA::TLB::MustBeOne; 1517294Sgblack@eecs.umich.edu EA = Op1 + Op2 * 2 1527294Sgblack@eecs.umich.edu ''' 1537797Sgblack@eecs.umich.edu accCode = 'NPC = PC + 2 * (Mem.uh);\n' 1547151Sgblack@eecs.umich.edu mnem = "tbh" 1557151Sgblack@eecs.umich.edu else: 1567294Sgblack@eecs.umich.edu eaCode = ''' 1577294Sgblack@eecs.umich.edu unsigned memAccessFlags = ArmISA::TLB::AllowUnaligned | 1587294Sgblack@eecs.umich.edu ArmISA::TLB::AlignByte | 1597294Sgblack@eecs.umich.edu ArmISA::TLB::MustBeOne; 1607294Sgblack@eecs.umich.edu EA = Op1 + Op2 1617294Sgblack@eecs.umich.edu ''' 1627797Sgblack@eecs.umich.edu accCode = 'NPC = PC + 2 * (Mem.ub)' 1637151Sgblack@eecs.umich.edu mnem = "tbb" 1647151Sgblack@eecs.umich.edu iop = InstObjParams(mnem, mnem.capitalize(), "BranchRegReg", 1657151Sgblack@eecs.umich.edu {'ea_code': eaCode, 1667151Sgblack@eecs.umich.edu 'memacc_code': accCode, 1677151Sgblack@eecs.umich.edu 'predicate_test': predicateTest}) 1687151Sgblack@eecs.umich.edu header_output += BranchTableDeclare.subst(iop) 1697151Sgblack@eecs.umich.edu decoder_output += BranchRegRegConstructor.subst(iop) 1707151Sgblack@eecs.umich.edu exec_output += LoadExecute.subst(iop) + \ 1717151Sgblack@eecs.umich.edu LoadInitiateAcc.subst(iop) + \ 1727151Sgblack@eecs.umich.edu LoadCompleteAcc.subst(iop) 1737151Sgblack@eecs.umich.edu}}; 174