Объясните атрибут функции force_align_arg_pointer

Из документации GCC

На Intel x86 force_align_arg_pointer Атрибут может применяться к отдельным определениям функций, генерируя альтернативные prologue а также epilogue это выравнивает runtime stack, Это поддерживает смешивание устаревших кодов, которые работают с 4-байтовым выровненным стеком, с современными кодами, которые поддерживают 16-байтовый стек для SSE compatibility, Альтернативный пролог и эпилог медленнее и крупнее обычных, а альтернативный пролог требует scratch register; это уменьшает количество доступных регистров, если они используются вместе с regparm attribute, force_align_arg_pointer атрибут несовместим с вложенными функциями; это считается серьезной ошибкой.

В частности, я хочу знать, что такое пролог, эпилог и совместимость с SSE?

1 ответ

Решение

Из руководства по gcc:

void TARGET_ASM_FUNCTION_PROLOGUE (FILE *file, HOST_WIDE_INT size)

Пролог отвечает за настройку кадра стека, инициализацию регистра указателя кадра, сохранение регистров, которые должны быть сохранены, и распределение size дополнительные байты памяти для локальных переменных. file поток stdio, в который должен быть выведен код ассемблера

На машинах с "окнами регистров" код входа в функцию не сохраняет в стеке регистры, которые находятся в окнах, даже если предполагается, что они сохраняются при вызове функций; вместо этого он предпринимает соответствующие шаги, чтобы "протолкнуть" стек регистров, если в функции используются какие-либо неиспользуемые регистры.

На машинах, где функции могут иметь или не иметь указатели фреймов, код входа в функцию должен изменяться соответственно; он должен установить указатель кадра, если он нужен, а не иначе. Чтобы определить, нужен ли указатель кадра, макрос может обратиться к переменной frame_pointer_needed, Значение переменной будет 1 во время выполнения в функции, которая нуждается в указателе кадра.

void TARGET_ASM_FUNCTION_EPILOGUE (FILE *file, HOST_WIDE_INT size)

Если определено, функция, которая выводит код ассемблера для выхода из функции. Эпилог отвечает за восстановление сохраненных регистров и указателя стека на их значения при вызове функции и за возврат управления вызывающей стороне. Этот макрос принимает те же аргументы, что и макрос TARGET_ASM_FUNCTION_PROLOGUEи регистры для восстановления определяются из regs_ever_live а также CALL_USED_REGISTERS таким же образом.

SSE (Streaming SIMD Extensions) это набор 128-битных регистров процессора. Эти регистры могут быть упакованы с 4, 32-битными скалярами, после чего операция может быть выполнена для каждого из 4 элементов одновременно. В отличие от этого может потребоваться 4 или более операций в обычной сборке, чтобы сделать то же самое.

Другие вопросы по тегам