Почему компилятор генерирует пару инструкций push / pop? - PullRequest
7 голосов
/ 14 января 2012

Я скомпилировал приведенный ниже код с помощью компилятора VC ++ 2010:

__declspec(dllexport)
unsigned int __cdecl __mm_getcsr(void) { return _mm_getcsr(); }

и сгенерированный код был:

push ECX
    stmxcsr [ESP]
    mov EAX, [ESP]
pop ECX
retn

Почему существует пара инструкций push ECX / pop ECX?

Ответы [ 3 ]

12 голосов
/ 14 января 2012

Компилятор освобождает место в стеке для хранения MXCSR.Он мог бы одинаково хорошо это сделать:

sub esp,4
stmxcsr [ESP]
mov EAX, [ESP]
add esp,4
retn

Но «push ecx», вероятно, короче или быстрее.

3 голосов
/ 14 января 2012

Здесь используется push для выделения 4 байтов временного пространства. [ESP] обычно указывает на отправленный адрес возврата, который мы не можем перезаписать.

ECX здесь будет перезаписано, однако ECX, вероятно, является энергозависимым регистром в целевом ABI, поэтому функции не должны сохранять ECX.

Причиной использования push / pop здесь является оптимизация пространства (и, возможно, скорости).

0 голосов
/ 14 января 2012

Создает запись о верхушке стека, которую ESP теперь называет целью для инструкции stmxcsr.Затем результат сохраняется в EAX для возврата.

...