decoder.hh revision 9377:6f294e7a93d1
112239Sandreas.sandberg@arm.com/* 212239Sandreas.sandberg@arm.com * Copyright (c) 2012 Google 312239Sandreas.sandberg@arm.com * All rights reserved. 412239Sandreas.sandberg@arm.com * 512239Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 612239Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 712239Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 812239Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 912239Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1012239Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1112239Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1212239Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1312239Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 1412239Sandreas.sandberg@arm.com * this software without specific prior written permission. 1512239Sandreas.sandberg@arm.com * 1612239Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712239Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812239Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912239Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012239Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112239Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212239Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312239Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412239Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512239Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612239Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712239Sandreas.sandberg@arm.com * 2812239Sandreas.sandberg@arm.com * Authors: Gabe Black 2912239Sandreas.sandberg@arm.com */ 3012239Sandreas.sandberg@arm.com 3112239Sandreas.sandberg@arm.com#ifndef __ARCH_MIPS_DECODER_HH__ 3212239Sandreas.sandberg@arm.com#define __ARCH_MIPS_DECODER_HH__ 3312239Sandreas.sandberg@arm.com 3412239Sandreas.sandberg@arm.com#include "arch/generic/decode_cache.hh" 3512239Sandreas.sandberg@arm.com#include "arch/mips/types.hh" 3612239Sandreas.sandberg@arm.com#include "base/misc.hh" 3712239Sandreas.sandberg@arm.com#include "base/types.hh" 3812239Sandreas.sandberg@arm.com#include "cpu/static_inst.hh" 3912239Sandreas.sandberg@arm.com 4012239Sandreas.sandberg@arm.comnamespace MipsISA 4112239Sandreas.sandberg@arm.com{ 4212239Sandreas.sandberg@arm.com 4312239Sandreas.sandberg@arm.comclass Decoder 4412239Sandreas.sandberg@arm.com{ 4512239Sandreas.sandberg@arm.com protected: 4612239Sandreas.sandberg@arm.com //The extended machine instruction being generated 4712239Sandreas.sandberg@arm.com ExtMachInst emi; 4812239Sandreas.sandberg@arm.com bool instDone; 4912239Sandreas.sandberg@arm.com 5012239Sandreas.sandberg@arm.com public: 5112239Sandreas.sandberg@arm.com Decoder() : instDone(false) 5212239Sandreas.sandberg@arm.com {} 5312239Sandreas.sandberg@arm.com 5412239Sandreas.sandberg@arm.com void 5512239Sandreas.sandberg@arm.com process() 5612239Sandreas.sandberg@arm.com { 5712239Sandreas.sandberg@arm.com } 5812239Sandreas.sandberg@arm.com 5912239Sandreas.sandberg@arm.com void 6012239Sandreas.sandberg@arm.com reset() 6112239Sandreas.sandberg@arm.com { 6212239Sandreas.sandberg@arm.com instDone = false; 6312239Sandreas.sandberg@arm.com } 6412239Sandreas.sandberg@arm.com 6512239Sandreas.sandberg@arm.com //Use this to give data to the decoder. This should be used 6612239Sandreas.sandberg@arm.com //when there is control flow. 6712239Sandreas.sandberg@arm.com void 6812239Sandreas.sandberg@arm.com moreBytes(const PCState &pc, Addr fetchPC, MachInst inst) 6912239Sandreas.sandberg@arm.com { 7012239Sandreas.sandberg@arm.com emi = inst; 7112239Sandreas.sandberg@arm.com instDone = true; 7212239Sandreas.sandberg@arm.com } 7312239Sandreas.sandberg@arm.com 7412239Sandreas.sandberg@arm.com bool 7512239Sandreas.sandberg@arm.com needMoreBytes() 7612239Sandreas.sandberg@arm.com { 7712239Sandreas.sandberg@arm.com return true; 7812239Sandreas.sandberg@arm.com } 7912239Sandreas.sandberg@arm.com 8012239Sandreas.sandberg@arm.com bool 8112239Sandreas.sandberg@arm.com instReady() 8212239Sandreas.sandberg@arm.com { 8312239Sandreas.sandberg@arm.com return instDone; 8412239Sandreas.sandberg@arm.com } 8512239Sandreas.sandberg@arm.com 8612239Sandreas.sandberg@arm.com protected: 8712239Sandreas.sandberg@arm.com /// A cache of decoded instruction objects. 8812239Sandreas.sandberg@arm.com static GenericISA::BasicDecodeCache defaultCache; 8912239Sandreas.sandberg@arm.com 9012239Sandreas.sandberg@arm.com public: 9112239Sandreas.sandberg@arm.com StaticInstPtr decodeInst(ExtMachInst mach_inst); 9212239Sandreas.sandberg@arm.com 9312239Sandreas.sandberg@arm.com /// Decode a machine instruction. 9412239Sandreas.sandberg@arm.com /// @param mach_inst The binary instruction to decode. 9512239Sandreas.sandberg@arm.com /// @retval A pointer to the corresponding StaticInst object. 9612239Sandreas.sandberg@arm.com StaticInstPtr 9712239Sandreas.sandberg@arm.com decode(ExtMachInst mach_inst, Addr addr) 9812239Sandreas.sandberg@arm.com { 9912239Sandreas.sandberg@arm.com return defaultCache.decode(this, mach_inst, addr); 10012239Sandreas.sandberg@arm.com } 10112239Sandreas.sandberg@arm.com 10212239Sandreas.sandberg@arm.com StaticInstPtr 10312239Sandreas.sandberg@arm.com decode(MipsISA::PCState &nextPC) 10412239Sandreas.sandberg@arm.com { 10512239Sandreas.sandberg@arm.com if (!instDone) 10612239Sandreas.sandberg@arm.com return NULL; 10712239Sandreas.sandberg@arm.com instDone = false; 10812239Sandreas.sandberg@arm.com return decode(emi, nextPC.instAddr()); 10912239Sandreas.sandberg@arm.com } 11012239Sandreas.sandberg@arm.com}; 11112239Sandreas.sandberg@arm.com 11212239Sandreas.sandberg@arm.com} // namespace MipsISA 11312239Sandreas.sandberg@arm.com 11412239Sandreas.sandberg@arm.com#endif // __ARCH_MIPS_DECODER_HH__ 11512239Sandreas.sandberg@arm.com