Post by Jan BrunsPost by Sebastian BiallasPost by Manuel Emswas bewirkt 'btr'?
Falls Du Dich fragst, warum man ausgerechnet so eine obskure Operation
Warum sollte man sich das fragen?
Weil die Semantik von btr schon hinreichend obskur ist und (auf den
ersten Blick) sehr einfach "simuliert" werden kann.
Post by Jan BrunsBitTest-Befehle sind selbst auf RISC-Systemen häufig vorhanden,
Aber nicht solche, die auch mit Speicher funktionieren. Ein btr
Äquivalent ist mir übrigens auf keiner anderen Architektur bekannt (ich
kenne aber außer x86 nur PowerPC hinreichend gut).
Post by Jan Brunsund mit x86-CISCs haben wir sogar so völlig schräge Dinge wie
bspw. BCD-Rechnungen im Befehlssatz.
Das sind aber Altlasten.
Post by Jan BrunsUnd ich finde, so ein BitTest mit Set/Reset wird doch viel zu oft
tatsächlich benötigt, als daß solche Programmsequenzen wie etwa
Ein Bittest mit Reset lässt sich in 2 Anweisungen zusammenbauen (sofern
die Bitnummer bekannt ist, ein Test + ein (Re)set), bzw 5 Anweisungen
(vorher noch einmal Shiften). Zumindest solange man nicht benötigt, dass
er atomar ist.
Post by Jan BrunsPost by Sebastian BiallasDie Krux ist, dass btr atomar
ausgeführt wird (auf SMP-System braucht er noch ein lock-Präfix), und
sich so hervorragend für Synchronisationsaufgaben eignet.
Verstehe ich nicht. Zum einen kann man dch zahlreiche andere Befehle
ebenfalls mit einem LOCK-Präfix versehen,
Ja und? Es geht hier um die Semantik von btr.
Post by Jan Brunsund zum anderen scheint mir
auch die atomare Ausführung von bspw. "BTR dword ptr[000FFFFF],8"
gar nicht garantiert zu sein.
Und warum?
Post by Jan BrunsZumidest finde ich in der Auflistung
http://support.intel.com/design/pentium4/manuals/index_new.htm
System Programming Guide, Part 1
7.1.1 Guaranteed Atomic Operations
Kann ich gerade nicht drauf zugreifen. Ich denke mal die meinen da etwas
anderes.
Ich kenne folgenden Text:
| Bus-locking may be necessary for certain operations to be atomic on
| multiprocessor machines. According to the Intel documentation this
| is necessary for the following operations:
| - The bit test and modify instructions (BTS, BTR and BTC).
| - The exchange instructions (XADD, CMPXCHG, CMPXCHG8B).
| - The following single-operand arithmetic and logical instructions:
| INC, DEC, NOT, and NEG.
| - The following two-operand arithmetic and logical instructions:
| ADD, ADC, SUB, SBB, AND, OR, and XOR.
| The XCHG instruction is automatically locked.
Post by Jan Brunskeinen Hinweis dazu, und in der Befehlsbeschreibung ist gar nur
definiert, daß das Bit gelöscht wird. Eine Garantie, daß der
Operand nicht "zefetzt" werden könnte, finde ich da nirgends
(ausser man verwendet LOCK, was denn aber doch BTR nicht auszeichnet).
lock brauchst Du nur auf SMP-Systemen. Nun zeig mir doch mal bitte, wie
Du die Semantik eines btr nachbaust, sodass er atomar ist. Ohne
spin-lock mit cmpxchg oder so wird das nicht gehen.
--
Gruß,
Sebastian