Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 为什么要在ASM中指定变量的地址而不是将其复制到寄存器中?_Gcc_Assembly_Sse_Simd - Fatal编程技术网

Gcc 为什么要在ASM中指定变量的地址而不是将其复制到寄存器中?

Gcc 为什么要在ASM中指定变量的地址而不是将其复制到寄存器中?,gcc,assembly,sse,simd,Gcc,Assembly,Sse,Simd,在我学习在x86_64上使用GCC进行汇编的过程中,我遇到了一些SSE示例,其中不只是将C变量复制到寄存器中,而是将地址复制到EAX中。既然你可以这么做,为什么还要这么做: typedef float v4sf __attribute__((vector_size(16))); typedef union { v4sf v; float f[4]; } Vec4; Vec4 vector.v = (v4sf){ 64.1,128.2,256.3,512.4 }; float

在我学习在x86_64上使用GCC进行汇编的过程中,我遇到了一些SSE示例,其中不只是将C变量复制到寄存器中,而是将地址复制到EAX中。既然你可以这么做,为什么还要这么做:

typedef float v4sf __attribute__((vector_size(16)));

typedef union {
    v4sf v;
    float f[4];
} Vec4;

Vec4 vector.v = (v4sf){ 64.1,128.2,256.3,512.4 };
float blah = 2.2;

__asm__("movups %0, %%xmm0 \n\t"
    "movups %1, %%xmm1 \n\t"
    "shufps $0x00, %%xmm1, %%xmm1 \n\t"
    "mulps %%xmm1, %%xmm0 \n\t"
    "movups %%xmm0, %0 \n\t"
    : "+m"(vector)
    : "m"(blah)
    : "%xmm0","%xmm1"
);
将向量复制到xmm0而不是将其保留在内存中是否会导致性能下降

下面是我所说的英特尔语法的一个示例:

void powf_schlickSSE(const float * a, const float b, float * result){

    __asm {
        mov         eax, a              //load address of vector
        movss       xmm0, dword ptr [b] //load exponent into SSE register
        movups      xmm1, [eax]         //load vector into SSE register
        shufps      xmm0, xmm0, 0       //shuffle b into all floats
        movaps      xmm2, xmm1          //duplicate vector
        mov         eax, result         //load address of result
        mulps       xmm1, xmm0          //xmm1 = a*b
        subps       xmm0, xmm1          //xmm0 = b-a*b
        addps       xmm0, xmm2          //xmm2 = b-a*b+a
        rcpps       xmm0, xmm0          //xmm1 = 1 / (b-a*b+a)
        mulps       xmm2, xmm0          //xmm0 = a * (1 / (b-a*b+a))
        movups      [eax], xmm2         //store result
    }
}

我可以看到多种原因

MSVC英特尔语法代码来自哪个,对吗?不支持将_m128值传递到程序集块,或者至少编写代码的版本不支持。或者,除了通过内联汇编,该版本根本不支持SSE

程序的其余部分不处理向量类型,因此通过指针传递是最简单的解决方案


您能否向我们展示具有您描述的行为的原始代码/程序集?很难说清楚你在问什么。当然,我添加了一个英特尔语法的例子。这个汇编绝对不是最优的。现在,除非你确信自己能打败编译器,否则最好只使用内部函数。你会问,使用xmm寄存器是否比将向量放入内存慢?是否有一个pow函数可以对向量进行操作?如果没有,那么我不需要手动编写吗?