macromem.hh revision 6308
13021SN/A/* Copyright (c) 2007-2008 The Florida State University
23021SN/A * All rights reserved.
33021SN/A *
410036SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without
58835SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are
610036SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright
77935SN/A * notice, this list of conditions and the following disclaimer;
87935SN/A * redistributions in binary form must reproduce the above copyright
97935SN/A * notice, this list of conditions and the following disclaimer in the
103021SN/A * documentation and/or other materials provided with the distribution;
113021SN/A * neither the name of the copyright holders nor the names of its
123021SN/A * contributors may be used to endorse or promote products derived from
139885Sstever@gmail.com * this software without specific prior written permission.
148835SAli.Saidi@ARM.com *
159885Sstever@gmail.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
169885Sstever@gmail.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1710036SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
188835SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
198835SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
208835SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
219481Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
229481Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
238540SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
248721SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
258835SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
268835SAli.Saidi@ARM.com *
277935SN/A * Authors: Stephen Hines
287935SN/A */
297935SN/A#ifndef __ARCH_ARM_MACROMEM_HH__
307935SN/A#define __ARCH_ARM_MACROMEM_HH__
317935SN/A
327935SN/A#include "arch/arm/insts/pred_inst.hh"
337935SN/A
348983Snate@binkert.orgnamespace ArmISA
353021SN/A{
369885Sstever@gmail.com
379885Sstever@gmail.comstatic inline unsigned int
389885Sstever@gmail.comnumber_of_ones(int32_t val)
3910036SAli.Saidi@ARM.com{
409885Sstever@gmail.com    uint32_t ones = 0;
419885Sstever@gmail.com    for (int i = 0; i < 32; i++ )
423021SN/A    {
433021SN/A        if ( val & (1<<i) )
449481Snilay@cs.wisc.edu            ones++;
455876SN/A    }
469885Sstever@gmail.com    return ones;
473171SN/A}
485876SN/A
498835SAli.Saidi@ARM.com/**
505876SN/A * Microops of the form IntRegA = IntRegB op Imm
515000SN/A */
5210036SAli.Saidi@ARM.comclass MicroIntOp : public PredOp
533021SN/A{
543021SN/A  protected:
558835SAli.Saidi@ARM.com    RegIndex ura, urb;
569481Snilay@cs.wisc.edu    uint8_t imm;
575000SN/A
583021SN/A    MicroIntOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
593021SN/A               RegIndex _ura, RegIndex _urb, uint8_t _imm)
603021SN/A            : PredOp(mnem, machInst, __opClass),
613021SN/A              ura(_ura), urb(_urb), imm(_imm)
625575SN/A    {
638835SAli.Saidi@ARM.com    }
643171SN/A};
659885Sstever@gmail.com
669481Snilay@cs.wisc.edu/**
673021SN/A * Arm Macro Memory operations like LDM/STM
684938SN/A */
693021SN/Aclass ArmMacroMemoryOp : public PredMacroOp
703104SN/A{
713104SN/A    protected:
723021SN/A    /// Memory request flags.  See mem_req_base.hh.
733041SN/A    unsigned memAccessFlags;
743041SN/A
759885Sstever@gmail.com    uint32_t reglist;
768983Snate@binkert.org    uint32_t ones;
773041SN/A    uint32_t puswl,
789885Sstever@gmail.com             prepost,
7910036SAli.Saidi@ARM.com             up,
806123SN/A             psruser,
819481Snilay@cs.wisc.edu             writeback,
828241SN/A             loadop;
833041SN/A
849481Snilay@cs.wisc.edu    ArmMacroMemoryOp(const char *mnem, ExtMachInst _machInst,
855876SN/A                     OpClass __opClass)
868835SAli.Saidi@ARM.com            : PredMacroOp(mnem, _machInst, __opClass),
879481Snilay@cs.wisc.edu                          memAccessFlags(0),
8810036SAli.Saidi@ARM.com                          reglist(machInst.regList), ones(0),
893041SN/A                          puswl(machInst.puswl),
908835SAli.Saidi@ARM.com                          prepost(machInst.puswl.prepost),
919885Sstever@gmail.com                          up(machInst.puswl.up),
929481Snilay@cs.wisc.edu                          psruser(machInst.puswl.psruser),
933041SN/A                          writeback(machInst.puswl.writeback),
943041SN/A                          loadop(machInst.puswl.loadOp)
953104SN/A    {
968983Snate@binkert.org        ones = number_of_ones(reglist);
973041SN/A        numMicroops = ones + writeback + 1;
989885Sstever@gmail.com        // Remember that writeback adds a uop
999885Sstever@gmail.com        microOps = new StaticInstPtr[numMicroops];
1009885Sstever@gmail.com    }
1019885Sstever@gmail.com};
1029885Sstever@gmail.com
10310036SAli.Saidi@ARM.com/**
1049885Sstever@gmail.com * Arm Macro FPA operations to fix ldfd and stfd instructions
10510036SAli.Saidi@ARM.com */
1069885Sstever@gmail.comclass ArmMacroFPAOp : public PredMacroOp
1079885Sstever@gmail.com{
1085000SN/A    protected:
1096024SN/A    uint32_t puswl,
11010036SAli.Saidi@ARM.com             prepost,
1115355SN/A             up,
1125000SN/A             psruser,
1133041SN/A             writeback,
1143041SN/A             loadop;
1159885Sstever@gmail.com    int32_t disp8;
1168983Snate@binkert.org
1173041SN/A    ArmMacroFPAOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
1189885Sstever@gmail.com        : PredMacroOp(mnem, _machInst, __opClass),
11910036SAli.Saidi@ARM.com                      puswl(machInst.puswl),
1206123SN/A                      prepost(machInst.puswl.prepost),
1219481Snilay@cs.wisc.edu                      up(machInst.puswl.up),
1228241SN/A                      psruser(machInst.puswl.psruser),
1233041SN/A                      writeback(machInst.puswl.writeback),
1249481Snilay@cs.wisc.edu                      loadop(machInst.puswl.loadOp),
1255876SN/A                      disp8(machInst.immed7_0 << 2)
1268835SAli.Saidi@ARM.com    {
1279481Snilay@cs.wisc.edu        numMicroops = 3 + writeback;
12810036SAli.Saidi@ARM.com        microOps = new StaticInstPtr[numMicroops];
1293041SN/A    }
1308835SAli.Saidi@ARM.com};
1319885Sstever@gmail.com
1329481Snilay@cs.wisc.edu/**
1333041SN/A * Arm Macro FM operations to fix lfm and sfm
1343041SN/A */
1353104SN/Aclass ArmMacroFMOp : public PredMacroOp
1368983Snate@binkert.org{
1373041SN/A    protected:
1389885Sstever@gmail.com    uint32_t punwl,
1399885Sstever@gmail.com             prepost,
1409885Sstever@gmail.com             up,
1419885Sstever@gmail.com             n1bit,
1429885Sstever@gmail.com             writeback,
14310036SAli.Saidi@ARM.com             loadop,
1449885Sstever@gmail.com             n0bit,
14510036SAli.Saidi@ARM.com             count;
1469885Sstever@gmail.com    int32_t disp8;
1479885Sstever@gmail.com
1488835SAli.Saidi@ARM.com    ArmMacroFMOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
1498835SAli.Saidi@ARM.com        : PredMacroOp(mnem, _machInst, __opClass),
15010036SAli.Saidi@ARM.com                      punwl(machInst.punwl),
1518835SAli.Saidi@ARM.com                      prepost(machInst.puswl.prepost),
1529481Snilay@cs.wisc.edu                      up(machInst.puswl.up),
1539481Snilay@cs.wisc.edu                      n1bit(machInst.opcode22),
15410036SAli.Saidi@ARM.com                      writeback(machInst.puswl.writeback),
1559481Snilay@cs.wisc.edu                      loadop(machInst.puswl.loadOp),
1569481Snilay@cs.wisc.edu                      n0bit(machInst.opcode15),
15710036SAli.Saidi@ARM.com                      disp8(machInst.immed7_0 << 2)
1589481Snilay@cs.wisc.edu    {
1595000SN/A        // Transfer 1-4 registers based on n1 and n0 bits (with 00 repr. 4)
1606024SN/A        count = (n1bit << 1) | n0bit;
16110036SAli.Saidi@ARM.com        if (count == 0)
1625355SN/A            count = 4;
1635000SN/A        numMicroops = (3*count) + writeback;
1643041SN/A        microOps = new StaticInstPtr[numMicroops];
1653041SN/A    }
1669885Sstever@gmail.com};
1678983Snate@binkert.org}
1689481Snilay@cs.wisc.edu
1699885Sstever@gmail.com#endif //__ARCH_ARM_INSTS_MACROMEM_HH__
17010036SAli.Saidi@ARM.com