decoder.hh revision 9024
19020Sgblack@eecs.umich.edu/* 29020Sgblack@eecs.umich.edu * Copyright (c) 2012 Google 39020Sgblack@eecs.umich.edu * All rights reserved. 49020Sgblack@eecs.umich.edu * 59020Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 69020Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 79020Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 89020Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 99020Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 109020Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 119020Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 129020Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 139020Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 149020Sgblack@eecs.umich.edu * this software without specific prior written permission. 159020Sgblack@eecs.umich.edu * 169020Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179020Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189020Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199020Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209020Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219020Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229020Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239020Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249020Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259020Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269020Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279020Sgblack@eecs.umich.edu * 289020Sgblack@eecs.umich.edu * Authors: Gabe Black 299020Sgblack@eecs.umich.edu */ 309020Sgblack@eecs.umich.edu 319020Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_DECODER_HH__ 329020Sgblack@eecs.umich.edu#define __ARCH_ARM_DECODER_HH__ 339020Sgblack@eecs.umich.edu 349023Sgblack@eecs.umich.edu#include <cassert> 359023Sgblack@eecs.umich.edu 369023Sgblack@eecs.umich.edu#include "arch/arm/miscregs.hh" 379023Sgblack@eecs.umich.edu#include "arch/arm/types.hh" 389024Sgblack@eecs.umich.edu#include "arch/generic/decode_cache.hh" 399023Sgblack@eecs.umich.edu#include "base/types.hh" 409024Sgblack@eecs.umich.edu#include "cpu/static_inst.hh" 419023Sgblack@eecs.umich.edu 429023Sgblack@eecs.umich.educlass ThreadContext; 439020Sgblack@eecs.umich.edu 449020Sgblack@eecs.umich.edunamespace ArmISA 459020Sgblack@eecs.umich.edu{ 469020Sgblack@eecs.umich.edu 479022Sgblack@eecs.umich.educlass Decoder 489022Sgblack@eecs.umich.edu{ 499022Sgblack@eecs.umich.edu protected: 509023Sgblack@eecs.umich.edu ThreadContext * tc; 519023Sgblack@eecs.umich.edu //The extended machine instruction being generated 529023Sgblack@eecs.umich.edu ExtMachInst emi; 539023Sgblack@eecs.umich.edu MachInst data; 549023Sgblack@eecs.umich.edu bool bigThumb; 559023Sgblack@eecs.umich.edu bool instDone; 569023Sgblack@eecs.umich.edu bool outOfBytes; 579023Sgblack@eecs.umich.edu int offset; 589023Sgblack@eecs.umich.edu bool foundIt; 599023Sgblack@eecs.umich.edu ITSTATE itBits; 609023Sgblack@eecs.umich.edu 619023Sgblack@eecs.umich.edu public: 629023Sgblack@eecs.umich.edu void reset() 639023Sgblack@eecs.umich.edu { 649023Sgblack@eecs.umich.edu bigThumb = false; 659023Sgblack@eecs.umich.edu offset = 0; 669023Sgblack@eecs.umich.edu emi = 0; 679023Sgblack@eecs.umich.edu instDone = false; 689023Sgblack@eecs.umich.edu outOfBytes = true; 699023Sgblack@eecs.umich.edu foundIt = false; 709023Sgblack@eecs.umich.edu } 719023Sgblack@eecs.umich.edu 729023Sgblack@eecs.umich.edu Decoder(ThreadContext * _tc) : tc(_tc), data(0) 739023Sgblack@eecs.umich.edu { 749023Sgblack@eecs.umich.edu reset(); 759023Sgblack@eecs.umich.edu } 769023Sgblack@eecs.umich.edu 779023Sgblack@eecs.umich.edu ThreadContext * getTC() 789023Sgblack@eecs.umich.edu { 799023Sgblack@eecs.umich.edu return tc; 809023Sgblack@eecs.umich.edu } 819023Sgblack@eecs.umich.edu 829023Sgblack@eecs.umich.edu void 839023Sgblack@eecs.umich.edu setTC(ThreadContext * _tc) 849023Sgblack@eecs.umich.edu { 859023Sgblack@eecs.umich.edu tc = _tc; 869023Sgblack@eecs.umich.edu } 879023Sgblack@eecs.umich.edu 889023Sgblack@eecs.umich.edu void process(); 899023Sgblack@eecs.umich.edu 909023Sgblack@eecs.umich.edu //Use this to give data to the decoder. This should be used 919023Sgblack@eecs.umich.edu //when there is control flow. 929023Sgblack@eecs.umich.edu void moreBytes(const PCState &pc, Addr fetchPC, MachInst inst); 939023Sgblack@eecs.umich.edu 949023Sgblack@eecs.umich.edu //Use this to give data to the decoder. This should be used 959023Sgblack@eecs.umich.edu //when instructions are executed in order. 969023Sgblack@eecs.umich.edu void moreBytes(MachInst machInst) 979023Sgblack@eecs.umich.edu { 989023Sgblack@eecs.umich.edu moreBytes(0, 0, machInst); 999023Sgblack@eecs.umich.edu } 1009023Sgblack@eecs.umich.edu 1019023Sgblack@eecs.umich.edu inline void consumeBytes(int numBytes) 1029023Sgblack@eecs.umich.edu { 1039023Sgblack@eecs.umich.edu offset += numBytes; 1049023Sgblack@eecs.umich.edu assert(offset <= sizeof(MachInst)); 1059023Sgblack@eecs.umich.edu if (offset == sizeof(MachInst)) 1069023Sgblack@eecs.umich.edu outOfBytes = true; 1079023Sgblack@eecs.umich.edu } 1089023Sgblack@eecs.umich.edu 1099023Sgblack@eecs.umich.edu bool needMoreBytes() const 1109023Sgblack@eecs.umich.edu { 1119023Sgblack@eecs.umich.edu return outOfBytes; 1129023Sgblack@eecs.umich.edu } 1139023Sgblack@eecs.umich.edu 1149023Sgblack@eecs.umich.edu bool instReady() const 1159023Sgblack@eecs.umich.edu { 1169023Sgblack@eecs.umich.edu return instDone; 1179023Sgblack@eecs.umich.edu } 1189023Sgblack@eecs.umich.edu 1199023Sgblack@eecs.umich.edu int getInstSize() const 1209023Sgblack@eecs.umich.edu { 1219023Sgblack@eecs.umich.edu return (!emi.thumb || emi.bigThumb) ? 4 : 2; 1229023Sgblack@eecs.umich.edu } 1239023Sgblack@eecs.umich.edu 1249023Sgblack@eecs.umich.edu protected: 1259022Sgblack@eecs.umich.edu /// A cache of decoded instruction objects. 1269024Sgblack@eecs.umich.edu static GenericISA::BasicDecodeCache defaultCache; 1279022Sgblack@eecs.umich.edu 1289022Sgblack@eecs.umich.edu public: 1299022Sgblack@eecs.umich.edu StaticInstPtr decodeInst(ExtMachInst mach_inst); 1309022Sgblack@eecs.umich.edu 1319022Sgblack@eecs.umich.edu /// Decode a machine instruction. 1329022Sgblack@eecs.umich.edu /// @param mach_inst The binary instruction to decode. 1339022Sgblack@eecs.umich.edu /// @retval A pointer to the corresponding StaticInst object. 1349022Sgblack@eecs.umich.edu StaticInstPtr 1359022Sgblack@eecs.umich.edu decode(ExtMachInst mach_inst, Addr addr) 1369022Sgblack@eecs.umich.edu { 1379022Sgblack@eecs.umich.edu return defaultCache.decode(this, mach_inst, addr); 1389022Sgblack@eecs.umich.edu } 1399023Sgblack@eecs.umich.edu 1409023Sgblack@eecs.umich.edu StaticInstPtr 1419023Sgblack@eecs.umich.edu decode(ArmISA::PCState &nextPC) 1429023Sgblack@eecs.umich.edu { 1439023Sgblack@eecs.umich.edu if (!instDone) 1449023Sgblack@eecs.umich.edu return NULL; 1459023Sgblack@eecs.umich.edu 1469023Sgblack@eecs.umich.edu assert(instDone); 1479023Sgblack@eecs.umich.edu ExtMachInst thisEmi = emi; 1489023Sgblack@eecs.umich.edu nextPC.npc(nextPC.pc() + getInstSize()); 1499023Sgblack@eecs.umich.edu if (foundIt) 1509023Sgblack@eecs.umich.edu nextPC.nextItstate(itBits); 1519023Sgblack@eecs.umich.edu thisEmi.itstate = nextPC.itstate(); 1529023Sgblack@eecs.umich.edu nextPC.size(getInstSize()); 1539023Sgblack@eecs.umich.edu emi = 0; 1549023Sgblack@eecs.umich.edu instDone = false; 1559023Sgblack@eecs.umich.edu foundIt = false; 1569023Sgblack@eecs.umich.edu return decode(thisEmi, nextPC.instAddr()); 1579023Sgblack@eecs.umich.edu } 1589022Sgblack@eecs.umich.edu}; 1599020Sgblack@eecs.umich.edu 1609020Sgblack@eecs.umich.edu} // namespace ArmISA 1619020Sgblack@eecs.umich.edu 1629020Sgblack@eecs.umich.edu#endif // __ARCH_ARM_DECODER_HH__ 163