下面的程序集在简单C中是什么意思(这是与gcc一起编译的):
asm volatile
(
"mov.d %0,%4\n\t"
"L1: bge %2,%3,L2\n\t"
"gsLQC1 $f2,$f0,0(%1)\n\t"
"gsLQC1 $f6,$f4,0(%5)\n\t"
"madd.d %0,%0,$f6,$f2\n\t"
"madd.d %0,%0,$f4,$f0\n\t"
"add %1,%1,16\n\t"
"add %2,%2,2\n\t"
"add %5,%5,16\n\t"
"j L1\n\t"
"L2: nop\n\t"
:"=f"(sham)
:"r"(foo),"r"(bar),"r"(ro),"f"(sham),"r"(bo)
:"$f0","$f2","$f4","$f6"
);经过几个小时的搜索和阅读,我提出了以下AT&T语法的汇编代码:
mov.d %xmm0,%xmm1
L1: bge %ebx,%ecx,L2
gsLQC1 $f2,$f0,0(%eax)
gsLQC1 $f6,$f4,0(%esi)
madd.d %xmm0,%xmm0,$f6,$f2
madd.d %xmm0,%xmm0,$f4,$f0
add %eax,%eax,16
add %ebx,%ebx,2
add %esi,%esi,16
jmp L1
L2: nop我正在寻找一种在Windows上运行这个程序的方法,当我想出了一种方法(在修复了我确信已经犯过的所有错误之后),我就会进行更新。
我对x86程序集的经验很少,也就是说,我模糊地认识到这是一个循环,但是我还没有找到gsLQC1指令的含义。或者循环的目的。
如果你有什么问题要问我,我很乐意回答。如果你有什么见解的话,我很想听听。谢谢您抽时间见我。
编辑:
函数本身处理的是执行奇异值分解(SVD),这主要与矩阵有关。
我正在用我自己的一些评论来更新下面的内容,大会的原作者没有写这些,但我80%的信心是正确的,考虑到我对GCC的asm块符号的研究。
asm volatile
(
"mov.d %0,%4\n\t"
"L1: bge %2,%3,L2\n\t"
"gsLQC1 $f2,$f0,0(%1)\n\t"
"gsLQC1 $f6,$f4,0(%5)\n\t"
"madd.d %0,%0,$f6,$f2\n\t"
"madd.d %0,%0,$f4,$f0\n\t"
"add %1,%1,16\n\t"
"add %2,%2,2\n\t"
"add %5,%5,16\n\t"
"j L1\n\t"
"L2: nop\n\t"
:"=f"(sham) /*Corresponds to %0 in the above code*/
:"r"(foo) /*Corresponds to %1*/,"r"(bar) /*%2*/,"r"(ro) /*%3*/,"f"(sham) /*%4*/,"r"(bo) /*%5*/
:"$f0","$f2","$f4","$f6"
);我以为这是在x86,但很可能是错的。我相信以上是为龙芯家族的处理器编写的MIPS64程序集。
谢谢你对这个问题的兴趣。我很感激你能抽出时间。再一次,如果还有其他问题,我很乐意尽力回答。
原始代码可以找到这里,我正在询问的程序集在第189行开始。
发布于 2017-08-20 04:00:17
这并不是一个真正的答案,但也不适合在评论。如果您忽略了几个关键的信息片段(源指令用于什么处理器、参数的数据类型、代码正在做什么等),那么很难找到一个好的答案。
在一般意义上,我会想:
float messy(const float *foo, int bar, int ro, const float *bo)
{
float sham = 0;
while (bar < ro)
{
__m256 a = _mm256_load_ps(foo);
__m256 b = _mm256_load_ps(bar);
__m256 c = _mm256_add_ps(a, a);
__m256 d = _mm256_add_ps(b, b);
foo += 2;
bar += 2;
bo += 2;
}
return sham;
}这是不太正确的,因为(和其他事情一样) sham没有被设置好。但这是个开始的地方。如果没有madd.d做什么的细节(在不知道我们谈论的是什么硬件的情况下很难说出来),这是我所能得到的最好的结果。
为了强调我在评论中说过的话,原来的代码似乎写得不好(修改只读参数、双跳、没有注释等等)。
https://stackoverflow.com/questions/45777742
复制相似问题