re: предложенный вами порядок: нет, компилятор не может изобрести записи в атомарные переменные.
Спекуляция во время выполнения также не может изобрести записи, которые фактически становятся видимыми для других потоков. Он может поместить все, что захочет, в свой собственный буфер частного хранилища, но правильность более ранних веток должна быть проверена, прежде чем хранилище станет видимым для других потоков.
Обычно это работает по порядку выхода на пенсию: инструкция может удалиться (стать не спекулятивной) только после того, как все предыдущие инструкции будут сняты / не спекулятивны. Хранилище не может фиксировать данные из буфера хранилища в кэш L1d до тех пор, пока инструкция хранилища не прекратит работу.
re: название: нет, умозрительное выполнение все еще должно учитывать модель памяти. Если процессор хочет спекулятивно загрузить после неполной загрузочной загрузки, он может, но только если он проверяет , чтобы убедиться, что эти результаты загрузки все еще действительны, когда они «официально» разрешены.
x86 CPU do на практике делают это, потому что сильная модель памяти x86 означает, что все нагрузки являются загрузочными, поэтому любая неупорядоченная загрузка должна быть спекулятивной и откатился, если он не действителен. (Вот почему вы можете получить нюки конвейера неправильной спекуляции порядка памяти.)
Таким образом, asm работает так, как говорят правила ISA, и компиляторы C ++ это знают. Компиляторы используют это для реализации модели памяти C ++ поверх целевой ISA.
Если вы выполняете загрузку в C ++, она действительно работает как загрузочная загрузка.
Вы можете мысленно смоделировать свою логику для возможного переупорядочения во время компиляции + во время выполнения в соответствии с написанными правилами переупорядочения C ++. См http://preshing.com/20120913/acquire-and-release-semantics/.