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