2012-12-12 49 views
3

GCC documentation解釋force_align_arg_pointer功能屬性

在Intel x86上,force_align_arg_pointer屬性可以被應用於個人函數定義,生成一個替代prologueepilogue,重新調整所述runtime stack。這支持將與4字節對齊的堆棧運行的傳統代碼與保留16字節堆棧的現代代碼混合起來以用於SSE compatibility。備選序言和結語比普通序言更慢更大,而備選序言則需要scratch register;如果與regparm attribute一起使用,這會降低可用寄存器的數量。 force_align_arg_pointer屬性與嵌套函數不兼容;這被認爲是一個嚴重的錯誤。

具體而言,我想知道什麼是序言,結尾和SSE兼容性?

回答

2

gcc manual

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_liveCALL_USED_REGISTERS確定要恢復的寄存器。

SSE (Streaming SIMD Extensions)是128位CPU寄存器的集合。這些寄存器可以用4,32位標量打包,然後可以同時對4個元素中的每一個執行操作。相比之下,定期組裝中可能需要4次或更多操作來完成相同的操作。