我正在用 C 编写一个程序,需要进行一些快速的数学计算。我正在使用内联 SSE 汇编指令来获取一些 SIMD 操作(使用压缩双精度浮点数)。我在 Linux 上使用 GCC 进行编译。
我处于需要循环遍历一些数据的情况,并且在计算中使用了一个常数因子。我想在循环期间将该因素隐藏在安全寄存器中,因此我不必每次都重新加载它。
用一些代码来澄清:
struct vect2 {
fltpt x;
fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;
void function()
{
/* get a specific value set up in xmm1, and keep it there for the
* rest of the loop. */
for( int i = 0, i<N; i++ ){
asm(
"Some calculations;"
"on an element of;"
"a data set.;"
"The value in xmm1;"
"is needed;"
);
}
}
我试过用“注册”关键字做一些事情。但如果我没记错的话,看起来我只能保留一个指向该结构的指针(在通用寄存器中)。这将需要在每次迭代中得到尊重,浪费宝贵的时间。
register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */
register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */
我不只是想假设 GCC 不会更改 xmm1 寄存器,这太过分了“恶魔飞出鼻子”之类的事情:-)。所以我希望有一个适当的方法来做到这一点。