Смотрите следующий код:
// sparc RMO ia64 x86
// ---------------------------------------------------------------------
// fence membar #LoadStore | mf lock addl 0,(sp)
// #StoreStore |
// #LoadLoad |
// #StoreLoad
//
// release membar #LoadStore | st.rel [sp]=r0 movl $0,<dummy>
// #StoreStore
// st %g0,[]
//
// acquire ld [%sp],%g0 ld.acq <r>=[sp] movl (sp),<r>
// membar #LoadLoad |
// #LoadStore
//
// release_store membar #LoadStore | st.rel <store>
// #StoreStore
// st
//
// store_fence st st lock xchg
// fence mf
//
// load_acquire ld ld.acq <load>
// membar #LoadLoad |
// #LoadStore
Приведенный выше код является реализацией абстрактной инструкции acqu / release / fence на другой платформе, я просто хочу узнать реализацию x86.
Можете ли вы объяснить инструкции ниже для меня?
How 'movl $0,<dummy>' represent release?
How 'movl (sp),<r>' represent acquire?
How '<store>' represent release_store?
How 'lock xchg' represent store_fence?
How '<load>' represent load_acquire?
Код из jdk8 / openjdk / hotspot / src / share / vm / runtime / OrderAddress.hpp, «Модель порядка доступа к памяти»
Если вы заняты, вы можете просто сказать мне, где я могу найти информацию о наборе команд для различных архитектур ЦП.
У x86 есть «модель сильной памяти», что означает, что каждая машинная инструкция неявно сопровождается семантикой получения и выпуска. Вы можете дополнительно прочитать этот, а также ответы на этот вопрос.