111723Sar4jc@virginia.edu/* 211723Sar4jc@virginia.edu * Copyright (c) 2012 Google 312120Sar4jc@virginia.edu * Copyright (c) The University of Virginia 411723Sar4jc@virginia.edu * All rights reserved. 511723Sar4jc@virginia.edu * 611723Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without 711723Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are 811723Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright 911723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer; 1011723Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright 1111723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the 1211723Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution; 1311723Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its 1411723Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from 1511723Sar4jc@virginia.edu * this software without specific prior written permission. 1611723Sar4jc@virginia.edu * 1711723Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1811723Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1911723Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2011723Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2111723Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2211723Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2311723Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2411723Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2511723Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2611723Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2711723Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2811723Sar4jc@virginia.edu * 2911723Sar4jc@virginia.edu * Authors: Gabe Black 3012120Sar4jc@virginia.edu * Alec Roelke 3111723Sar4jc@virginia.edu */ 3211723Sar4jc@virginia.edu 3311723Sar4jc@virginia.edu#include "arch/riscv/decoder.hh" 3412120Sar4jc@virginia.edu#include "arch/riscv/types.hh" 3512120Sar4jc@virginia.edu#include "debug/Decode.hh" 3611723Sar4jc@virginia.edu 3711723Sar4jc@virginia.edunamespace RiscvISA 3811723Sar4jc@virginia.edu{ 3911723Sar4jc@virginia.edu 4012136Sar4jc@virginia.edustatic const MachInst LowerBitMask = (1 << sizeof(MachInst) * 4) - 1; 4112136Sar4jc@virginia.edustatic const MachInst UpperBitMask = LowerBitMask << sizeof(MachInst) * 4; 4212136Sar4jc@virginia.edu 4312136Sar4jc@virginia.eduvoid Decoder::reset() 4412136Sar4jc@virginia.edu{ 4512136Sar4jc@virginia.edu aligned = true; 4612136Sar4jc@virginia.edu mid = false; 4712136Sar4jc@virginia.edu more = true; 4812407Sgabeblack@google.com emi = 0; 4912136Sar4jc@virginia.edu instDone = false; 5012136Sar4jc@virginia.edu} 5112136Sar4jc@virginia.edu 5212120Sar4jc@virginia.eduvoid 5312120Sar4jc@virginia.eduDecoder::moreBytes(const PCState &pc, Addr fetchPC, MachInst inst) 5412120Sar4jc@virginia.edu{ 5512136Sar4jc@virginia.edu DPRINTF(Decode, "Requesting bytes 0x%08x from address %#x\n", inst, 5612136Sar4jc@virginia.edu fetchPC); 5712120Sar4jc@virginia.edu 5812120Sar4jc@virginia.edu bool aligned = pc.pc() % sizeof(MachInst) == 0; 5912136Sar4jc@virginia.edu if (aligned) { 6012136Sar4jc@virginia.edu emi = inst; 6112136Sar4jc@virginia.edu if (compressed(emi)) 6212136Sar4jc@virginia.edu emi &= LowerBitMask; 6312136Sar4jc@virginia.edu more = !compressed(emi); 6412120Sar4jc@virginia.edu instDone = true; 6512120Sar4jc@virginia.edu } else { 6612136Sar4jc@virginia.edu if (mid) { 6712136Sar4jc@virginia.edu assert((emi & UpperBitMask) == 0); 6812136Sar4jc@virginia.edu emi |= (inst & LowerBitMask) << sizeof(MachInst)*4; 6912136Sar4jc@virginia.edu mid = false; 7012136Sar4jc@virginia.edu more = false; 7112120Sar4jc@virginia.edu instDone = true; 7212120Sar4jc@virginia.edu } else { 7312136Sar4jc@virginia.edu emi = (inst & UpperBitMask) >> sizeof(MachInst)*4; 7412136Sar4jc@virginia.edu mid = !compressed(emi); 7512136Sar4jc@virginia.edu more = true; 7612136Sar4jc@virginia.edu instDone = compressed(emi); 7712120Sar4jc@virginia.edu } 7812120Sar4jc@virginia.edu } 7912120Sar4jc@virginia.edu} 8012120Sar4jc@virginia.edu 8112120Sar4jc@virginia.eduStaticInstPtr 8212120Sar4jc@virginia.eduDecoder::decode(ExtMachInst mach_inst, Addr addr) 8312120Sar4jc@virginia.edu{ 8412120Sar4jc@virginia.edu DPRINTF(Decode, "Decoding instruction 0x%08x at address %#x\n", 8512120Sar4jc@virginia.edu mach_inst, addr); 8612120Sar4jc@virginia.edu if (instMap.find(mach_inst) != instMap.end()) 8712120Sar4jc@virginia.edu return instMap[mach_inst]; 8812120Sar4jc@virginia.edu else { 8912120Sar4jc@virginia.edu StaticInstPtr si = decodeInst(mach_inst); 9012120Sar4jc@virginia.edu instMap[mach_inst] = si; 9112120Sar4jc@virginia.edu return si; 9212120Sar4jc@virginia.edu } 9312120Sar4jc@virginia.edu} 9412120Sar4jc@virginia.edu 9512120Sar4jc@virginia.eduStaticInstPtr 9612120Sar4jc@virginia.eduDecoder::decode(RiscvISA::PCState &nextPC) 9712120Sar4jc@virginia.edu{ 9812120Sar4jc@virginia.edu if (!instDone) 9912120Sar4jc@virginia.edu return nullptr; 10012120Sar4jc@virginia.edu instDone = false; 10112120Sar4jc@virginia.edu 10212136Sar4jc@virginia.edu if (compressed(emi)) { 10312136Sar4jc@virginia.edu nextPC.npc(nextPC.instAddr() + sizeof(MachInst) / 2); 10412120Sar4jc@virginia.edu } else { 10512136Sar4jc@virginia.edu nextPC.npc(nextPC.instAddr() + sizeof(MachInst)); 10612120Sar4jc@virginia.edu } 10712120Sar4jc@virginia.edu 10812120Sar4jc@virginia.edu return decode(emi, nextPC.instAddr()); 10912120Sar4jc@virginia.edu} 11011723Sar4jc@virginia.edu 11111723Sar4jc@virginia.edu} 112