macromem.hh revision 7615:50f6494d9b55
110915Sandreas.sandberg@arm.com/*
211313Sandreas.sandberg@arm.com * Copyright (c) 2010 ARM Limited
310915Sandreas.sandberg@arm.com * All rights reserved
410915Sandreas.sandberg@arm.com *
510915Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
610915Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
710915Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
810915Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
910915Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1010915Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1110915Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1210915Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1310915Sandreas.sandberg@arm.com *
1410915Sandreas.sandberg@arm.com * Copyright (c) 2007-2008 The Florida State University
1510915Sandreas.sandberg@arm.com * All rights reserved.
1610915Sandreas.sandberg@arm.com *
1710915Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
1810915Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
1910915Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
2010915Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
2110915Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
2210915Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
2310915Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
2410915Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
2510915Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
2610915Sandreas.sandberg@arm.com * this software without specific prior written permission.
2710915Sandreas.sandberg@arm.com *
2810915Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2910915Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3010915Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3111313Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3211313Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3311313Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3411313Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3510915Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3610915Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3710915Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3810915Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3910915Sandreas.sandberg@arm.com *
4010915Sandreas.sandberg@arm.com * Authors: Stephen Hines
4110915Sandreas.sandberg@arm.com */
4210915Sandreas.sandberg@arm.com#ifndef __ARCH_ARM_MACROMEM_HH__
4310915Sandreas.sandberg@arm.com#define __ARCH_ARM_MACROMEM_HH__
4410915Sandreas.sandberg@arm.com
4510915Sandreas.sandberg@arm.com#include "arch/arm/insts/pred_inst.hh"
4610915Sandreas.sandberg@arm.com#include "arch/arm/tlb.hh"
4710915Sandreas.sandberg@arm.com
4810915Sandreas.sandberg@arm.comnamespace ArmISA
4910915Sandreas.sandberg@arm.com{
5010915Sandreas.sandberg@arm.com
5110915Sandreas.sandberg@arm.comstatic inline unsigned int
5210915Sandreas.sandberg@arm.comnumber_of_ones(int32_t val)
5310915Sandreas.sandberg@arm.com{
5410915Sandreas.sandberg@arm.com    uint32_t ones = 0;
5510915Sandreas.sandberg@arm.com    for (int i = 0; i < 32; i++ )
5610915Sandreas.sandberg@arm.com    {
5710915Sandreas.sandberg@arm.com        if ( val & (1<<i) )
5810915Sandreas.sandberg@arm.com            ones++;
5910915Sandreas.sandberg@arm.com    }
6010915Sandreas.sandberg@arm.com    return ones;
6110915Sandreas.sandberg@arm.com}
6210915Sandreas.sandberg@arm.com
6310915Sandreas.sandberg@arm.com/**
6410915Sandreas.sandberg@arm.com * Base class for Memory microops
6510915Sandreas.sandberg@arm.com */
6610915Sandreas.sandberg@arm.comclass MicroOp : public PredOp
6710915Sandreas.sandberg@arm.com{
6810915Sandreas.sandberg@arm.com  protected:
6910915Sandreas.sandberg@arm.com    MicroOp(const char *mnem, ExtMachInst machInst, OpClass __opClass)
7010915Sandreas.sandberg@arm.com            : PredOp(mnem, machInst, __opClass)
7110915Sandreas.sandberg@arm.com    {
7210915Sandreas.sandberg@arm.com    }
7310915Sandreas.sandberg@arm.com
7410915Sandreas.sandberg@arm.com  public:
7510915Sandreas.sandberg@arm.com    void
7610915Sandreas.sandberg@arm.com    setDelayedCommit()
7710915Sandreas.sandberg@arm.com    {
7810915Sandreas.sandberg@arm.com        flags[IsDelayedCommit] = true;
7910915Sandreas.sandberg@arm.com    }
8010915Sandreas.sandberg@arm.com};
8110915Sandreas.sandberg@arm.com
8210915Sandreas.sandberg@arm.com/**
8310915Sandreas.sandberg@arm.com * Microops of the form IntRegA = IntRegB op Imm
8410915Sandreas.sandberg@arm.com */
8510915Sandreas.sandberg@arm.comclass MicroIntOp : public MicroOp
8610915Sandreas.sandberg@arm.com{
8710915Sandreas.sandberg@arm.com  protected:
8810915Sandreas.sandberg@arm.com    RegIndex ura, urb;
8910915Sandreas.sandberg@arm.com    uint8_t imm;
9010915Sandreas.sandberg@arm.com
9110915Sandreas.sandberg@arm.com    MicroIntOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
9210915Sandreas.sandberg@arm.com               RegIndex _ura, RegIndex _urb, uint8_t _imm)
9310915Sandreas.sandberg@arm.com            : MicroOp(mnem, machInst, __opClass),
9410915Sandreas.sandberg@arm.com              ura(_ura), urb(_urb), imm(_imm)
9510915Sandreas.sandberg@arm.com    {
9610915Sandreas.sandberg@arm.com    }
9710915Sandreas.sandberg@arm.com
9810915Sandreas.sandberg@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
9910915Sandreas.sandberg@arm.com};
10010915Sandreas.sandberg@arm.com
10110915Sandreas.sandberg@arm.com/**
10210915Sandreas.sandberg@arm.com * Memory microops which use IntReg + Imm addressing
10310915Sandreas.sandberg@arm.com */
10410915Sandreas.sandberg@arm.comclass MicroMemOp : public MicroIntOp
10510915Sandreas.sandberg@arm.com{
10610915Sandreas.sandberg@arm.com  protected:
10710915Sandreas.sandberg@arm.com    bool up;
10810915Sandreas.sandberg@arm.com    unsigned memAccessFlags;
10910915Sandreas.sandberg@arm.com
11010915Sandreas.sandberg@arm.com    MicroMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
11111313Sandreas.sandberg@arm.com               RegIndex _ura, RegIndex _urb, bool _up, uint8_t _imm)
11210915Sandreas.sandberg@arm.com            : MicroIntOp(mnem, machInst, __opClass, _ura, _urb, _imm),
11310915Sandreas.sandberg@arm.com              up(_up), memAccessFlags(TLB::MustBeOne | TLB::AlignWord)
11410915Sandreas.sandberg@arm.com    {
11510915Sandreas.sandberg@arm.com    }
11610915Sandreas.sandberg@arm.com
11710915Sandreas.sandberg@arm.com    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
11810915Sandreas.sandberg@arm.com};
11910915Sandreas.sandberg@arm.com
12010915Sandreas.sandberg@arm.com/**
12110915Sandreas.sandberg@arm.com * Base class for microcoded integer memory instructions.
12210915Sandreas.sandberg@arm.com */
12310915Sandreas.sandberg@arm.comclass MacroMemOp : public PredMacroOp
12410915Sandreas.sandberg@arm.com{
12510915Sandreas.sandberg@arm.com  protected:
12610915Sandreas.sandberg@arm.com    MacroMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
12710915Sandreas.sandberg@arm.com               IntRegIndex rn, bool index, bool up, bool user,
12810915Sandreas.sandberg@arm.com               bool writeback, bool load, uint32_t reglist);
12910915Sandreas.sandberg@arm.com};
13010915Sandreas.sandberg@arm.com
13111313Sandreas.sandberg@arm.com/**
13210915Sandreas.sandberg@arm.com * Base class for microcoded floating point memory instructions.
13310915Sandreas.sandberg@arm.com */
13410915Sandreas.sandberg@arm.comclass MacroVFPMemOp : public PredMacroOp
13510915Sandreas.sandberg@arm.com{
13610915Sandreas.sandberg@arm.com  protected:
13710915Sandreas.sandberg@arm.com    MacroVFPMemOp(const char *mnem, ExtMachInst machInst, OpClass __opClass,
13810915Sandreas.sandberg@arm.com                  IntRegIndex rn, RegIndex vd, bool single, bool up,
13910915Sandreas.sandberg@arm.com                  bool writeback, bool load, uint32_t offset);
14010915Sandreas.sandberg@arm.com};
14110915Sandreas.sandberg@arm.com
14210915Sandreas.sandberg@arm.com}
14310915Sandreas.sandberg@arm.com
14410915Sandreas.sandberg@arm.com#endif //__ARCH_ARM_INSTS_MACROMEM_HH__
14510915Sandreas.sandberg@arm.com