相关疑难解决方法(0)

在GNU C inline asm中,对于单个操作数,xmm/ymm/zmm的修饰符是什么?

在尝试使用内在函数和汇编来回答嵌入式广播时,我试图做这样的事情:

__m512 mul_broad(__m512 a, float b) {
    int scratch = 0;
    asm(
        "vbroadcastss  %k[scalar], %q[scalar]\n\t"  // want  vbr..  %xmm0, %zmm0
        "vmulps        %q[scalar], %[vec], %[vec]\n\t"

        // how it's done for integer registers
        "movw         symbol(%q[inttmp]), %w[inttmp]\n\t"  // movw symbol(%rax), %ax
        "movsbl        %h[inttmp], %k[inttmp]\n\t"  // movsx %ah, %eax
        : [vec] "+x" (a), [scalar] "+x" (b),  [inttmp] "=r" (scratch)
        :
        :
    );
    return a;
}
Run Code Online (Sandbox Code Playgroud)

GNU C 86操作数修饰符文档仅指定到改性剂q(DI(DoubleInt)尺寸,64位).使用q一个向量寄存器总会带给它归结为xmm(从ymmzmm). …

c assembly gcc sse avx512

15
推荐指数
1
解决办法
3062
查看次数

标签 统计

assembly ×1

avx512 ×1

c ×1

gcc ×1

sse ×1