decoder.isa revision 11723
111723Sar4jc@virginia.edu// -*- mode:c++ -*- 211723Sar4jc@virginia.edu 311723Sar4jc@virginia.edu// Copyright (c) 2015 RISC-V Foundation 411723Sar4jc@virginia.edu// Copyright (c) 2016 The University of Virginia 511723Sar4jc@virginia.edu// All rights reserved. 611723Sar4jc@virginia.edu// 711723Sar4jc@virginia.edu// Redistribution and use in source and binary forms, with or without 811723Sar4jc@virginia.edu// modification, are permitted provided that the following conditions are 911723Sar4jc@virginia.edu// met: redistributions of source code must retain the above copyright 1011723Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer; 1111723Sar4jc@virginia.edu// redistributions in binary form must reproduce the above copyright 1211723Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer in the 1311723Sar4jc@virginia.edu// documentation and/or other materials provided with the distribution; 1411723Sar4jc@virginia.edu// neither the name of the copyright holders nor the names of its 1511723Sar4jc@virginia.edu// contributors may be used to endorse or promote products derived from 1611723Sar4jc@virginia.edu// this software without specific prior written permission. 1711723Sar4jc@virginia.edu// 1811723Sar4jc@virginia.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1911723Sar4jc@virginia.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2011723Sar4jc@virginia.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2111723Sar4jc@virginia.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2211723Sar4jc@virginia.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2311723Sar4jc@virginia.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2411723Sar4jc@virginia.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2511723Sar4jc@virginia.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2611723Sar4jc@virginia.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2711723Sar4jc@virginia.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2811723Sar4jc@virginia.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2911723Sar4jc@virginia.edu// 3011723Sar4jc@virginia.edu// Authors: Alec Roelke 3111723Sar4jc@virginia.edu 3211723Sar4jc@virginia.edu//////////////////////////////////////////////////////////////////// 3311723Sar4jc@virginia.edu// 3411723Sar4jc@virginia.edu// The RISC-V ISA decoder 3511723Sar4jc@virginia.edu// 3611723Sar4jc@virginia.edu 3711723Sar4jc@virginia.edudecode OPCODE default Unknown::unknown() { 3811723Sar4jc@virginia.edu 0x03: decode FUNCT3 { 3911723Sar4jc@virginia.edu format Load { 4011723Sar4jc@virginia.edu 0x0: lb({{ 4111723Sar4jc@virginia.edu Rd_sd = Mem_sb; 4211723Sar4jc@virginia.edu }}); 4311723Sar4jc@virginia.edu 0x1: lh({{ 4411723Sar4jc@virginia.edu Rd_sd = Mem_sh; 4511723Sar4jc@virginia.edu }}); 4611723Sar4jc@virginia.edu 0x2: lw({{ 4711723Sar4jc@virginia.edu Rd_sd = Mem_sw; 4811723Sar4jc@virginia.edu }}); 4911723Sar4jc@virginia.edu 0x3: ld({{ 5011723Sar4jc@virginia.edu Rd_sd = Mem_sd; 5111723Sar4jc@virginia.edu }}); 5211723Sar4jc@virginia.edu 0x4: lbu({{ 5311723Sar4jc@virginia.edu Rd = Mem_ub; 5411723Sar4jc@virginia.edu }}); 5511723Sar4jc@virginia.edu 0x5: lhu({{ 5611723Sar4jc@virginia.edu Rd = Mem_uh; 5711723Sar4jc@virginia.edu }}); 5811723Sar4jc@virginia.edu 0x6: lwu({{ 5911723Sar4jc@virginia.edu Rd = Mem_uw; 6011723Sar4jc@virginia.edu }}); 6111723Sar4jc@virginia.edu } 6211723Sar4jc@virginia.edu } 6311723Sar4jc@virginia.edu 6411723Sar4jc@virginia.edu 0x0f: decode FUNCT3 { 6511723Sar4jc@virginia.edu format IOp { 6611723Sar4jc@virginia.edu 0x0: fence({{ 6711723Sar4jc@virginia.edu }}, IsNonSpeculative, IsMemBarrier, No_OpClass); 6811723Sar4jc@virginia.edu 0x1: fence_i({{ 6911723Sar4jc@virginia.edu }}, IsNonSpeculative, IsSerializeAfter, No_OpClass); 7011723Sar4jc@virginia.edu } 7111723Sar4jc@virginia.edu } 7211723Sar4jc@virginia.edu 7311723Sar4jc@virginia.edu 0x13: decode FUNCT3 { 7411723Sar4jc@virginia.edu format IOp { 7511723Sar4jc@virginia.edu 0x0: addi({{ 7611723Sar4jc@virginia.edu Rd_sd = Rs1_sd + imm; 7711723Sar4jc@virginia.edu }}); 7811723Sar4jc@virginia.edu 0x1: slli({{ 7911723Sar4jc@virginia.edu Rd = Rs1 << SHAMT6; 8011723Sar4jc@virginia.edu }}); 8111723Sar4jc@virginia.edu 0x2: slti({{ 8211723Sar4jc@virginia.edu Rd = (Rs1_sd < imm) ? 1 : 0; 8311723Sar4jc@virginia.edu }}); 8411723Sar4jc@virginia.edu 0x3: sltiu({{ 8511723Sar4jc@virginia.edu Rd = (Rs1 < (uint64_t)imm) ? 1 : 0; 8611723Sar4jc@virginia.edu }}); 8711723Sar4jc@virginia.edu 0x4: xori({{ 8811723Sar4jc@virginia.edu Rd = Rs1 ^ (uint64_t)imm; 8911723Sar4jc@virginia.edu }}); 9011723Sar4jc@virginia.edu 0x5: decode SRTYPE { 9111723Sar4jc@virginia.edu 0x0: srli({{ 9211723Sar4jc@virginia.edu Rd = Rs1 >> SHAMT6; 9311723Sar4jc@virginia.edu }}); 9411723Sar4jc@virginia.edu 0x1: srai({{ 9511723Sar4jc@virginia.edu Rd_sd = Rs1_sd >> SHAMT6; 9611723Sar4jc@virginia.edu }}); 9711723Sar4jc@virginia.edu } 9811723Sar4jc@virginia.edu 0x6: ori({{ 9911723Sar4jc@virginia.edu Rd = Rs1 | (uint64_t)imm; 10011723Sar4jc@virginia.edu }}); 10111723Sar4jc@virginia.edu 0x7: andi({{ 10211723Sar4jc@virginia.edu Rd = Rs1 & (uint64_t)imm; 10311723Sar4jc@virginia.edu }}); 10411723Sar4jc@virginia.edu } 10511723Sar4jc@virginia.edu } 10611723Sar4jc@virginia.edu 10711723Sar4jc@virginia.edu 0x17: UOp::auipc({{ 10811723Sar4jc@virginia.edu Rd = PC + imm; 10911723Sar4jc@virginia.edu }}); 11011723Sar4jc@virginia.edu 11111723Sar4jc@virginia.edu 0x1b: decode FUNCT3 { 11211723Sar4jc@virginia.edu format IOp { 11311723Sar4jc@virginia.edu 0x0: addiw({{ 11411723Sar4jc@virginia.edu Rd_sd = (int32_t)Rs1 + (int32_t)imm; 11511723Sar4jc@virginia.edu }}); 11611723Sar4jc@virginia.edu 0x1: slliw({{ 11711723Sar4jc@virginia.edu Rd_sd = Rs1_sw << SHAMT5; 11811723Sar4jc@virginia.edu }}); 11911723Sar4jc@virginia.edu 0x5: decode SRTYPE { 12011723Sar4jc@virginia.edu 0x0: srliw({{ 12111723Sar4jc@virginia.edu Rd = Rs1_uw >> SHAMT5; 12211723Sar4jc@virginia.edu }}); 12311723Sar4jc@virginia.edu 0x1: sraiw({{ 12411723Sar4jc@virginia.edu Rd_sd = Rs1_sw >> SHAMT5; 12511723Sar4jc@virginia.edu }}); 12611723Sar4jc@virginia.edu } 12711723Sar4jc@virginia.edu } 12811723Sar4jc@virginia.edu } 12911723Sar4jc@virginia.edu 13011723Sar4jc@virginia.edu 0x23: decode FUNCT3 { 13111723Sar4jc@virginia.edu format Store { 13211723Sar4jc@virginia.edu 0x0: sb({{ 13311723Sar4jc@virginia.edu Mem_ub = Rs2_ub; 13411723Sar4jc@virginia.edu }}); 13511723Sar4jc@virginia.edu 0x1: sh({{ 13611723Sar4jc@virginia.edu Mem_uh = Rs2_uh; 13711723Sar4jc@virginia.edu }}); 13811723Sar4jc@virginia.edu 0x2: sw({{ 13911723Sar4jc@virginia.edu Mem_uw = Rs2_uw; 14011723Sar4jc@virginia.edu }}); 14111723Sar4jc@virginia.edu 0x3: sd({{ 14211723Sar4jc@virginia.edu Mem_ud = Rs2_ud; 14311723Sar4jc@virginia.edu }}); 14411723Sar4jc@virginia.edu } 14511723Sar4jc@virginia.edu } 14611723Sar4jc@virginia.edu 14711723Sar4jc@virginia.edu 0x33: decode FUNCT3 { 14811723Sar4jc@virginia.edu format ROp { 14911723Sar4jc@virginia.edu 0x0: decode FUNCT7 { 15011723Sar4jc@virginia.edu 0x0: add({{ 15111723Sar4jc@virginia.edu Rd = Rs1_sd + Rs2_sd; 15211723Sar4jc@virginia.edu }}); 15311723Sar4jc@virginia.edu 0x20: sub({{ 15411723Sar4jc@virginia.edu Rd = Rs1_sd - Rs2_sd; 15511723Sar4jc@virginia.edu }}); 15611723Sar4jc@virginia.edu } 15711723Sar4jc@virginia.edu 0x1: decode FUNCT7 { 15811723Sar4jc@virginia.edu 0x0: sll({{ 15911723Sar4jc@virginia.edu Rd = Rs1 << Rs2<5:0>; 16011723Sar4jc@virginia.edu }}); 16111723Sar4jc@virginia.edu } 16211723Sar4jc@virginia.edu 0x2: decode FUNCT7 { 16311723Sar4jc@virginia.edu 0x0: slt({{ 16411723Sar4jc@virginia.edu Rd = (Rs1_sd < Rs2_sd) ? 1 : 0; 16511723Sar4jc@virginia.edu }}); 16611723Sar4jc@virginia.edu } 16711723Sar4jc@virginia.edu 0x3: decode FUNCT7 { 16811723Sar4jc@virginia.edu 0x0: sltu({{ 16911723Sar4jc@virginia.edu Rd = (Rs1 < Rs2) ? 1 : 0; 17011723Sar4jc@virginia.edu }}); 17111723Sar4jc@virginia.edu } 17211723Sar4jc@virginia.edu 0x4: decode FUNCT7 { 17311723Sar4jc@virginia.edu 0x0: xor({{ 17411723Sar4jc@virginia.edu Rd = Rs1 ^ Rs2; 17511723Sar4jc@virginia.edu }}); 17611723Sar4jc@virginia.edu } 17711723Sar4jc@virginia.edu 0x5: decode FUNCT7 { 17811723Sar4jc@virginia.edu 0x0: srl({{ 17911723Sar4jc@virginia.edu Rd = Rs1 >> Rs2<5:0>; 18011723Sar4jc@virginia.edu }}); 18111723Sar4jc@virginia.edu 0x20: sra({{ 18211723Sar4jc@virginia.edu Rd_sd = Rs1_sd >> Rs2<5:0>; 18311723Sar4jc@virginia.edu }}); 18411723Sar4jc@virginia.edu } 18511723Sar4jc@virginia.edu 0x6: decode FUNCT7 { 18611723Sar4jc@virginia.edu 0x0: or({{ 18711723Sar4jc@virginia.edu Rd = Rs1 | Rs2; 18811723Sar4jc@virginia.edu }}); 18911723Sar4jc@virginia.edu } 19011723Sar4jc@virginia.edu 0x7: decode FUNCT7 { 19111723Sar4jc@virginia.edu 0x0: and({{ 19211723Sar4jc@virginia.edu Rd = Rs1 & Rs2; 19311723Sar4jc@virginia.edu }}); 19411723Sar4jc@virginia.edu } 19511723Sar4jc@virginia.edu } 19611723Sar4jc@virginia.edu } 19711723Sar4jc@virginia.edu 19811723Sar4jc@virginia.edu 0x37: UOp::lui({{ 19911723Sar4jc@virginia.edu Rd = (uint64_t)imm; 20011723Sar4jc@virginia.edu }}); 20111723Sar4jc@virginia.edu 20211723Sar4jc@virginia.edu 0x3b: decode FUNCT3 { 20311723Sar4jc@virginia.edu format ROp { 20411723Sar4jc@virginia.edu 0x0: decode FUNCT7 { 20511723Sar4jc@virginia.edu 0x0: addw({{ 20611723Sar4jc@virginia.edu Rd_sd = Rs1_sw + Rs2_sw; 20711723Sar4jc@virginia.edu }}); 20811723Sar4jc@virginia.edu 0x20: subw({{ 20911723Sar4jc@virginia.edu Rd_sd = Rs1_sw - Rs2_sw; 21011723Sar4jc@virginia.edu }}); 21111723Sar4jc@virginia.edu } 21211723Sar4jc@virginia.edu 0x1: sllw({{ 21311723Sar4jc@virginia.edu Rd_sd = Rs1_sw << Rs2<4:0>; 21411723Sar4jc@virginia.edu }}); 21511723Sar4jc@virginia.edu 0x5: decode FUNCT7 { 21611723Sar4jc@virginia.edu 0x0: srlw({{ 21711723Sar4jc@virginia.edu Rd_uw = Rs1_uw >> Rs2<4:0>; 21811723Sar4jc@virginia.edu }}); 21911723Sar4jc@virginia.edu 0x20: sraw({{ 22011723Sar4jc@virginia.edu Rd_sd = Rs1_sw >> Rs2<4:0>; 22111723Sar4jc@virginia.edu }}); 22211723Sar4jc@virginia.edu } 22311723Sar4jc@virginia.edu } 22411723Sar4jc@virginia.edu } 22511723Sar4jc@virginia.edu 22611723Sar4jc@virginia.edu 0x63: decode FUNCT3 { 22711723Sar4jc@virginia.edu format SBOp { 22811723Sar4jc@virginia.edu 0x0: beq({{ 22911723Sar4jc@virginia.edu if (Rs1 == Rs2) { 23011723Sar4jc@virginia.edu NPC = PC + imm; 23111723Sar4jc@virginia.edu } else { 23211723Sar4jc@virginia.edu NPC = NPC; 23311723Sar4jc@virginia.edu } 23411723Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 23511723Sar4jc@virginia.edu 0x1: bne({{ 23611723Sar4jc@virginia.edu if (Rs1 != Rs2) { 23711723Sar4jc@virginia.edu NPC = PC + imm; 23811723Sar4jc@virginia.edu } else { 23911723Sar4jc@virginia.edu NPC = NPC; 24011723Sar4jc@virginia.edu } 24111723Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 24211723Sar4jc@virginia.edu 0x4: blt({{ 24311723Sar4jc@virginia.edu if (Rs1_sd < Rs2_sd) { 24411723Sar4jc@virginia.edu NPC = PC + imm; 24511723Sar4jc@virginia.edu } else { 24611723Sar4jc@virginia.edu NPC = NPC; 24711723Sar4jc@virginia.edu } 24811723Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 24911723Sar4jc@virginia.edu 0x5: bge({{ 25011723Sar4jc@virginia.edu if (Rs1_sd >= Rs2_sd) { 25111723Sar4jc@virginia.edu NPC = PC + imm; 25211723Sar4jc@virginia.edu } else { 25311723Sar4jc@virginia.edu NPC = NPC; 25411723Sar4jc@virginia.edu } 25511723Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 25611723Sar4jc@virginia.edu 0x6: bltu({{ 25711723Sar4jc@virginia.edu if (Rs1 < Rs2) { 25811723Sar4jc@virginia.edu NPC = PC + imm; 25911723Sar4jc@virginia.edu } else { 26011723Sar4jc@virginia.edu NPC = NPC; 26111723Sar4jc@virginia.edu } 26211723Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 26311723Sar4jc@virginia.edu 0x7: bgeu({{ 26411723Sar4jc@virginia.edu if (Rs1 >= Rs2) { 26511723Sar4jc@virginia.edu NPC = PC + imm; 26611723Sar4jc@virginia.edu } else { 26711723Sar4jc@virginia.edu NPC = NPC; 26811723Sar4jc@virginia.edu } 26911723Sar4jc@virginia.edu }}, IsDirectControl, IsCondControl); 27011723Sar4jc@virginia.edu } 27111723Sar4jc@virginia.edu } 27211723Sar4jc@virginia.edu 27311723Sar4jc@virginia.edu 0x67: decode FUNCT3 { 27411723Sar4jc@virginia.edu 0x0: Jump::jalr({{ 27511723Sar4jc@virginia.edu Rd = NPC; 27611723Sar4jc@virginia.edu NPC = (imm + Rs1) & (~0x1); 27711723Sar4jc@virginia.edu }}, IsIndirectControl, IsUncondControl, IsCall); 27811723Sar4jc@virginia.edu } 27911723Sar4jc@virginia.edu 28011723Sar4jc@virginia.edu 0x6f: UJOp::jal({{ 28111723Sar4jc@virginia.edu Rd = NPC; 28211723Sar4jc@virginia.edu NPC = PC + imm; 28311723Sar4jc@virginia.edu }}, IsDirectControl, IsUncondControl, IsCall); 28411723Sar4jc@virginia.edu 28511723Sar4jc@virginia.edu 0x73: decode FUNCT3 { 28611723Sar4jc@virginia.edu format IOp { 28711723Sar4jc@virginia.edu 0x0: decode FUNCT12 { 28811723Sar4jc@virginia.edu 0x0: ecall({{ 28911723Sar4jc@virginia.edu fault = std::make_shared<SyscallFault>(); 29011723Sar4jc@virginia.edu }}, IsSerializeAfter, IsNonSpeculative, IsSyscall, No_OpClass); 29111723Sar4jc@virginia.edu 0x1: ebreak({{ 29211723Sar4jc@virginia.edu fault = std::make_shared<BreakpointFault>(); 29311723Sar4jc@virginia.edu }}, IsSerializeAfter, IsNonSpeculative, No_OpClass); 29411723Sar4jc@virginia.edu 0x100: eret({{ 29511723Sar4jc@virginia.edu fault = std::make_shared<UnimplementedFault>("eret"); 29611723Sar4jc@virginia.edu }}, No_OpClass); 29711723Sar4jc@virginia.edu } 29811723Sar4jc@virginia.edu 0x1: csrrw({{ 29911723Sar4jc@virginia.edu Rd = xc->readMiscReg(FUNCT12); 30011723Sar4jc@virginia.edu xc->setMiscReg(FUNCT12, Rs1); 30111723Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 30211723Sar4jc@virginia.edu 0x2: csrrs({{ 30311723Sar4jc@virginia.edu Rd = xc->readMiscReg(FUNCT12); 30411723Sar4jc@virginia.edu if (Rs1 != 0) { 30511723Sar4jc@virginia.edu xc->setMiscReg(FUNCT12, Rd | Rs1); 30611723Sar4jc@virginia.edu } 30711723Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 30811723Sar4jc@virginia.edu 0x3: csrrc({{ 30911723Sar4jc@virginia.edu Rd = xc->readMiscReg(FUNCT12); 31011723Sar4jc@virginia.edu if (Rs1 != 0) { 31111723Sar4jc@virginia.edu xc->setMiscReg(FUNCT12, Rd & ~Rs1); 31211723Sar4jc@virginia.edu } 31311723Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 31411723Sar4jc@virginia.edu 0x5: csrrwi({{ 31511723Sar4jc@virginia.edu Rd = xc->readMiscReg(FUNCT12); 31611723Sar4jc@virginia.edu xc->setMiscReg(FUNCT12, ZIMM); 31711723Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 31811723Sar4jc@virginia.edu 0x6: csrrsi({{ 31911723Sar4jc@virginia.edu Rd = xc->readMiscReg(FUNCT12); 32011723Sar4jc@virginia.edu if (ZIMM != 0) { 32111723Sar4jc@virginia.edu xc->setMiscReg(FUNCT12, Rd | ZIMM); 32211723Sar4jc@virginia.edu } 32311723Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 32411723Sar4jc@virginia.edu 0x7: csrrci({{ 32511723Sar4jc@virginia.edu Rd = xc->readMiscReg(FUNCT12); 32611723Sar4jc@virginia.edu if (ZIMM != 0) { 32711723Sar4jc@virginia.edu xc->setMiscReg(FUNCT12, Rd & ~ZIMM); 32811723Sar4jc@virginia.edu } 32911723Sar4jc@virginia.edu }}, IsNonSpeculative, No_OpClass); 33011723Sar4jc@virginia.edu } 33111723Sar4jc@virginia.edu } 33211723Sar4jc@virginia.edu} 333