macromem.isa revision 7303
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
627296Sgblack@eecs.umich.edu    microLdrFpUopCode = "Fa = 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;
727134Sgblack@eecs.umich.edu        uint32_t newCpsr =
737296Sgblack@eecs.umich.edu            cpsrWriteByInstr(cpsr | CondCodes, Spsr, 0xF, true);
747134Sgblack@eecs.umich.edu        Cpsr = ~CondCodesMask & newCpsr;
757134Sgblack@eecs.umich.edu        CondCodes = CondCodesMask & newCpsr;
767296Sgblack@eecs.umich.edu        IWNPC = cSwap(Mem.uw, cpsr.e) | ((Spsr & 0x20) ? 1 : 0);
776754SN/A    '''
786754SN/A    microLdrRetUopIop = InstObjParams('ldr_ret_uop', 'MicroLdrRetUop',
796754SN/A                                      'MicroMemOp',
806754SN/A                                      {'memacc_code': microLdrRetUopCode,
816754SN/A                                       'ea_code':
827134Sgblack@eecs.umich.edu                                          'EA = Rb + (up ? imm : -imm);',
836754SN/A                                       'predicate_test': predicateTest},
846754SN/A                                      ['IsMicroop'])
856754SN/A
867296Sgblack@eecs.umich.edu    microStrUopCode = "Mem = cSwap(Ra.uw, ((CPSR)Cpsr).e);"
876309SN/A    microStrUopIop = InstObjParams('str_uop', 'MicroStrUop',
886309SN/A                                   'MicroMemOp',
897296Sgblack@eecs.umich.edu                                   {'memacc_code': microStrUopCode,
907303Sgblack@eecs.umich.edu                                    'postacc_code': "",
917134Sgblack@eecs.umich.edu                                    'ea_code': 'EA = Rb + (up ? imm : -imm);',
926309SN/A                                    'predicate_test': predicateTest},
936309SN/A                                   ['IsMicroop'])
946309SN/A
957296Sgblack@eecs.umich.edu    microStrFpUopCode = "Mem = cSwap(Fa.uw, ((CPSR)Cpsr).e);"
967174Sgblack@eecs.umich.edu    microStrFpUopIop = InstObjParams('strfp_uop', 'MicroStrFpUop',
977174Sgblack@eecs.umich.edu                                     'MicroMemOp',
987296Sgblack@eecs.umich.edu                                     {'memacc_code': microStrFpUopCode,
997303Sgblack@eecs.umich.edu                                      'postacc_code': "",
1007174Sgblack@eecs.umich.edu                                      'ea_code': 'EA = Rb + (up ? imm : -imm);',
1017174Sgblack@eecs.umich.edu                                      'predicate_test': predicateTest},
1027174Sgblack@eecs.umich.edu                                     ['IsMicroop'])
1037174Sgblack@eecs.umich.edu
1047174Sgblack@eecs.umich.edu    header_output = decoder_output = exec_output = ''
1057174Sgblack@eecs.umich.edu
1067174Sgblack@eecs.umich.edu    loadIops = (microLdrUopIop, microLdrFpUopIop, microLdrRetUopIop)
1077174Sgblack@eecs.umich.edu    storeIops = (microStrUopIop, microStrFpUopIop)
1087174Sgblack@eecs.umich.edu    for iop in loadIops + storeIops:
1097174Sgblack@eecs.umich.edu        header_output += MicroMemDeclare.subst(iop)
1107174Sgblack@eecs.umich.edu        decoder_output += MicroMemConstructor.subst(iop)
1117174Sgblack@eecs.umich.edu    for iop in loadIops:
1127174Sgblack@eecs.umich.edu        exec_output += LoadExecute.subst(iop) + \
1137174Sgblack@eecs.umich.edu                       LoadInitiateAcc.subst(iop) + \
1147174Sgblack@eecs.umich.edu                       LoadCompleteAcc.subst(iop)
1157174Sgblack@eecs.umich.edu    for iop in storeIops:
1167174Sgblack@eecs.umich.edu        exec_output += StoreExecute.subst(iop) + \
1177174Sgblack@eecs.umich.edu                       StoreInitiateAcc.subst(iop) + \
1187174Sgblack@eecs.umich.edu                       StoreCompleteAcc.subst(iop)
1196309SN/A}};
1206308SN/A
1216308SN/A////////////////////////////////////////////////////////////////////
1226308SN/A//
1236308SN/A// Integer = Integer op Immediate microops
1246308SN/A//
1256308SN/A
1266308SN/Alet {{
1276308SN/A    microAddiUopIop = InstObjParams('addi_uop', 'MicroAddiUop',
1286308SN/A                                    'MicroIntOp',
1296308SN/A                                    {'code': 'Ra = Rb + imm;',
1306308SN/A                                     'predicate_test': predicateTest},
1316308SN/A                                    ['IsMicroop'])
1326308SN/A
1336308SN/A    microSubiUopIop = InstObjParams('subi_uop', 'MicroSubiUop',
1346308SN/A                                    'MicroIntOp',
1356308SN/A                                    {'code': 'Ra = Rb - imm;',
1366308SN/A                                     'predicate_test': predicateTest},
1376308SN/A                                    ['IsMicroop'])
1386308SN/A
1396308SN/A    header_output = MicroIntDeclare.subst(microAddiUopIop) + \
1406308SN/A                    MicroIntDeclare.subst(microSubiUopIop)
1417134Sgblack@eecs.umich.edu    decoder_output = MicroIntConstructor.subst(microAddiUopIop) + \
1427134Sgblack@eecs.umich.edu                     MicroIntConstructor.subst(microSubiUopIop)
1436308SN/A    exec_output = PredOpExecute.subst(microAddiUopIop) + \
1446308SN/A                  PredOpExecute.subst(microSubiUopIop)
1456308SN/A}};
1466019SN/A
1477134Sgblack@eecs.umich.edulet {{
1487170Sgblack@eecs.umich.edu    iop = InstObjParams("ldmstm", "LdmStm", 'MacroMemOp', "", [])
1497134Sgblack@eecs.umich.edu    header_output = MacroMemDeclare.subst(iop)
1507134Sgblack@eecs.umich.edu    decoder_output = MacroMemConstructor.subst(iop)
1517179Sgblack@eecs.umich.edu
1527179Sgblack@eecs.umich.edu    vfpIop = InstObjParams("vldmstm", "VLdmStm", 'MacroVFPMemOp', "", [])
1537179Sgblack@eecs.umich.edu    header_output += MacroVFPMemDeclare.subst(vfpIop)
1547179Sgblack@eecs.umich.edu    decoder_output += MacroVFPMemConstructor.subst(vfpIop)
1556019SN/A}};
156