2010-11-04 9 views
6

x86'da 128 bit atomik işlemleri nasıl gerçekleştirirsiniz?x86 128 bit atomik işlemler

Intel'in Sistem Programlama Kılavuzu, Bölüm 1, 8.1 Kilitli Atomik İşlemler garantili 16, 32 ve 64 bit atomik işlemleri belirtir. Öyleyse, LOCK öneki 2 64 bit operasyon yaparak 128 bit atomik işlemler yapabilir misiniz? Bir şey gibi ...

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

Yalnız SSE 128 bit XMM kayıtlarına sahiptir. Bu kayıtları kullanarak sadece 128 bit karşılaştırmalı-takas yapabilir misiniz?

+9

Atomik 16 baytlık bir karşılaştırma-değişimi ('CMPXCHG16B') yapabilirsiniz. –

+0

Bunu 32-bit x86’da mı, yoksa x64’te mi yapmaya çalışıyorsunuz? – user200783

+0

x86_64, 64-bit modu – brooksbp

cevap

9

LOCK Öneki, MOV yönergesiyle birlikte kullanılamaz.

KİLİDİ ​​önek

yalnızca aşağıdaki talimatlara ve sadece hedef işlenen bir bellek işlenen olduğu talimatların bu formları başına eklenecektir edebilirsiniz: ADC ADD VE BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD ve XCHG. Intel Instruction Set Reference

bir Geçersiz Opcode İstisna üretecektir Aksi. Yani LOCK CMPXCHG16B burada tek yoldur.

+0

CMPXCHG'de 'LOCK 'önekine mi ihtiyacınız var? Gereksiz görünüyor .. – brooksbp

+0

Intel Komut Seti Referansı ile ilgili olarak bir 'LOCK' gereklidir. "Bu komut, komutun atomik olarak yürütülmesine izin vermek için bir LOCK ön eki ile kullanılabilir. İşlemcinin veri yoluna arabirimi basitleştirmek için, hedef işlenen, karşılaştırma sonucuna bakılmaksızın bir yazma döngüsü alır." – bkausbk

+0

@brooksbp: [kilit olmadan cmpxchg 'kullanım durumları var] (https://stackoverflow.com/a/44273130/224132), ör. MMIO portundan başka bellekte kullanmak için tek işlemcili sistemler. Bu aynı zamanda bellek-hedef 'add' ve eşzamanlılık dışında belirgin kullanımları olan diğer talimatlar ile tutarlı hale getirir. –