SWP
From ARMwiki
Instruction | SWP[S] |
---|---|
Function | SWaP register with memory |
Category | Semaphore |
ARM family | ARMv3 (and ARMv2as (ARM3)) |
Notes | - |
Contents |
SWP : Swap
While the ARM is a Load/Store architecture, there is one significant and important exception. That exception is the use of a semaphore which must be read from and/or written to memory in one atomic cycle (so that, for instance, an interrupt cannot get between reading and writing).
SWP
will swap a word between register(s) and memory as follows: There is an address and two values, an original data and loaded data.
This instruction will load a word from <address> and remember it. The contents of register <original> are then written to the location pointed to by <address>. The remembered word is then placed in <loaded> (it does not overwrite the original data).
Syntax
SWP <loaded>, <original>, [<address>]
Function
<temp> = LDR [<address>, 4] STR [<address>, 4] = <original> <loaded> = <temp>
Example
SWP R0, R1, [R2] ; Write R1 to location pointed to by R2 and ; place original contents of that address in R0
Notes
- If <loaded> and <original> are the same, the data in register and memory swapped.
- It is not possible to read a semaphore with SWP - you should LDR from the address.
- If the address is not word aligned, things will go wrong (CPUs without an MMU will rotate right the value, CPUs with an MMU will fault).
- None of the registers specified can be R15.
Technical
The instruction bit pattern is as follows:
31 - 28 | 27 - 22 | 21 - 20 | 19 - 16 | 15 - 12 | 11 - 8 | 7 - 4 | 3 - 0 |
---|---|---|---|---|---|---|---|
condition | 0 0 0 1 0 0 | 0 0 | <dest> | <load> | 0 0 0 0 | 1 0 0 1 | <value> |