以下程序集在简单 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)。
我正在用我自己的一些评论更新下面的内容,程序集的原始作者没有写这些,但鉴于我对 GCC 的 asm 块表示法的研究,我有 80% 的信心它们是正确的。
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 程序集。
感谢您对这个问题的兴趣。我很感激你的时间。同样,如果有任何其他问题,我很乐意尽力回答。
PS原始代码可以在这里找到,我要问的程序集从第189行开始