RV32A, RV64A Instructions¶
lr.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00010 | aq | rl | 00000 | rs1 | 010 | rd | 01011 | 11 |
Format: | lr.w rd,rs1
|
---|---|
Description: | load a word from the address in rs1, places the sign-extended value in rd, and registers a reservation on the memory address.
|
Implementation: | x[rd] = LoadReserved32(M[x[rs1]])
|
sc.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00011 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | sc.w rd,rs1,rs2
|
---|---|
Description: | write a word in rs2 to the address in rs1, provided a valid reservation still exists on that address.
SC writes zero to rd on success or a nonzero code on failure.
|
Implementation: | x[rd] = StoreConditional32(M[x[rs1]], x[rs2])
|
amoswap.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00001 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amoswap.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit signed data value from the address in rs1, place the value into register rd, swap the loaded value and the original 32-bit signed value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] SWAP x[rs2])
|
amoadd.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00000 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amoadd.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit signed data value from the address in rs1, place the value into register rd, apply add the loaded value and the original 32-bit signed value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] + x[rs2])
|
amoxor.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00100 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amoxor.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit signed data value from the address in rs1, place the value into register rd, apply exclusive or the loaded value and the original 32-bit signed value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] ^ x[rs2])
|
amoand.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
01100 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amoand.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit signed data value from the address in rs1, place the value into register rd, apply and the loaded value and the original 32-bit signed value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] & x[rs2])
|
amoor.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
01000 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amoor.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit signed data value from the address in rs1, place the value into register rd, apply or the loaded value and the original 32-bit signed value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] | x[rs2])
|
amomin.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
10000 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amomin.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit signed data value from the address in rs1, place the value into register rd, apply min operator the loaded value and the original 32-bit signed value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] MIN x[rs2])
|
amomax.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
10100 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amomax.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit signed data value from the address in rs1, place the value into register rd, apply max operator the loaded value and the original 32-bit signed value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] MAX x[rs2])
|
amominu.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
11000 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amominu.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit unsigned data value from the address in rs1, place the value into register rd, apply unsigned min the loaded value and the original 32-bit unsigned value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] MINU x[rs2])
|
amomaxu.w¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
11100 | aq | rl | rs2 | rs1 | 010 | rd | 01011 | 11 |
Format: | amomaxu.w rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 32-bit unsigned data value from the address in rs1, place the value into register rd, apply unsigned max the loaded value and the original 32-bit unsigned value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO32(M[x[rs1]] MAXU x[rs2])
|