Applicability of this chapter to configurations:

Configuration

Implementation

CV32A60AX

Implemented extension

CV32A60X

Implemented extension

CV64A6_MMU

Implemented extension

RVZbc: Carry-less multiplication

Carry-less multiplication is the multiplication in the polynomial ring over GF(2).

clmul produces the lower half of the carry-less product and clmulh produces the upper half of the 2✕XLEN carry-less product.

clmulr produces bits 2✕XLEN−2:XLEN-1 of the 2✕XLEN carry-less product.

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

RV32

RV64

Mnemonic

clmul rd, rs1, rs2

clmulh rd, rs1, rs2

clmulr rd, rs1, rs2

RV32 and RV64 Instructions

  • CLMUL: Carry-less multiply (low-part)

    Format: clmul rd, rs1, rs2

    Description: clmul produces the lower half of the 2.XLEN carry-less product.

    Pseudocode: foreach (i from 1 to xlen by 1) { output = if ((rs2 >> i) & 1) then output ^ (rs1 << i); else output; }

    Invalid values: NONE

    Exception raised: NONE

  • CLMULH: Carry-less multiply (high-part)

    Format: clmulh rd, rs1, rs2

    Description: clmulh produces the upper half of the 2.XLEN carry-less product.

    Pseudocode: foreach (i from 1 to xlen by 1) { output = if ((rs2_val >> i) & 1) then output ^ (rs1_val >> (xlen - i)) else output }

    Invalid values: NONE

    Exception raised: NONE

  • CLMULR: Carry-less multiply (reversed)

    Format: clmulr rd, rs1, rs2

    Description: clmulr produces bits 2.XLEN-2:XLEN-1 of the 2.XLEN carry-less product.

    Pseudocode: foreach (i from 0 to (xlen - 1) by 1) { output = if ((rs2_val >> i) & 1) then output ^ (rs1_val >> (xlen - i - 1)) else output}

    Invalid values: NONE

    Exception raised: NONE