ldsmin
Atomic Load-Signed Minimum Word
LDSMIN <Ws>, <Wt>, [<Xn|SP>]
Atomic signed min to memory.
Details
Atomic Load-Signed Minimum Word atomically loads a 32-bit signed value from memory, computes the signed minimum of the loaded value and Ws, stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.
Pseudocode Operation
address ← Xn
original_value ← [address]
new_value ← SignedMin(original_value, Ws)
[address] ← new_value
Wt ← original_value
Memory ordering: Release semantics applied
Example
LDSMIN w6, w3, [x1]
Encoding
Binary Layout
10
111
0
00
0
0
1
Rs
0
101
00
Rn
Rt
Operands
-
Ws
Value -
Wt
Transfer 32-bit integer register (load/store) -
Xn
First source / base 64-bit integer register
Reference (Arm A64 ISA)
Instruction Forms
| Encoding | Instruction | ISA | Bit pattern | ||
|---|---|---|---|---|---|
| 0xB8205000 | LDSMIN <Ws>, <Wt>, [<Xn|SP>] | A64 | 10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 101 | 00 | Rn | Rt | ||
| 0xF8205000 | LDSMIN <Xs>, <Xt>, [<Xn|SP>] | A64 | 11 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 101 | 00 | Rn | Rt |
Description
Atomic signed minimum on word or doubleword in memory atomically loads a 32-bit word or 64-bit doubleword from memory, compares it against the value held in a register, and stores the smaller value back to memory, treating the values as signed numbers. The value initially loaded from memory is returned in the destination register.
For more information about memory ordering semantics, see Load-Acquire, Store-Release.
For information about memory accesses, see Load/Store addressing modes.
Operation
bits(64) address;
bits(datasize) value;
bits(datasize) data;
AccessDescriptor accdesc = CreateAccDescAtomicOp(MemAtomicOp_SMIN, acquire, release, tagchecked);
value = X[s, datasize];
if n == 31 then
CheckSPAlignment();
address = SP[];
else
address = X[n, 64];
bits(datasize) comparevalue = bits(datasize) UNKNOWN; // Irrelevant when not executing CAS
data = MemAtomic(address, comparevalue, value, accdesc);
if t != 31 then
X[t, regsize] = ZeroExtend(data, regsize);