RV64A Instructions¶
lr.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00010 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | lr.d rd,rs1
|
---|---|
Description: | load a 64-bit data from the address in rs1, places value in rd, and registers a reservation on the memory address.
|
Implementation: | x[rd] = LoadReserved64(M[x[rs1]])
|
sc.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00011 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | sc.d rd,rs1,rs2
|
---|---|
Description: | write a 64-bit data 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] = StoreConditional64(M[x[rs1]], x[rs2])
|
amoswap.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00001 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amoswap.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, swap the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] SWAP x[rs2])
|
amoadd.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00000 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amoadd.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply add the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] + x[rs2])
|
amoxor.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
00100 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amoxor.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply xor the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] ^ x[rs2])
|
amoand.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
01100 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amoand.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply and the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] & x[rs2])
|
amoor.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
01000 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amoor.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply or the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] | x[rs2])
|
amomin.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
10000 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amomin.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply min the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] MIN x[rs2])
|
amomax.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
10100 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amomax.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply max the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] MAX x[rs2])
|
amominu.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
11000 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amominu.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply unsigned min the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] MINU x[rs2])
|
amomaxu.d¶
31-27 | 26 | 25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
11100 | aq | rl | rs2 | rs1 | 011 | rd | 01011 | 11 |
Format: | amomaxu.d rd,rs2,(rs1)
|
---|---|
Description: | atomically load a 64-bit data value from the address in rs1, place the value into register rd, apply unsigned max the loaded value and the original 64-bit value in rs2, then store the result back to the address in rs1.
|
Implementation: | x[rd] = AMO64(M[x[rs1]] MAXU x[rs2])
|