Ответ 1
Нет. Вы не должны обнаруживать внекорпоративную выборку инструкции jmp
, если она является частью спекулятивного выполнения, которая оказывается недействительной из-за теста и перехода.
Инструкция cmove__
точно документирована, чтобы вызвать ошибку, если операнд доступа к памяти приведет к ошибке, даже если условие не встретил. Другими словами, это не спекулятивное исполнение. Это часть семантики команд. Это переход к определению, которое условно, а не выборка.
Инструкция jmp
не документирована.
Я не получаю смысл вашего примерного кода, потому что нет условия для операции с памятью *%eax
. Если %eax
содержит нуль, конечно, выборка в безусловном выполнении jmp *%eax
приведет к ошибке. Это правильное поведение. Если вы протестируете %eax
и перейдете к плохой ссылке.
testl %eax, %eax
je .L1
jmp *%eax
.L1:
Не может быть проблемы. Спекулятивное выполнение *%eax
не может вызвать ошибку, если спекуляция не будет действительной, т.е. Истинный путь управления. Это похоже на поведение для неправильных кодов операций, деление на ноль и т.п.: Семантика нормальной программы не зависит от спекулятивного исполнения.
В тех случаях, когда изъятия из-за порядка и магазины действительно вызывают всевозможные интересные проблемы в многопроцессорной обработке. Эта статья, а также ее первая часть в предыдущем выпуске - отличное обсуждение этой темы.