Applicability of this chapter to configurations:
Configuration |
Implementation |
---|---|
CV32A60AX |
Implemented extension |
CV32A60X |
Implemented extension |
CV64A6_MMU |
Implemented extension |
RVZbb: Basic bit-manipulation
The following instructions comprise the Zbb extension:
Logical with negate
The Logical with Negate instructions can be implemented by inverting the rs2 inputs to the base-required AND, OR, and XOR logic instructions.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
andn rd, rs1, rs2 |
✔ |
✔ |
orn rd, rs1, rs2 |
✔ |
✔ |
xnor rd, rs1, rs2 |
RV32 and RV64 Instructions
ANDN: AND with inverted operand
Format: andn rd, rs1, rs2
Description: This instruction performs the bitwise logical AND operation between rs1 and the bitwise inversion of rs2.
Pseudocode: X(rd) = X(rs1) & ~X(rs2)
Invalid values: NONE
Exception raised: NONE
ORN: OR with inverted operand
Format: orn rd, rs1, rs2
Description: This instruction performs the bitwise logical AND operation between rs1 and the bitwise inversion of rs2.
Pseudocode: X(rd) = X(rs1) | ~X(rs2)
Invalid values: NONE
Exception raised: NONE
XNOR: Exclusive NOR
Format: xnor rd, rs1, rs2
Description: This instruction performs the bit-wise exclusive-NOR operation on rs1 and rs2.
Pseudocode: X(rd) = ~(X(rs1) ^ X(rs2))
Invalid values: NONE
Exception raised: NONE
Count leading/trailing zero bits
These instructions are used to count the leading/trailing zero bits.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
clz rd, rs |
✔ |
clzw rd, rs |
|
✔ |
✔ |
ctz rd, rs |
✔ |
ctzw rd, rs |
RV32 and RV64 Instructions
CLZ: Count leading zero bits
Format: clz rd, rs
Description: This instruction counts the number of 0’s before the first 1, starting at the most-significant bit (i.e., XLEN-1) and progressing to bit 0. Accordingly, if the input is 0, the output is XLEN, and if the most-significant bit of the input is a 1, the output is 0
Pseudocode: if [x[i]] == 1 then return(i) else return -1
Invalid values: NONE
Exception raised: NONE
CTZ: Count trailing zeros
Format: ctz rd, rs
Description: This instruction counts the number of 0’s before the first 1, starting at the least-significant bit (i.e., 0) and progressing to the most-significant bit (i.e., XLEN-1). Accordingly, if the input is 0, the output is XLEN, and if the least-significant bit of the input is a 1, the output is 0.
Pseudocode: if [x[i]] == 1 then return(i) else return xlen;
Invalid values: NONE
Exception raised: NONE
RV64 specific instructions
CLZW: Count leading zero bits in word
Format: clzw rd, rs
Description: This instruction counts the number of 0’s before the first 1 starting at bit 31 and progressing to bit 0. Accordingly, if the least-significant word is 0, the output is 32, and if the most-significant bit of the word (i.e., bit 31) is a 1, the output is 0.
Pseudocode: if [x[i]] == 1 then return(i) else return -1
Invalid values: NONE
Exception raised: NONE
CTZW: Count trailing zero bits in word
Format: ctzw rd, rs
Description: This instruction counts the number of 0’s before the first 1, starting at the least-significant bit (i.e., 0) and progressing to the most-significant bit of the least-significant word (i.e., 31). Accordingly, if the least-significant word is 0, the output is 32, and if the least-significant bit of the input is a 1, the output is 0.
Pseudocode: if [x[i]] == 1 then return(i) else return 32;
Invalid values: NONE
Exception raised: NONE
Count population
These instructions count the number of set bits (1-bits). This is also commonly referred to as population count.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
cpop rd, rs |
✔ |
cpopw rd, rs |
RV32 and RV64 Instructions
CPOP: Count set bits
Format: cpop rd, rs
Description: This instructions counts the number of 1’s (i.e., set bits) in the source register.
Pseudocode: if rs[i] == 1 then bitcount = bitcount + 1 else ()
Invalid values: NONE
Exception raised: NONE
RV64 specific instructions
CPOPW: Count set bits in word
Format: cpopw rd, rs
Description: This instructions counts the number of 1’s (i.e., set bits) in the least-significant word of the source register.
Pseudocode: if rs[i] == 0b1 then bitcount = bitcount + 1 else ()
Invalid values: NONE
Exception raised: NONE
Integer minumum/maximum
The integer minimum/maximum instructions are arithmetic R-type instructions that return the smaller/larger of two operands.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
max rd, rs1, rs2 |
✔ |
✔ |
maxu rd, rs1, rs2 |
✔ |
✔ |
min rd, rs1, rs2 |
✔ |
✔ |
minu rd, rs1, rs2 |
RV32 and RV64 Instructions
MAX: Maximum
Format: max rd, rs1, rs2
Description: This instruction returns the larger of two signed integers.
Pseudocode: if rs1_val <_s rs2_val then rs2_val else rs1_val
Invalid values: NONE
Exception raised: NONE
MAXU: Unsigned maximum
Format: maxu rd, rs1, rs2
Description: This instruction returns the larger of two unsigned integers.
Pseudocode: if rs1_val <_u rs2_val then rs2_val else rs1_val
Invalid values: NONE
Exception raised: NONE
MIN: Minimum
Format: min rd, rs1, rs2
Description: This instruction returns the smaller of two signed integers.
Pseudocode: if rs1_val <_s rs2_val then rs1_val else rs2_val
Invalid values: NONE
Exception raised: NONE
MINU: Unsigned minimum
Format: minu rd, rs1, rs2
Description: This instruction returns the smaller of two unsigned integers.
Pseudocode: if rs1_val <_u rs2_val then rs1_val else rs2_val
Invalid values: NONE
Exception raised: NONE
Sign and zero-extension
These instructions perform the sign-extension or zero-extension of the least significant 8 bits, 16 bits or 32 bits of the source register.
These instructions replace the generalized idioms slli rD,rS,(XLEN-<size>) + srli (for zero-extension) or slli + srai (for sign-extension) for the sign-extension of 8-bit and 16-bit quantities, and for the zero-extension of 16-bit and 32-bit quantities.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
sext.b rd, rs |
✔ |
✔ |
sext.h rd, rs |
✔ |
✔ |
zext.h rd, rs |
RV32 and RV64 Instructions
SEXT.B: Sign-extend byte
Format: sext.b rd, rs
Description: This instruction sign-extends the least-significant byte in the source to XLEN by copying the most-significant bit in the byte (i.e., bit 7) to all of the more-significant bits.
Pseudocode: X(rd) = EXTS(X(rs)[7..0])
Invalid values: NONE
Exception raised: NONE
SEXT.H: Sign-extend halfword
Format: sext.h rd, rs
Description: This instruction sign-extends the least-significant halfword in rs to XLEN by copying the most-significant bit in the halfword (i.e., bit 15) to all of the more-significant bits.
Pseudocode: X(rd) = EXTS(X(rs)[15..0])
Invalid values: NONE
Exception raised: NONE
ZEXT.H: Zero-extend halfword
Format: zext.h rd, rs
Description: This instruction zero-extends the least-significant halfword of the source to XLEN by inserting 0’s into all of the bits more significant than 15.
Pseudocode: X(rd) = EXTZ(X(rs)[15..0])
Invalid values: NONE
Exception raised: NONE
Bitwise Rotation
Bitwise rotation instructions are similar to the shift-logical operations from the base spec. However, where the shift-logical instructions shift in zeros, the rotate instructions shift in the bits that were shifted out of the other side of the value. Such operations are also referred to as ‘circular shifts’.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
rol rd, rs1, rs2 |
✔ |
rolw rd, rs1, rs2 |
|
✔ |
✔ |
ror rd, rs1, rs2 |
✔ |
✔ |
rori rd, rs1, shamt |
✔ |
roriw rd, rs1, shamt |
|
✔ |
rorw rd, rs1, rs2 |
RV32 and RV64 Instructions
ROL: Rotate Left (Register)
Format: rol rd, rs1, rs2
Description: This instruction performs a rotate left of rs1 by the amount in least-significant log2(XLEN) bits of rs2.
Pseudocode: (X(rs1) << log2(XLEN)) | (X(rs1) >> (xlen - log2(XLEN)))
Invalid values: NONE
Exception raised: NONE
ROR: Rotate Right
Format: ror rd, rs1, rs2
Description: This instruction performs a rotate right of rs1 by the amount in least-significant log2(XLEN) bits of rs2.
Pseudocode: (X(rs1) >> log2(XLEN)) | (X(rs1) << (xlen - log2(XLEN)))
Invalid values: NONE
Exception raised: NONE
RORI: Rotate Right (Immediate)
Format: rori rd, rs1, shamt
Description: This instruction performs a rotate right of rs1 by the amount in the least-significant log2(XLEN) bits of shamt. For RV32, the encodings corresponding to shamt[5]=1 are reserved.
Pseudocode: (X(rs1) >> log2(XLEN)) | (X(rs1) << (xlen - log2(XLEN)));
Invalid values: NONE
Exception raised: NONE
RV64 specific instructions
ROLW: Rotate Left Word (Register)
Format: rolw rd, rs1, rs2
Description: This instruction performs a rotate left on the least-significant word of rs1 by the amount in least-significant 5 bits of rs2. The resulting word value is sign-extended by copying bit 31 to all of the more-significant bits.
Pseudocode: EXTS((rs1 << X(rs2)[4..0];) | (rs1 >> (32 - X(rs2)[4..0];)))
Invalid values: NONE
Exception raised: NONE
RORIW: Rotate Right Word by Immediate
Format: roriw rd, rs1, shamt
Description: This instruction performs a rotate right on the least-significant word of rs1 by the amount in the least-significant log2(XLEN) bits of shamt. The resulting word value is sign-extended by copying bit 31 to all of the more-significant bits.
Pseudocode: (rs1_data >> shamt[4..0]) | (rs1_data << (32 - shamt[4..0]))
Invalid values: NONE
Exception raised: NONE
RORW: Rotate Right Word (Register)
Format: rorw rd, rs1, rs2
Description: This instruction performs a rotate right on the least-significant word of rs1 by the amount in least-significant 5 bits of rs2. The resultant word is sign-extended by copying bit 31 to all of the more-significant bits.
Pseudocode: (rs1 >> X(rs2)[4..0]) | (rs1 << (32 - X(rs2)[4..0]))
Invalid values: NONE
Exception raised: NONE
OR Combine
orc.b sets the bits of each byte in the result rd to all zeros if no bit within the respective byte of rs is set, or to all ones if any bit within the respective byte of rs is set.
One use-case is string-processing functions, such as strlen and strcpy, which can use orc.b to test for the terminating zero byte by counting the set bits in leading non-zero bytes in a word.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
orc.b rd, rs |
RV32 and RV64 Instructions
ORC.B: Bitwise OR-Combine, byte granule
Format: orc.b rd, rs
Description: Combines the bits within each byte using bitwise logical OR. This sets the bits of each byte in the result rd to all zeros if no bit within the respective byte of rs is set, or to all ones if any bit within the respective byte of rs is set.
Pseudocode: if { input[(i + 7)..i] == 0 then 0b00000000 else 0b11111111
Invalid values: NONE
Exception raised: NONE
Byte-reverse
rev8 reverses the byte-ordering of rs.
RV32 |
RV64 |
Mnemonic |
---|---|---|
✔ |
✔ |
rev8 rd, rs |
RV32 and RV64 Instructions
REV8: Byte-reverse register
Format: rev8 rd, rs
Description: This instruction reverses the order of the bytes in rs.
Pseudocode: output[i..(i + 7)] = input[(j - 7)..j]
Invalid values: NONE
Exception raised: NONE