decoder.cc revision 12120:133620bfc43b
1/* 2 * Copyright (c) 2012 Google 3 * Copyright (c) The University of Virginia 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Gabe Black 30 * Alec Roelke 31 */ 32 33#include "arch/riscv/decoder.hh" 34#include "arch/riscv/types.hh" 35#include "debug/Decode.hh" 36 37namespace RiscvISA 38{ 39 40void 41Decoder::moreBytes(const PCState &pc, Addr fetchPC, MachInst inst) 42{ 43 DPRINTF(Decode, "Getting bytes 0x%08x from address %#x\n", 44 inst, pc.pc()); 45 46 bool aligned = pc.pc() % sizeof(MachInst) == 0; 47 if (mid) { 48 assert(!aligned); 49 emi |= (inst & 0xFFFF) << 16; 50 instDone = true; 51 } else { 52 MachInst instChunk = aligned ? inst & 0xFFFF : 53 (inst & 0xFFFF0000) >> 16; 54 if (aligned) { 55 emi = (inst & 0x3) < 0x3 ? instChunk : inst; 56 instDone = true; 57 } else { 58 emi = instChunk; 59 instDone = (instChunk & 0x3) < 0x3; 60 } 61 } 62 mid = !instDone; 63} 64 65StaticInstPtr 66Decoder::decode(ExtMachInst mach_inst, Addr addr) 67{ 68 DPRINTF(Decode, "Decoding instruction 0x%08x at address %#x\n", 69 mach_inst, addr); 70 if (instMap.find(mach_inst) != instMap.end()) 71 return instMap[mach_inst]; 72 else { 73 StaticInstPtr si = decodeInst(mach_inst); 74 instMap[mach_inst] = si; 75 return si; 76 } 77} 78 79StaticInstPtr 80Decoder::decode(RiscvISA::PCState &nextPC) 81{ 82 if (!instDone) 83 return nullptr; 84 instDone = false; 85 86 if ((emi & 0x3) < 0x3) { 87 nextPC.compressed(true); 88 nextPC.npc(nextPC.pc() + sizeof(MachInst)/2); 89 } else { 90 nextPC.compressed(false); 91 nextPC.npc(nextPC.pc() + sizeof(MachInst)); 92 } 93 94 return decode(emi, nextPC.instAddr()); 95} 96 97} 98