// 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 bitmanipulation
// extension.

includes {
  #include "riscv/riscv_bitmanip_instructions.h"
}

disasm widths = {-18};

// Slot that gathers all the bitmanipulation instructions.
slot riscv32_zb :
  riscv32_zba,
  riscv32_zbb,
  riscv32_zbb_imm,
  riscv32_zbc,
  riscv32_zbs,
  riscv32_zbs_imm {
}

slot riscv32_zba {
  default size = 4;
  resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]};
  opcodes {
    sh1add{: rs1, rs2, const1 : rd},
      resources: ThreeOp,
      disasm: "sh1add", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVShAdd";
    sh2add{: rs1, rs2, const2 : rd},
      resources: ThreeOp,
      disasm: "sh2add", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVShAdd";
    sh3add{: rs1, rs2, const3 : rd},
      resources: ThreeOp,
      disasm: "sh3add", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVShAdd";
  }
}

slot riscv32_zbb {
  default size = 4;
  resources TwoOp = { next_pc, rs1 : rd[..rd]};
  resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]};
  opcodes {
    // Logical with negate.
    andn{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "andn", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVAndn";
    orn{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "orn", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVOrn";
    xnor{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "xor", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVXnor";
    // Counte leading/trailing zero bits.
    clz{: rs1 : rd},
      resources: TwoOp,
      disasm: "clz", "%rd, %rs1",
      semfunc: "&RV32::RiscVClz";
    ctz{: rs1 : rd},
      resources: TwoOp,
      disasm: "ctz", "%rd, %rs1",
      semfunc: "&RV32::RiscVCtz";
    // Count population
    cpop{: rs1 : rd},
      resources: TwoOp,
      disasm: "cpop", "%rd, %rs1",
      semfunc: "&RV32::RiscVCpop";
    // Integer minimum/maximum.
    max{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "max", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVMax";
    maxu{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "max", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVMaxu";
    min{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "min", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVMin";
    minu{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "min", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVMinu";
    // Sign and zero extension.
    sext_b{: rs1 : rd},
      resources: TwoOp,
      disasm: "sext.b", "%rd, %rs1",
      semfunc: "&RV32::RiscVSextB";
    sext_h{: rs1 : rd},
      resources: TwoOp,
      disasm: "sext.h", "%rd, %rs1",
      semfunc: "&RV32::RiscVSextH";
    zext_h{: rs1 : rd},
      resources: TwoOp,
      disasm: "zext.h", "%rd, %rs1",
      semfunc: "&RV32::RiscVZextH";
    // Bitwise rotation.
    rol{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "rol", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVRol";
    ror{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "ror", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVRor";
    // OR combine.
    orcb{: rs1 : rd},
      resources: TwoOp,
      disasm: "orc", "%rd, %rs1",
      semfunc: "&RV32::RiscVOrcb";
    // Byte reverse.
    rev8{: rs1 : rd},
      resources: TwoOp,
      disasm: "rev8", "%rd, %rs1",
      semfunc: "&RV32::RiscVRev8";
  }
}

slot riscv32_zbb_imm {
  default size = 4;
  resources TwoOp = { next_pc, rs1 : rd[..rd]};
  resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]};
  opcodes {
    rori{: rs1, r_uimm5 : rd},
      resources: TwoOp,
      disasm: "rori", "%rd, %rs1, %r_uimm5",
      semfunc: "&RV32::RiscVRor";
  }
}

slot riscv32_zbc {
  default size = 4;
  resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]};
  opcodes {
    // Carry-less multiplication.
    clmul{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "clmul", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVClmul";
    clmulh{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "clmulh", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVClmulh";
    clmulr{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "clmulr", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVClmulr";
  }
}

slot riscv32_zbs {
  default size = 4;
  resources TwoOp = { next_pc, rs1 : rd[..rd]};
  resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]};
  opcodes {
    // Single-bit instructions.
    bclr{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "bclr", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVBclr";
    bext{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "bext", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVBext";
    binv{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "binv", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVBinv";
    bset{: rs1, rs2 : rd},
      resources: ThreeOp,
      disasm: "bset", "%rd, %rs1, %rs2",
      semfunc: "&RV32::RiscVBset";
  }
}

slot riscv32_zbs_imm {
  default size = 4;
  resources TwoOp = { next_pc, rs1 : rd[..rd]};
  opcodes {
    // Single-bit instructions.
    bclri{: rs1, r_uimm5 : rd},
      resources: TwoOp,
      disasm: "bclri", "%rd, %rs1, %r_uimm5",
      semfunc: "&RV32::RiscVBclr";
    bexti{: rs1, r_uimm5 : rd},
      resources: TwoOp,
      disasm: "bexti", "%rd, %rs1, %r_uimm5",
      semfunc: "&RV32::RiscVBext";
    binvi{: rs1, r_uimm5 : rd},
      resources: TwoOp,
      disasm: "binvi", "%rd, %rs1, %r_uimm5",
      semfunc: "&RV32::RiscVBinv";
    bseti{: rs1, r_uimm5 : rd},
      resources: TwoOp,
      disasm: "bseti", "%rd, %rs1, %r_uimm5",
      semfunc: "&RV32::RiscVBset";
  }
}