..
   Copyright (c) 2023 OpenHW Group
   Copyright (c) 2023 10xEngineers

   SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1

.. Level 1
   =======

   Level 2
   -------

   Level 3
   ~~~~~~~

   Level 4
   ^^^^^^^

.. _cva6_riscv_instructions_RV32Zbs:

*Applicability of this chapter to configurations:*

.. csv-table::
   :widths: auto
   :align: left
   :header: "Configuration", "Implementation"

   "CV32A60AX", "Implemented extension"
   "CV32A60X", "Implemented extension"
   "CV64A6_MMU", "Implemented extension"

   
==============================
RVZbs: Single-bit instructions
==============================
The single-bit instructions provide a mechanism to set, clear, invert, or extract a single bit in a register. The bit is specified by its index.

The following instructions (and pseudoinstructions) comprise the Zbs extension:

+-----------+-----------+-----------------------+
| RV32      | RV64      | Mnemonic              |
+===========+===========+=======================+
| ✔         | ✔         | bclr rd, rs1, rs2     |
+-----------+-----------+-----------------------+
| ✔         | ✔         | bclri rd, rs1, imm    |
+-----------+-----------+-----------------------+
| ✔         | ✔         | bext rd, rs1, rs2     |
+-----------+-----------+-----------------------+
| ✔         | ✔         | bexti rd, rs1, imm    |
+-----------+-----------+-----------------------+
| ✔         | ✔         | binv rd, rs1, rs2     |
+-----------+-----------+-----------------------+
| ✔         | ✔         | binvi rd, rs1, imm    |
+-----------+-----------+-----------------------+
| ✔         | ✔         | bset rd, rs1, rs2     |
+-----------+-----------+-----------------------+
| ✔         | ✔         | bseti rd, rs1, imm    |
+-----------+-----------+-----------------------+

RV32 and RV64 Instructions
--------------------------

- **BCLR**: Single-Bit Clear (Register)

    **Format**: bclr rd, rs1, rs2

    **Description**: This instruction returns rs1 with a single bit cleared at the index specified in rs2. The index is read from the lower log2(XLEN) bits of rs2.

    **Pseudocode**: X(rd) = X(rs1) & ~(1 << (X(rs2) & (XLEN - 1)))

    **Invalid values**: NONE

    **Exception raised**: NONE

- **BCLRI**: Single-Bit Clear (Immediate)

    **Format**: bclri rd, rs1, shamt

    **Description**: This instruction returns rs1 with a single bit cleared at the index specified in shamt. The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding to shamt[5]=1 are reserved.

    **Pseudocode**: X(rd) = X(rs1) & ~(1 << (shamt & (XLEN - 1)))

    **Invalid values**: NONE

    **Exception raised**: NONE

- **BEXT**: Single-Bit Extract (Register)

    **Format**: bext rd, rs1, rs2

    **Description**: This instruction returns a single bit extracted from rs1 at the index specified in rs2. The index is read from the lower log2(XLEN) bits of rs2.

    **Pseudocode**: X(rd) = (X(rs1) >> (X(rs2) & (XLEN - 1))) & 1

    **Invalid values**: NONE

    **Exception raised**: NONE

- **BEXTI**: Single-Bit Extract (Immediate)

    **Format**: bexti rd, rs1, shamt

    **Description**: This instruction returns a single bit extracted from rs1 at the index specified in rs2. The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding to shamt[5]=1 are reserved.

    **Pseudocode**: X(rd) = (X(rs1) >> (shamt & (XLEN - 1))) & 1

    **Invalid values**: NONE

    **Exception raised**: NONE

- **BINV**: Single-Bit Invert (Register)

    **Format**: binv rd, rs1, rs2

    **Description**: This instruction returns rs1 with a single bit inverted at the index specified in rs2. The index is read from the lower log2(XLEN) bits of rs2.

    **Pseudocode**: X(rd) = X(rs1) ^ (1 << (X(rs2) & (XLEN - 1)))

    **Invalid values**: NONE

    **Exception raised**: NONE

- **BINVI**: Single-Bit Invert (Immediate)

    **Format**: binvi rd, rs1, shamt

    **Description**: This instruction returns rs1 with a single bit inverted at the index specified in shamt. The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding to shamt[5]=1 are reserved.

    **Pseudocode**: X(rd) = X(rs1) ^ (1 << (shamt & (XLEN - 1)))

    **Invalid values**: NONE

    **Exception raised**: NONE    

- **BSET**: Single-Bit Set (Register)

    **Format**: bset rd, rs1, rs2

    **Description**: This instruction returns rs1 with a single bit set at the index specified in rs2. The index is read from the lower log2(XLEN) bits of rs2.

    **Pseudocode**: X(rd) = X(rs1) | (1 << (X(rs2) & (XLEN - 1)))

    **Invalid values**: NONE

    **Exception raised**: NONE

- **BSETI**: Single-Bit Set (Immediate)

    **Format**: bseti rd, rs1, shamt

    **Description**: This instruction returns rs1 with a single bit set at the index specified in shamt. The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding to shamt[5]=1 are reserved.

    **Pseudocode**: X(rd) = X(rs1) | (1 << (shamt & (XLEN - 1)))

    **Invalid values**: NONE

    **Exception raised**: NONE     

    

