blob: 770757ce1e2c9a9653bb507747f91cfed7eed4a9 [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 contains the ISA description for the RiscV32/64 Zimop and Zcmop
// extensions. These are the "may be operations", which are simply opcodes for
// instructions that do not generate exceptions, but have no other semantics
// other than writing zero to the destination register (Zimop) or operate as a
// nop (Zcmop).
includes {
#include "riscv/riscv_i_instructions.h"
#include "riscv/riscv_zimop_instructions.h"
}
slot riscv32_zimop {
resources OneOp = {next_pc : rd[..rd]};
opcodes {
mop_r_0{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.0", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_1{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.1", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_2{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.2", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_3{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.3", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_4{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.4", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_5{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.5", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_6{: rs1: rd},
resources: OneOp,
disasm: "mop.r.6", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_7{: rs1: rd},
resources: OneOp,
disasm: "mop.r.7", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_8{: rs1: rd},
resources: OneOp,
disasm: "mop.r.8", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_9{: rs1: rd},
resources: OneOp,
disasm: "mop.r.9", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_10{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.10", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_11{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.11", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_12{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.12", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_13{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.13", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_14{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.14", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_15{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.15", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_16{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.15", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_17{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.17", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_18{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.18", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_19{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.19", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_20{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.20", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_21{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.21", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_22{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.22", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_23{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.23", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_24{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.24", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_25{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.25", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_26{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.26", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_27{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.27", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_28{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.28", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_29{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.29", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_30{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.30", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_r_31{: rs1 : rd},
resources: OneOp,
disasm: "mop.r.31", "%rd, %rs1",
semfunc: "&RV32::RiscVMop";
mop_rr_0{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.0", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
mop_rr_1{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.1", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
mop_rr_2{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.2", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
mop_rr_3{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.3", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
mop_rr_4{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.4", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
mop_rr_5{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.5", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
mop_rr_6{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.6", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
mop_rr_7{: rs1, rs2 : rd},
resources: OneOp,
disasm: "mop.rr.7", "%rd, %rs1, %rs2",
semfunc: "&RV32::RiscVMop";
}
}
slot riscv64_zimop : riscv32_zimop {
resources OneOp = {next_pc : rd[..rd]};
opcodes {
mop_r_0 = override, semfunc: "&RV64::RiscVMop";
mop_r_1 = override, semfunc: "&RV64::RiscVMop";
mop_r_2 = override, semfunc: "&RV64::RiscVMop";
mop_r_3 = override, semfunc: "&RV64::RiscVMop";
mop_r_4 = override, semfunc: "&RV64::RiscVMop";
mop_r_5 = override, semfunc: "&RV64::RiscVMop";
mop_r_6 = override, semfunc: "&RV64::RiscVMop";
mop_r_7 = override, semfunc: "&RV64::RiscVMop";
mop_r_8 = override, semfunc: "&RV64::RiscVMop";
mop_r_9 = override, semfunc: "&RV64::RiscVMop";
mop_r_10 = override, semfunc: "&RV64::RiscVMop";
mop_r_11 = override, semfunc: "&RV64::RiscVMop";
mop_r_12 = override, semfunc: "&RV64::RiscVMop";
mop_r_13 = override, semfunc: "&RV64::RiscVMop";
mop_r_14 = override, semfunc: "&RV64::RiscVMop";
mop_r_15 = override, semfunc: "&RV64::RiscVMop";
mop_r_16 = override, semfunc: "&RV64::RiscVMop";
mop_r_17 = override, semfunc: "&RV64::RiscVMop";
mop_r_18 = override, semfunc: "&RV64::RiscVMop";
mop_r_19 = override, semfunc: "&RV64::RiscVMop";
mop_r_20 = override, semfunc: "&RV64::RiscVMop";
mop_r_21 = override, semfunc: "&RV64::RiscVMop";
mop_r_22 = override, semfunc: "&RV64::RiscVMop";
mop_r_23 = override, semfunc: "&RV64::RiscVMop";
mop_r_24 = override, semfunc: "&RV64::RiscVMop";
mop_r_25 = override, semfunc: "&RV64::RiscVMop";
mop_r_26 = override, semfunc: "&RV64::RiscVMop";
mop_r_27 = override, semfunc: "&RV64::RiscVMop";
mop_r_28 = override, semfunc: "&RV64::RiscVMop";
mop_r_29 = override, semfunc: "&RV64::RiscVMop";
mop_r_30 = override, semfunc: "&RV64::RiscVMop";
mop_r_31 = override, semfunc: "&RV64::RiscVMop";
mop_rr_0 = override, semfunc: "&RV64::RiscVMop";
mop_rr_1 = override, semfunc: "&RV64::RiscVMop";
mop_rr_2 = override, semfunc: "&RV64::RiscVMop";
mop_rr_3 = override, semfunc: "&RV64::RiscVMop";
mop_rr_4 = override, semfunc: "&RV64::RiscVMop";
mop_rr_5 = override, semfunc: "&RV64::RiscVMop";
mop_rr_6 = override, semfunc: "&RV64::RiscVMop";
mop_rr_7 = override, semfunc: "&RV64::RiscVMop";
}
}
// Compact May-be-operations.
slot riscv_zcmop {
opcodes {
c_mop_1{},
disasm: "c.mop.1",
semfunc: "RiscVINop";
c_mop_3{},
disasm: "c.mop.3",
semfunc: "RiscVINop";
c_mop_5{},
disasm: "c.mop.5",
semfunc: "RiscVINop";
c_mop_7{},
disasm: "c.mop.7",
semfunc: "RiscVINop";
c_mop_9{},
disasm: "c.mop.9",
semfunc: "RiscVINop";
c_mop_11{},
disasm: "c.mop.11",
semfunc: "RiscVINop";
c_mop_13{},
disasm: "c.mop.13",
semfunc: "RiscVINop";
c_mop_15{},
disasm: "c.mop.15",
semfunc: "RiscVINop";
}
}