首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解为gcc编写的asm块

理解为gcc编写的asm块
EN

Stack Overflow用户
提问于 2017-08-20 01:43:57
回答 1查看 230关注 0票数 0

下面的程序集在简单C中是什么意思(这是与gcc一起编译的):

代码语言:javascript
复制
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语法的汇编代码:

代码语言:javascript
复制
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块符号的研究。

代码语言:javascript
复制
    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行开始。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-20 04:00:17

这并不是一个真正的答案,但也不适合在评论。如果您忽略了几个关键的信息片段(源指令用于什么处理器、参数的数据类型、代码正在做什么等),那么很难找到一个好的答案。

在一般意义上,我会想:

代码语言:javascript
复制
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做什么的细节(在不知道我们谈论的是什么硬件的情况下很难说出来),这是我所能得到的最好的结果。

为了强调我在评论中说过的话,原来的代码似乎写得不好(修改只读参数、双跳、没有注释等等)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45777742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档