Take the 2-minute tour ×

How would you achieve 128-bit atomic operations in x86?

Intel's System Programming Guide, Part 1, 8.1 Locked Atomic Operations specifies guaranteed 16-, 32-, and 64-bit atomic operations. So, can you achieve 128-bit atomic operations by doing 2 64-bit ops with the LOCK prefix? Something like...

LOCK mov 64bits->addr
LOCK mov 64bits->addr+64bits

Aparently SSE has 128-bit XMM registers. Can you just do 128-bit compare-and-swap using these registers?

share|improve this question
You can do an atomic 16-byte compare-exchange (CMPXCHG16B). –  James McNellis Nov 4 '10 at 16:47
Are you trying to do this in 32-bit x86, or in x64? –  Paul Baker Nov 4 '10 at 19:56
x86_64, 64-bit mode –  brooksbp Nov 4 '10 at 21:07
add comment

2 Answers

up vote 7 down vote accepted

The LOCK Prefix can not be used in combination with MOV instruction.

The LOCK prefix can be prepended only to the following instructions and only to those forms of the instructions where the destination operand is a memory operand: ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG. Intel Instruction Set Reference

Doing so will generate an Invalid Opcode Exception. So LOCK CMPXCHG16B is the only way here.

share|improve this answer
Do you need the `LOCK' prefix on a CMPXCHG ? Seems unnecessary.. –  brooksbp Jun 26 '11 at 21:43
Concerning Intel Instruction Set Reference a 'LOCK' is required. "This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically. To simplify the interface to the processor’s bus, the destination operand receives a write cycle without regard to the result of the comparison." –  bkausbk Jul 14 '11 at 7:28
add comment

If you use SSE it is not the solution. Operations that take data from SSE registers are atomic but you can't atomically transfer from SSE register to memory.

share|improve this answer
Even if you use the LOCK prefix? –  brooksbp Nov 4 '10 at 17:00
@brooksbp i am not sure about is it possible to use lock with SSE, but even if it is why to use SSE then? –  Andrey Nov 4 '10 at 17:06
add comment

Your Answer


