macromem.isa revision 7400
16019SN/A// -*- mode:c++ -*- 26019SN/A 37134Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 47134Sgblack@eecs.umich.edu// All rights reserved 57134Sgblack@eecs.umich.edu// 67134Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall 77134Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual 87134Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating 97134Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software 107134Sgblack@eecs.umich.edu// licensed hereunder. You may use the software subject to the license 117134Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated 127134Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software, 137134Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 147134Sgblack@eecs.umich.edu// 156019SN/A// Copyright (c) 2007-2008 The Florida State University 166019SN/A// All rights reserved. 176019SN/A// 186019SN/A// Redistribution and use in source and binary forms, with or without 196019SN/A// modification, are permitted provided that the following conditions are 206019SN/A// met: redistributions of source code must retain the above copyright 216019SN/A// notice, this list of conditions and the following disclaimer; 226019SN/A// redistributions in binary form must reproduce the above copyright 236019SN/A// notice, this list of conditions and the following disclaimer in the 246019SN/A// documentation and/or other materials provided with the distribution; 256019SN/A// neither the name of the copyright holders nor the names of its 266019SN/A// contributors may be used to endorse or promote products derived from 276019SN/A// this software without specific prior written permission. 286019SN/A// 296019SN/A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 306019SN/A// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 316019SN/A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 326019SN/A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 336019SN/A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 346019SN/A// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 356019SN/A// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 366019SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 376019SN/A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 386019SN/A// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 396019SN/A// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 406019SN/A// 416019SN/A// Authors: Stephen Hines 426308SN/A// Gabe Black 436308SN/A 446309SN/A//////////////////////////////////////////////////////////////////// 456309SN/A// 466309SN/A// Load/store microops 476309SN/A// 486309SN/A 497134Sgblack@eecs.umich.edulet {{ 507134Sgblack@eecs.umich.edu predicateTest = 'testPredicate(CondCodes, condCode)' 516309SN/A}}; 526309SN/A 536309SN/Alet {{ 547296Sgblack@eecs.umich.edu microLdrUopCode = "IWRa = cSwap(Mem.uw, ((CPSR)Cpsr).e);" 556309SN/A microLdrUopIop = InstObjParams('ldr_uop', 'MicroLdrUop', 566309SN/A 'MicroMemOp', 577296Sgblack@eecs.umich.edu {'memacc_code': microLdrUopCode, 587134Sgblack@eecs.umich.edu 'ea_code': 'EA = Rb + (up ? imm : -imm);', 596309SN/A 'predicate_test': predicateTest}, 606309SN/A ['IsMicroop']) 616309SN/A 627342Sgblack@eecs.umich.edu microLdrFpUopCode = "Fa.uw = cSwap(Mem.uw, ((CPSR)Cpsr).e);" 637174Sgblack@eecs.umich.edu microLdrFpUopIop = InstObjParams('ldrfp_uop', 'MicroLdrFpUop', 647174Sgblack@eecs.umich.edu 'MicroMemOp', 657296Sgblack@eecs.umich.edu {'memacc_code': microLdrFpUopCode, 667174Sgblack@eecs.umich.edu 'ea_code': 'EA = Rb + (up ? imm : -imm);', 677174Sgblack@eecs.umich.edu 'predicate_test': predicateTest}, 687174Sgblack@eecs.umich.edu ['IsMicroop']) 697174Sgblack@eecs.umich.edu 706754SN/A microLdrRetUopCode = ''' 717296Sgblack@eecs.umich.edu CPSR cpsr = Cpsr; 727400SAli.Saidi@ARM.com SCTLR sctlr = Sctlr; 737134Sgblack@eecs.umich.edu uint32_t newCpsr = 747400SAli.Saidi@ARM.com cpsrWriteByInstr(cpsr | CondCodes, Spsr, 0xF, true, sctlr.nmfi); 757134Sgblack@eecs.umich.edu Cpsr = ~CondCodesMask & newCpsr; 767134Sgblack@eecs.umich.edu CondCodes = CondCodesMask & newCpsr; 777296Sgblack@eecs.umich.edu IWNPC = cSwap(Mem.uw, cpsr.e) | ((Spsr & 0x20) ? 1 : 0); 786754SN/A ''' 796754SN/A microLdrRetUopIop = InstObjParams('ldr_ret_uop', 'MicroLdrRetUop', 806754SN/A 'MicroMemOp', 816754SN/A {'memacc_code': microLdrRetUopCode, 826754SN/A 'ea_code': 837134Sgblack@eecs.umich.edu 'EA = Rb + (up ? imm : -imm);', 846754SN/A 'predicate_test': predicateTest}, 856754SN/A ['IsMicroop']) 866754SN/A 877296Sgblack@eecs.umich.edu microStrUopCode = "Mem = cSwap(Ra.uw, ((CPSR)Cpsr).e);" 886309SN/A microStrUopIop = InstObjParams('str_uop', 'MicroStrUop', 896309SN/A 'MicroMemOp', 907296Sgblack@eecs.umich.edu {'memacc_code': microStrUopCode, 917303Sgblack@eecs.umich.edu 'postacc_code': "", 927134Sgblack@eecs.umich.edu 'ea_code': 'EA = Rb + (up ? imm : -imm);', 936309SN/A 'predicate_test': predicateTest}, 946309SN/A ['IsMicroop']) 956309SN/A 967296Sgblack@eecs.umich.edu microStrFpUopCode = "Mem = cSwap(Fa.uw, ((CPSR)Cpsr).e);" 977174Sgblack@eecs.umich.edu microStrFpUopIop = InstObjParams('strfp_uop', 'MicroStrFpUop', 987174Sgblack@eecs.umich.edu 'MicroMemOp', 997296Sgblack@eecs.umich.edu {'memacc_code': microStrFpUopCode, 1007303Sgblack@eecs.umich.edu 'postacc_code': "", 1017174Sgblack@eecs.umich.edu 'ea_code': 'EA = Rb + (up ? imm : -imm);', 1027174Sgblack@eecs.umich.edu 'predicate_test': predicateTest}, 1037174Sgblack@eecs.umich.edu ['IsMicroop']) 1047174Sgblack@eecs.umich.edu 1057174Sgblack@eecs.umich.edu header_output = decoder_output = exec_output = '' 1067174Sgblack@eecs.umich.edu 1077174Sgblack@eecs.umich.edu loadIops = (microLdrUopIop, microLdrFpUopIop, microLdrRetUopIop) 1087174Sgblack@eecs.umich.edu storeIops = (microStrUopIop, microStrFpUopIop) 1097174Sgblack@eecs.umich.edu for iop in loadIops + storeIops: 1107174Sgblack@eecs.umich.edu header_output += MicroMemDeclare.subst(iop) 1117174Sgblack@eecs.umich.edu decoder_output += MicroMemConstructor.subst(iop) 1127174Sgblack@eecs.umich.edu for iop in loadIops: 1137174Sgblack@eecs.umich.edu exec_output += LoadExecute.subst(iop) + \ 1147174Sgblack@eecs.umich.edu LoadInitiateAcc.subst(iop) + \ 1157174Sgblack@eecs.umich.edu LoadCompleteAcc.subst(iop) 1167174Sgblack@eecs.umich.edu for iop in storeIops: 1177174Sgblack@eecs.umich.edu exec_output += StoreExecute.subst(iop) + \ 1187174Sgblack@eecs.umich.edu StoreInitiateAcc.subst(iop) + \ 1197174Sgblack@eecs.umich.edu StoreCompleteAcc.subst(iop) 1206309SN/A}}; 1216308SN/A 1226308SN/A//////////////////////////////////////////////////////////////////// 1236308SN/A// 1246308SN/A// Integer = Integer op Immediate microops 1256308SN/A// 1266308SN/A 1276308SN/Alet {{ 1286308SN/A microAddiUopIop = InstObjParams('addi_uop', 'MicroAddiUop', 1296308SN/A 'MicroIntOp', 1306308SN/A {'code': 'Ra = Rb + imm;', 1316308SN/A 'predicate_test': predicateTest}, 1326308SN/A ['IsMicroop']) 1336308SN/A 1346308SN/A microSubiUopIop = InstObjParams('subi_uop', 'MicroSubiUop', 1356308SN/A 'MicroIntOp', 1366308SN/A {'code': 'Ra = Rb - imm;', 1376308SN/A 'predicate_test': predicateTest}, 1386308SN/A ['IsMicroop']) 1396308SN/A 1406308SN/A header_output = MicroIntDeclare.subst(microAddiUopIop) + \ 1416308SN/A MicroIntDeclare.subst(microSubiUopIop) 1427134Sgblack@eecs.umich.edu decoder_output = MicroIntConstructor.subst(microAddiUopIop) + \ 1437134Sgblack@eecs.umich.edu MicroIntConstructor.subst(microSubiUopIop) 1446308SN/A exec_output = PredOpExecute.subst(microAddiUopIop) + \ 1456308SN/A PredOpExecute.subst(microSubiUopIop) 1466308SN/A}}; 1476019SN/A 1487134Sgblack@eecs.umich.edulet {{ 1497170Sgblack@eecs.umich.edu iop = InstObjParams("ldmstm", "LdmStm", 'MacroMemOp', "", []) 1507134Sgblack@eecs.umich.edu header_output = MacroMemDeclare.subst(iop) 1517134Sgblack@eecs.umich.edu decoder_output = MacroMemConstructor.subst(iop) 1527179Sgblack@eecs.umich.edu 1537179Sgblack@eecs.umich.edu vfpIop = InstObjParams("vldmstm", "VLdmStm", 'MacroVFPMemOp', "", []) 1547179Sgblack@eecs.umich.edu header_output += MacroVFPMemDeclare.subst(vfpIop) 1557179Sgblack@eecs.umich.edu decoder_output += MacroVFPMemConstructor.subst(vfpIop) 1566019SN/A}}; 157