2010-11-04 4 views
6

Как бы вы достигли 128-битных атомных операций в x86?x86 128-битные атомы ops

Руководство по системному программированию Intel, часть 1, 8.1 Заблокированные атомные операции определяют гарантированные 16-, 32- и 64-разрядные атомные операции. Итак, можете ли вы выполнить 128-битные атомные операции, выполнив 2 64-битных опса с префиксом LOCK? Что-то вроде ...

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

Aparently SSE имеет 128-битные регистры XMM. Можете ли вы просто сделать 128-битный метод сравнения и замены с помощью этих регистров?

+9

Вы можете выполнить атомный 16-байтовый обмен по обмену ('CMPXCHG16B'). –

+0

Вы пытаетесь сделать это в 32-разрядной версии x86 или в x64? – user200783

+0

x86_64, 64-разрядный режим – brooksbp

ответ

9

Префикс LOCK не может использоваться в сочетании с инструкцией MOV.

замок префикс может предваряться только к следующим инструкциям и только к тем формам инструкций, где операнд назначения представляет собой операнд памяти: ADD, ADC, и, BTC, BTR, БПС, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD и XCHG. Intel Instruction Set Reference

Это будет генерировать исключение Invalid Opcode. Таким образом, LOCK CMPXCHG16B - единственный способ здесь.

+0

Вам нужен префикс 'LOCK 'на CMPXCHG? Кажется ненужным .. – brooksbp

+0

В отношении справочника по набору инструкций Intel требуется «LOCK». «Эта инструкция может использоваться с префиксом LOCK, чтобы позволить инструкции выполняться атомарно. Чтобы упростить интерфейс к шине процессора, операнд назначения получает цикл записи без учета результата сравнения». – bkausbk

+0

@brooksbp: [use-cases for 'cmpxchg' без' lock'] (https://stackoverflow.com/a/44273130/224132), например. однопроцессорные системы для использования в памяти, отличной от порта MMIO. Это также делает его совместимым с памятью-добавлением 'add' и другими инструкциями, которые имеют очевидные применения, кроме параллелизма. –

Смежные вопросы