GCC-如何重新调整堆栈?[英] GCC - How to realign stack?

本文是小编为大家收集整理的关于GCC-如何重新调整堆栈?的处理方法,想解了GCC-如何重新调整堆栈?的问题怎么解决?GCC-如何重新调整堆栈?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我试图构建一个应用程序,它使用pthreads和__m128 sse类型.根据GCC手册,默认堆叠对齐为16个字节.为了使用__m128,要求是16字节对齐.

我的目标CPU支持SSE.我使用一个不支持运行时堆栈调节(例如-mstackrealign)的GCC编译器.我不能使用任何其他GCC编译器版本.

我的测试应用程序看起来像:

#include <xmmintrin.h>
#include <pthread.h>
void *f(void *x){
   __m128 y;
   ...
}
int main(void){
  pthread_t p;
  pthread_create(&p, NULL, f, NULL);
}

应用程序生成异常和退出.在一个简单的调试(Printf"%p",&y)之后,我发现变量y不是16字节对齐的.

我的问题是:如何正确地重新安静堆栈(16字节)而不使用任何GCC标志和属性(他们没有帮助)?我应该在此帖子函数f()中使用gcc内联汇编程序f()吗?

推荐答案

我已经解决了这个问题. 这是我的解决方案:

void another_function(){
   __m128 y;
   ...
}
void *f(void *x){
asm("pushl    %esp");
asm("subl    $16,%esp");
asm("andl    $-0x10,%esp");
another_function();
asm("popl %esp");
}

首先,我们将堆栈增加了16个字节.其次,我们做出最不显着的蚕食等于0x0.我们使用push/pop操作数保留堆栈指针.我们调用另一个函数,它具有16-byte对齐的所有本地变量.所有嵌套功能也将使其局部变量16字节对齐.

,它有效!

其他推荐答案

在堆栈上分配一个大于sizeof(__m128)的15字节,并使用该阵列中的第一个对齐地址.如果您需要多个,请将它们分配在数组中,单个15字节边距进行对齐.

我不记得如果分配unsigned char array,则使您可以通过编译器的严格别名优化,或者它仅适用于其他方式.

#include <stdint.h>

void *f(void *x)
{
   unsigned char y[sizeof(__m128)+15];
   __m128 *py = (__m128*) (((uintptr_t)&y) + 15) & ~(uintptr_t)15);
   ...
}

其他推荐答案

这不应该在第一个地方发生,而是解决问题,你可以尝试:

void *f(void *x)
{
   __m128 y __attribute__ ((aligned (16)));
   ...
}

本文地址:https://www.itbaoku.cn/post/359283.html