【问题标题】:Explain force_align_arg_pointer function attribute解释 force_align_arg_pointer 函数属性
【发布时间】:2012-12-12 13:49:22
【问题描述】:

来自GCC documentation

在 Intel x86 上,force_align_arg_pointer 属性可以应用于单个函数定义,生成替换 prologueepilogue 以重新对齐 runtime stack。这支持将使用 4 字节对齐堆栈运行的旧代码与为 SSE compatibility 保留 16 字节堆栈的现代代码混合。交替序幕和尾声比普通的更慢更大,交替序幕需要scratch register;如果与regparm attribute 结合使用,这会降低可用寄存器的数量。 force_align_arg_pointer 属性与嵌套函数不兼容;这被认为是一个硬错误。

具体来说,我想知道什么是序言、尾声和 SSE 兼容性?

【问题讨论】:

    标签: c linux gcc x86 function-attributes


    【解决方案1】:

    来自gcc manual

    void TARGET_ASM_FUNCTION_PROLOGUE (FILE *file, HOST_WIDE_INT size)
    

    序言负责设置栈帧,初始化帧指针寄存器,保存必须保存的寄存器,为局部变量分配size额外的存储字节。 file 是一个标准输出流,汇编代码应该输出到该流。

    在具有“寄存器窗口”的机器上,函数入口代码不会将窗口中的寄存器保存在堆栈中,即使它们应该由函数调用保留;相反,如果函数中使用了任何非调用使用的寄存器,它会采取适当的步骤来“推送”寄存器堆栈。

    在函数可能有也可能没有帧指针的机器上,函数入口代码必须相应变化;如果需要,它必须设置帧指针,否则不设置。要确定是否需要帧指针,宏可以引用变量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 次或更多操作才能完成相同的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-30
      • 2013-11-23
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-12
      • 2012-11-10
      相关资源
      最近更新 更多