blob: 18921e7f4f85196c9ce612a8ddef8e26fc06c903 [file]
// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This file refactors the original "C" extension into the new set of Zc*
// extensions. These should be preferred for new simulator targets.
// Non floating point compact instructions from "C".
slot riscv_zca32 {
default size = 2;
includes {
#include "riscv/riscv_i_instructions.h"
}
opcodes {
clwsp{(: x2, I_ci_uimm6x4 : ), (: : rd)},
resources:{next_pc,x2 : rd[0..]},
disasm: "lw", "%rd, %I_ci_uimm6x4(%x2)",
semfunc: "&RV32::RiscVILw", "&RV32::RiscVILwChild";
cswsp{: x2, I_css_uimm6x4, crs2 : },
resources: {next_pc,x2, crs2},
disasm: "sw", "%crs2, %I_css_uimm6x4(%x2)",
semfunc: "&RV32::RiscVISw";
clw{(: c3rs1, I_cl_uimm5x4 : ), (: : c3rd)},
resources: {next_pc,c3rs1 : c3rd[0..]},
disasm: "lw", "%c3rd, %I_cl_uimm5x4(%c3rs1)",
semfunc: "&RV32::RiscVILw", "&RV32::RiscVILwChild";
csw{: c3rs1, I_cl_uimm5x4, c3rs2 : },
resources: {next_pc,c3rs1, c3rs2},
disasm: "sw", "%c3rs2, %I_cl_uimm5x4(%c3rs1)",
semfunc: "&RV32::RiscVISw";
cj{: I_cj_imm11, x0 : next_pc, x0},
resources: {next_pc,x0 : next_pc[0..], x0[0..]},
disasm: "j", "0x%(@+I_cj_imm11:08x)",
semfunc: "&RV32::RiscVIJal";
cjal{: I_cj_imm11, x0 : next_pc, x1},
resources: {next_pc,x0 : next_pc[0..], x1[0..]},
disasm: "jal", "0x%(@+I_cj_imm11:08x)",
semfunc: "&RV32::RiscVIJal";
cjr{: crs1, x0 : next_pc, x0},
resources: {next_pc,crs1, x0 : next_pc[0..], x0[0..]},
disasm: "jr", "%crs1",
semfunc: "&RV32::RiscVIJalr";
cjalr{: crs1, x0 : next_pc, x1},
resources: {next_pc,crs1, x0 : next_pc[0..], x1[0..]},
disasm: "jalr", "%crs1",
semfunc: "&RV32::RiscVIJalr";
cbeqz{: c3rs1, x0, I_cb_imm8 : next_pc},
resources: {next_pc,c3rs1, x0 : next_pc[0..]},
disasm: "beqz", "%c3rs1, 0x%(@+I_cb_imm8:08x)",
semfunc: "&RV32::RiscVIBeq";
cbnez{: c3rs1, x0, I_cb_imm8 : next_pc},
resources: {next_pc,c3rs1, x0 : next_pc[0..]},
disasm: "bnez", "%c3rs1, 0x%(@+I_cb_imm8:08x)",
semfunc: "&RV32::RiscVIBne";
cli{: x0, I_ci_imm6 : rd},
resources: {next_pc,x0 : rd[0..]},
disasm: "li", "%rd, %I_ci_imm6",
semfunc: "&RV32::RiscVIAdd";
clui{: I_ci_imm6_12 : rd},
resources: {next_pc : rd[0..]},
disasm: "lui", "%rd, 0x%(I_ci_imm6_12:x)",
semfunc: "&RV32::RiscVILui";
caddi{: rd, I_ci_imm6 : rd},
resources: {next_pc, rd : rd[0..]},
disasm: "addi", "%rd, %rd, %I_ci_imm6",
semfunc: "&RV32::RiscVIAdd";
caddi16sp{: x2, I_ci_imm6x16 : x2},
resources: {next_pc, x2 : x2[0..]},
disasm: "addi", "%x2, %x2, %(I_ci_imm6x16:d)",
semfunc: "&RV32::RiscVIAdd";
caddi4spn{: x2, I_ciw_uimm8x4 : c3rd},
resources: {next_pc, x2 : c3rd[0..]},
disasm: "addi", "%c3rd, %x2, %I_ciw_uimm8x4",
semfunc: "&RV32::RiscVIAdd";
cslli{: rd, I_ci_uimm6 : rd},
resources: {next_pc, rd : rd[0..]},
disasm: "slli", "%rd, %rd, 0x%(I_ci_uimm6:x)",
semfunc: "&RV32::RiscVISll";
csrli{: c3rs1, I_ci_uimm6 : c3rs1},
resources: {next_pc, c3rs1 : c3rs1[0..]},
disasm: "srli", "%c3rs1, %c3rs1, 0x%(I_ci_uimm6:x)",
semfunc: "&RV32::RiscVISrl";
csrai{: c3rs1, I_ci_uimm6 : c3rs1},
resources: {next_pc, c3rs1 : c3rs1[0..]},
disasm: "srai", "%c3rs1, %c3rs1, 0x%(I_ci_uimm6:x)",
semfunc: "&RV32::RiscVISra";
candi{: c3rs1, I_ci_imm6 : c3rs1},
resources: {next_pc, c3rs1 : c3rs1[0..]},
disasm: "andi", "%c3rs1, %c3rs1, %I_ci_imm6",
semfunc: "&RV32::RiscVIAnd";
cmv{: crs2 , x0: crd},
resources: {next_pc, crs2, x0 : crd[0..]},
disasm: "mv", "%crd, %crs2",
semfunc: "&RV32::RiscVIAdd";
cadd{: crs2, crd: crd},
resources: {next_pc, crs2, crd : crd[0..]},
disasm: "add", "%crd, %crd, %crs2",
semfunc: "&RV32::RiscVIAdd";
cand{: c3rs1, c3rs2 : c3rs1},
resources: {next_pc, c3rs1, c3rs2 : c3rs1[0..]},
disasm: "and", "%c3rs1, %c3rs1, %c3rs2",
semfunc: "&RV32::RiscVIAnd";
cor{: c3rs1, c3rs2 : c3rs1},
resources: {next_pc, c3rs1, c3rs2 : c3rs1[0..]},
disasm: "or", "%c3rs1, %c3rs1, %c3rs2",
semfunc: "&RV32::RiscVIOr";
cxor{: c3rs1, c3rs2 : c3rs1},
resources: {next_pc, c3rs1, c3rs2 : c3rs1[0..]},
disasm: "xor", "%c3rs1, %c3rs1, %c3rs2",
semfunc: "&RV32::RiscVIXor";
csub{: c3rs1, c3rs2 : c3rs1},
resources: {next_pc, c3rs1, c3rs2 : c3rs1[0..]},
disasm: "sub", "%c3rs1, %c3rs1, %c3rs2",
semfunc: "&RV32::RiscVISub";
cnop{},
disasm: "nop",
resources: {next_pc},
semfunc: "&RiscVINop";
cebreak{},
disasm: "ebreak",
resources: {next_pc},
semfunc: "&RiscVIEbreak";
}
}
slot riscv_zca64 : riscv_zca32 {
includes {
#include "riscv/riscv_i_instructions.h"
}
default size = 2;
opcodes {
clwsp = override, semfunc: "&RV64::RiscVILw", "&RV64::RiscVILwChild";
cswsp = override, semfunc: "&RV64::RiscVISw";
clw = override, semfunc: "&RV64::RiscVILw", "&RV64::RiscVILwChild";
csw = override, semfunc: "&RV64::RiscVISw";
cj = override, semfunc: "&RV64::RiscVIJal";
cjal = override, semfunc: "&RV64::RiscVIJal";
cjr = override, semfunc: "&RV64::RiscVIJalr";
cjalr = override, semfunc: "&RV64::RiscVIJalr";
cbeqz = override, semfunc: "&RV64::RiscVIBeq";
cbnez = override, semfunc: "&RV64::RiscVIBne";
cli = override, semfunc: "&RV64::RiscVIAdd";
clui = override, semfunc: "&RV64::RiscVILui";
caddi = override, semfunc: "&RV64::RiscVIAdd";
caddi16sp = override, semfunc: "&RV64::RiscVIAdd";
caddi4spn = override, semfunc: "&RV64::RiscVIAdd";
cslli = override, semfunc: "&RV64::RiscVISll";
csrli = override, semfunc: "&RV64::RiscVISrl";
csrai = override, semfunc: "&RV64::RiscVISra";
candi = override, semfunc: "&RV64::RiscVIAnd";
cmv = override, semfunc: "&RV64::RiscVIAdd";
cadd = override, semfunc: "&RV64::RiscVIAdd";
cand = override, semfunc: "&RV64::RiscVIAnd";
cor = override, semfunc: "&RV64::RiscVIOr";
cxor = override, semfunc: "&RV64::RiscVIXor";
csub = override, semfunc: "&RV64::RiscVISub";
}
}
slot riscv_zcf32 {
includes {
#include "riscv/riscv_i_instructions.h"
}
default size = 2;
opcodes {
cflwsp{(: x2, I_ci_uimm6x4 : ), (: : frd)},
resources:{next_pc, x2 : frd[0..]},
disasm: "flw", "%frd, %I_ci_uimm6x4(%x2)",
semfunc: "&RV32::RiscVILw", "&RV32::RiscVILwChild";
cfswsp{: x2, I_css_uimm6x4, cfrs2 : },
resources: {next_pc, x2, cfrs2},
disasm: "fsw", "%cfrs2, %I_css_uimm6x4(%x2)",
semfunc: "&RV32::RiscVISw";
cflw{(: c3rs1, I_cl_uimm5x4 : ), (: : c3frd)},
resources: {next_pc, c3rs1 : c3frd[0..]},
disasm: "flw", "%c3frd, %I_cl_uimm5x4(%c3rs1)",
semfunc: "&RV32::RiscVILw", "&RV32::RiscVILwChild";
cfsw{: c3rs1, I_cl_uimm5x4, c3frs2 : },
resources: {next_pc, c3rs1, c3frs2},
disasm: "fsw", "%c3frs2, %I_cl_uimm5x4(%c3rs1)",
semfunc: "&RV32::RiscVISw";
}
}
slot riscv_zcf64 {
includes {
#include "riscv/riscv_i_instructions.h"
}
default size = 2;
opcodes {
cflwsp = override, semfunc: "&RV64::RiscVILw", "&RV64::RiscVILwChild";
cfswsp = override, semfunc: "&RV64::RiscVISw";
cflw = override, semfunc: "&RV64::RiscVILw", "&RV64::RiscVILwChild";
cfsw = override, semfunc: "&RV64::RiscVISw";
}
}
slot riscv_zcd32 {
includes {
#include "riscv/riscv_i_instructions.h"
}
default size = 2;
opcodes {
cfldsp{(: x2, I_ci_uimm6x8 : ), (: : drd)},
resources:{next_pc, x2 : drd[0..]},
disasm: "fld", "%drd, %I_ci_uimm6x8(%x2)",
semfunc: "&RV64::RiscVILd", "&RV64::RiscVILdChild";
cfsdsp{: x2, I_css_uimm6x8, cdrs2 : },
resources: {next_pc, x2, cdrs2},
disasm: "fsd", "%cdrs2, %I_css_uimm6x8(%x2)",
semfunc: "&RV64::RiscVISd";
cfld{(: c3rs1, I_cl_uimm5x8 : ), (: : c3drd)},
resources: {next_pc, c3rs1 : c3drd[0..]},
disasm: "fld", "%c3drd, %I_cl_uimm5x8(%c3rs1)",
semfunc: "&RV64::RiscVILd", "&RV64::RiscVILdChild";
cfsd{: c3rs1, I_cl_uimm5x8, c3drs2 : },
resources: {next_pc, c3rs1, c3drs2},
disasm: "fsd", "%c3drs2, %I_cl_uimm5x8(%c3rs1)",
semfunc: "&RV32::RiscVDSd";
}
}
slot riscv_zcd64 {
includes {
#include "riscv/riscv_i_instructions.h"
}
default size = 2;
opcodes {
cfldsp = override, semfunc: "&RV64::RiscVILd", "&RV64::RiscVILdChild";
cfsdsp = override, semfunc: "&RV64::RiscVISd";
cfld = override, semfunc: "&RV64::RiscVILd", "&RV64::RiscVILdChild";
cfsd = override, semfunc: "&RV64::RiscVDSd";
}
}
slot riscv_zcb32 {
includes {
#include "riscv/riscv_bitmanip_instructions.h"
}
default size = 2;
opcodes {
c_lbu{(: c3rs1, uimm2b),(: : c3rs2)},
resources: {c3rs1 : c3rs2},
disasm: "c.lbu", "%c3rs2, %uimm2b(%c3rs1)",
semfunc: "&RV32::RiscVILbu", "&RV32::RiscVILbuChild";
c_lhu{(: c3rs1, uimm2h),(: : c3rs2)},
resources: {c3rs1 : c3rs2},
disasm: "c.lhu", "c3rs2, %uimm2h(%c3rs1)",
semfunc: "&RV32::RiscVILhu", "&RV32::RiscVILhuChild";
c_lh{(: c3rs1, uimm2h),(: : c3rs2)},
resources: {c3rs1 : c3rs2},
disasm: "c.lh", "%c3rs2, %uimm2h(%c3rs1)",
semfunc: "&RV32::RiscVILh", "&RV32::RiscVILhChild";
c_sb{ : c3rs1, uimm2b, c3rs2},
resources: {c3rs1, c3rs2},
disasm: "c.sb", "%c3rs2, %uimm2b(%c3rs1)",
semfunc: "&RV32::RiscVISb";
c_sh{: c3rs1, uimm2h, c3rs2},
resources: {c3rs1, c3rs2},
disasm: "c.sh", "%c3rs2, %uimm2h(%c3rs1)",
semfunc: "&RV32::RiscVISh";
c_zext_b{: c3rs1 : c3rd},
resources: {c3rs1: c3rd},
disasm: "c.zext.b", "%c3rs1",
semfunc: "&RV32::RiscVZextB";
c_sext_b{: c3rs1 : c3rd},
resources: {c3rs1 : c3rd},
disasm: "c.sext.b", "c3rs1",
semfunc: "&RV32::RiscVSextB";
c_zext_h{: c3rs1 : c3rd},
resources: {c3rs1 : c3rd},
disasm: "c.zext.h", "c3rs1",
semfunc: "&RV32::RiscVZextH";
c_sext_h{: c3rs1 : c3rd},
resources: {c3rs1 : c3rd},
disasm: "c.sext.h", "c3rs1",
semfunc: "&RV32::RiscVSextH";
c_not{: c3rs1 : c3rd},
resources: {c3rs1 : c3rd},
disasm: "c.not", "c3rs1",
semfunc: "&RV32::RiscVNot";
c_mul{: c3rs1, c3rs2 : c3rd},
resources: {c3rs1, c3rs2 : c3rd},
disasm: "c.mul", "%c3rd, %c3rs2",
semfunc: "&RV32::MMul";
}
}
slot riscv_zcb64 {
includes {
#include "riscv/riscv_bitmanip_instructions.h"
}
default size = 2;
opcodes {
c_lbu = override, semfunc: "&RV64::RiscVILbu", "&RV64::RiscVILbuChild";
c_lhu = override, semfunc: "&RV64::RiscVLhu", "&RV64::RiscVILhuChild";
c_lh = override, semfunc: "&RV64::RiscVLh", "&RV64::RiscVILhChild";
c_sb = override, semfunc: "&RV64::RiscVSb";
c_sh = override, semfunc: "&RV64::RiscVSh";
c_zext_b = override, semfunc: "&RV64::RiscVZextB";
c_sext_b = override, semfunc: "&RV64::RiscVSextB";
c_zext_h = override, semfunc: "&RV64::RiscVZextH";
c_sext_h = override, semfunc: "&RV64::RiscVSextH";
c_not = override, semfunc: "&RV64::RiscV";
c_mul = override, semfunc: "&RV64::MMul";
c_sext_w{: c3rs1 : c3rd},
resources: {c3rs1 : c3rd},
disasm: "c.sext.w", "%c3rs1",
semfunc: "&RV64::RiscVSextW";
}
}
slot riscv_zcmp32 {
includes {
#include "riscv/riscv_zc_instructions.h"
}
default size = 2;
opcodes {
cm_push{: x2, spimm6, rlist, [rlist] : x2},
resources: {x2, [rlist] : x2},
disasm: "cm.push",
semfunc: "&RV32::RiscVZCmpPush";
cm_pop{: x2, spimm6, rlist : x2, [rlist]},
resources: {x2 : x2, [rlist]},
disasm: "cm.pop",
semfunc: "&RV32::RiscVZCmpPop";
cm_popret{: x2, spimm6, rlist : x2, [rlist]},
resources: {x2 : x2, [rlist]},
disasm: "cm.popret",
semfunc: "&RV32::RiscVZCmpPopRet";
cm_popretz{: x2, spimm6, rlist : x2, [rlist]},
resources: {x2 : x2, [rlist]},
disasm: "cm.popretz",
semfunc: "&RV32::RiscVZCmpPopRetz";
cm_mvsa01{ : x10, x11 : sreg1, sreg2},
resources: {x10, x11 : sreg1, sreg2},
disasm: "cm.mvsa01","%sreg1, %sreg2",
semfunc: "&RV32::RiscVZCmpMvTwoRegs";
cm_mva01s{ : sreg1, sreg2 : x10, x11 },
resources: {sreg1, sreg2 : x10, x11},
disasm: "cm.mva01s", "%sreg1, %sreg2",
semfunc: "&RV32::RiscVZCmpMvTwoRegs";
}
}
slot riscv_zcmp64 {
includes {
#include "riscv/riscv_zc_instructions.h"
}
default size = 2;
opcodes {
cm_push{ : x2, spimm6, rlist, [rlist] : x2},
resources: {[rlist]},
disasm: "cm.push",
semfunc: "&RV64::RiscVZCmpPush";
cm_pop{ : x2, spimm6, rlist : [rlist], x2},
resources: { : [rlist]},
disasm: "cm.pop",
semfunc: "&RV64::RiscVZCmpPop";
cm_popret{ : x2, spimm6, rlist, x1 : [rlist], x2, next_pc},
resources: { : [rlist]},
disasm: "cm.popret",
semfunc: "&RV64::RiscVZCmpPopRet";
cm_popretz{ : x2, spimm6, rlist, x1 : [rlist], x2, x10, next_pc},
resources: { : [rlist]},
disasm: "cm.popretz",
semfunc: "&RV64::RiscVZCmpPopRetz";
cm_mvsa01{ : x10, x11 : sreg1, sreg2},
resources: {x10, x11 : sreg1, sreg2},
disasm: "cm.mvsa01", "%sreg1, %sreg2",
semfunc: "&RV64::RiscVZCmpMvTwoRegs";
cm_mva01s{ : sreg1, sreg2 : x10, x11},
resources: {sreg1, sreg2 : x10, x11},
disasm: "cm.mva01s", "%sreg1, %sreg2",
semfunc: "&RV64::RiscVZCmpMvTwoRegs";
}
}
slot riscv_zcmt32 {
includes {
#include "riscv/riscv_zc_instructions.h"
}
default size = 2;
opcodes {
cm_jt{: index : next_pc},
resources: {: next_pc},
disasm: "cm.jt",
semfunc: "&RV32::RiscVZCmtJt";
cm_jalt{: index : next_pc, x1},
resources: {: next_pc, x1},
disasm: "cm.jalt",
semfunc: "&RV32::RiscVZCmtJalt";
}
}
slot riscv_zcmt64 {
includes {
#include "riscv/riscv_zc_instructions.h"
}
default size = 2;
opcodes {
cm_jt = override, semfunc: "&RV64::RiscVZCmtJt";
cm_jalt = override, semfunc: "&RV64::RiscVZCmtJalt";
}
}