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