macromem.hh revision 6253
16253Sgblack@eecs.umich.edu/* Copyright (c) 2007-2008 The Florida State University
26253Sgblack@eecs.umich.edu * All rights reserved.
36253Sgblack@eecs.umich.edu *
46253Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
56253Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
66253Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
76253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
86253Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
96253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
106253Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
116253Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
126253Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
136253Sgblack@eecs.umich.edu * this software without specific prior written permission.
146253Sgblack@eecs.umich.edu *
156253Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
166253Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
176253Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
186253Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
196253Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
206253Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
216253Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
226253Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
236253Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
246253Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
256253Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
266253Sgblack@eecs.umich.edu *
276253Sgblack@eecs.umich.edu * Authors: Stephen Hines
286253Sgblack@eecs.umich.edu */
296253Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_MACROMEM_HH__
306253Sgblack@eecs.umich.edu#define __ARCH_ARM_MACROMEM_HH__
316253Sgblack@eecs.umich.edu
326253Sgblack@eecs.umich.edu#include "arch/arm/insts/pred_inst.hh"
336253Sgblack@eecs.umich.edu
346253Sgblack@eecs.umich.edunamespace ArmISA
356253Sgblack@eecs.umich.edu{
366253Sgblack@eecs.umich.edu
376253Sgblack@eecs.umich.edustatic inline unsigned int
386253Sgblack@eecs.umich.edunumber_of_ones(int32_t val)
396253Sgblack@eecs.umich.edu{
406253Sgblack@eecs.umich.edu    uint32_t ones = 0;
416253Sgblack@eecs.umich.edu    for (int i = 0; i < 32; i++ )
426253Sgblack@eecs.umich.edu    {
436253Sgblack@eecs.umich.edu        if ( val & (1<<i) )
446253Sgblack@eecs.umich.edu            ones++;
456253Sgblack@eecs.umich.edu    }
466253Sgblack@eecs.umich.edu    return ones;
476253Sgblack@eecs.umich.edu}
486253Sgblack@eecs.umich.edu
496253Sgblack@eecs.umich.edu/**
506253Sgblack@eecs.umich.edu * Arm Macro Memory operations like LDM/STM
516253Sgblack@eecs.umich.edu */
526253Sgblack@eecs.umich.educlass ArmMacroMemoryOp : public PredMacroOp
536253Sgblack@eecs.umich.edu{
546253Sgblack@eecs.umich.edu    protected:
556253Sgblack@eecs.umich.edu    /// Memory request flags.  See mem_req_base.hh.
566253Sgblack@eecs.umich.edu    unsigned memAccessFlags;
576253Sgblack@eecs.umich.edu    /// Pointer to EAComp object.
586253Sgblack@eecs.umich.edu    const StaticInstPtr eaCompPtr;
596253Sgblack@eecs.umich.edu    /// Pointer to MemAcc object.
606253Sgblack@eecs.umich.edu    const StaticInstPtr memAccPtr;
616253Sgblack@eecs.umich.edu
626253Sgblack@eecs.umich.edu    uint32_t reglist;
636253Sgblack@eecs.umich.edu    uint32_t ones;
646253Sgblack@eecs.umich.edu    uint32_t puswl,
656253Sgblack@eecs.umich.edu             prepost,
666253Sgblack@eecs.umich.edu             up,
676253Sgblack@eecs.umich.edu             psruser,
686253Sgblack@eecs.umich.edu             writeback,
696253Sgblack@eecs.umich.edu             loadop;
706253Sgblack@eecs.umich.edu
716253Sgblack@eecs.umich.edu    ArmMacroMemoryOp(const char *mnem, ExtMachInst _machInst,
726253Sgblack@eecs.umich.edu                     OpClass __opClass,
736253Sgblack@eecs.umich.edu                     StaticInstPtr _eaCompPtr = nullStaticInstPtr,
746253Sgblack@eecs.umich.edu                     StaticInstPtr _memAccPtr = nullStaticInstPtr)
756253Sgblack@eecs.umich.edu            : PredMacroOp(mnem, _machInst, __opClass),
766253Sgblack@eecs.umich.edu                          memAccessFlags(0),
776253Sgblack@eecs.umich.edu                          eaCompPtr(_eaCompPtr), memAccPtr(_memAccPtr),
786253Sgblack@eecs.umich.edu                          reglist(machInst.regList), ones(0),
796253Sgblack@eecs.umich.edu                          puswl(machInst.puswl),
806253Sgblack@eecs.umich.edu                          prepost(machInst.puswl.prepost),
816253Sgblack@eecs.umich.edu                          up(machInst.puswl.up),
826253Sgblack@eecs.umich.edu                          psruser(machInst.puswl.psruser),
836253Sgblack@eecs.umich.edu                          writeback(machInst.puswl.writeback),
846253Sgblack@eecs.umich.edu                          loadop(machInst.puswl.loadOp)
856253Sgblack@eecs.umich.edu    {
866253Sgblack@eecs.umich.edu        ones = number_of_ones(reglist);
876253Sgblack@eecs.umich.edu        numMicroops = ones + writeback + 1;
886253Sgblack@eecs.umich.edu        // Remember that writeback adds a uop
896253Sgblack@eecs.umich.edu        microOps = new StaticInstPtr[numMicroops];
906253Sgblack@eecs.umich.edu    }
916253Sgblack@eecs.umich.edu};
926253Sgblack@eecs.umich.edu
936253Sgblack@eecs.umich.edu/**
946253Sgblack@eecs.umich.edu * Arm Macro FPA operations to fix ldfd and stfd instructions
956253Sgblack@eecs.umich.edu */
966253Sgblack@eecs.umich.educlass ArmMacroFPAOp : public PredMacroOp
976253Sgblack@eecs.umich.edu{
986253Sgblack@eecs.umich.edu    protected:
996253Sgblack@eecs.umich.edu    uint32_t puswl,
1006253Sgblack@eecs.umich.edu             prepost,
1016253Sgblack@eecs.umich.edu             up,
1026253Sgblack@eecs.umich.edu             psruser,
1036253Sgblack@eecs.umich.edu             writeback,
1046253Sgblack@eecs.umich.edu             loadop;
1056253Sgblack@eecs.umich.edu    int32_t disp8;
1066253Sgblack@eecs.umich.edu
1076253Sgblack@eecs.umich.edu    ArmMacroFPAOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
1086253Sgblack@eecs.umich.edu        : PredMacroOp(mnem, _machInst, __opClass),
1096253Sgblack@eecs.umich.edu                      puswl(machInst.puswl),
1106253Sgblack@eecs.umich.edu                      prepost(machInst.puswl.prepost),
1116253Sgblack@eecs.umich.edu                      up(machInst.puswl.up),
1126253Sgblack@eecs.umich.edu                      psruser(machInst.puswl.psruser),
1136253Sgblack@eecs.umich.edu                      writeback(machInst.puswl.writeback),
1146253Sgblack@eecs.umich.edu                      loadop(machInst.puswl.loadOp),
1156253Sgblack@eecs.umich.edu                      disp8(machInst.immed7_0 << 2)
1166253Sgblack@eecs.umich.edu    {
1176253Sgblack@eecs.umich.edu        numMicroops = 3 + writeback;
1186253Sgblack@eecs.umich.edu        microOps = new StaticInstPtr[numMicroops];
1196253Sgblack@eecs.umich.edu    }
1206253Sgblack@eecs.umich.edu};
1216253Sgblack@eecs.umich.edu
1226253Sgblack@eecs.umich.edu/**
1236253Sgblack@eecs.umich.edu * Arm Macro FM operations to fix lfm and sfm
1246253Sgblack@eecs.umich.edu */
1256253Sgblack@eecs.umich.educlass ArmMacroFMOp : public PredMacroOp
1266253Sgblack@eecs.umich.edu{
1276253Sgblack@eecs.umich.edu    protected:
1286253Sgblack@eecs.umich.edu    uint32_t punwl,
1296253Sgblack@eecs.umich.edu             prepost,
1306253Sgblack@eecs.umich.edu             up,
1316253Sgblack@eecs.umich.edu             n1bit,
1326253Sgblack@eecs.umich.edu             writeback,
1336253Sgblack@eecs.umich.edu             loadop,
1346253Sgblack@eecs.umich.edu             n0bit,
1356253Sgblack@eecs.umich.edu             count;
1366253Sgblack@eecs.umich.edu    int32_t disp8;
1376253Sgblack@eecs.umich.edu
1386253Sgblack@eecs.umich.edu    ArmMacroFMOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
1396253Sgblack@eecs.umich.edu        : PredMacroOp(mnem, _machInst, __opClass),
1406253Sgblack@eecs.umich.edu                      punwl(machInst.punwl),
1416253Sgblack@eecs.umich.edu                      prepost(machInst.puswl.prepost),
1426253Sgblack@eecs.umich.edu                      up(machInst.puswl.up),
1436253Sgblack@eecs.umich.edu                      n1bit(machInst.opcode22),
1446253Sgblack@eecs.umich.edu                      writeback(machInst.puswl.writeback),
1456253Sgblack@eecs.umich.edu                      loadop(machInst.puswl.loadOp),
1466253Sgblack@eecs.umich.edu                      n0bit(machInst.opcode15),
1476253Sgblack@eecs.umich.edu                      disp8(machInst.immed7_0 << 2)
1486253Sgblack@eecs.umich.edu    {
1496253Sgblack@eecs.umich.edu        // Transfer 1-4 registers based on n1 and n0 bits (with 00 repr. 4)
1506253Sgblack@eecs.umich.edu        count = (n1bit << 1) | n0bit;
1516253Sgblack@eecs.umich.edu        if (count == 0)
1526253Sgblack@eecs.umich.edu            count = 4;
1536253Sgblack@eecs.umich.edu        numMicroops = (3*count) + writeback;
1546253Sgblack@eecs.umich.edu        microOps = new StaticInstPtr[numMicroops];
1556253Sgblack@eecs.umich.edu    }
1566253Sgblack@eecs.umich.edu};
1576253Sgblack@eecs.umich.edu}
1586253Sgblack@eecs.umich.edu
1596253Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_MACROMEM_HH__
160