_mm_add_epi32的golang汇编工具

Golang assembly implement of _mm_add_epi32

我正在尝试在 golang 程序集中实现 _mm_add_epi32,可以选择在 avo 的帮助下。但是我对汇编知之甚少,甚至不知道如何开始。你能给我一些代码提示吗?谢谢大家

这是等效的较慢的 golang 版本:

func add(x, y []uint32) []uint32 {
    if len(x) != len(y) {
        return nil
    }

    result := make([]uint32, len(x))
    for i := 0; i < len(x); i++ {
        result[i] = x[i] + y[i]
    }
    return result
}

我知道 paddq xmm, xmm 是我们需要的,但是不知道如何将 []byte 的 slice 转换为 256 位寄存器 YMM.

下面是这样一个加法函数的例子:

    // func add(x, y [8]int32) [8]int32
    // q = x + y
TEXT ·add(SB),0,[=10=]
    VMOVDQU x+0(FP), Y0
    VPADDD  Y+32(FP), Y0, Y0
    VMOVDQU Y0, q+64(FP)
    VZEROUPPER
    RET

阅读此代码之前,请先熟悉 this document。不幸的是,Go-style 程序集(又名 Plan 9 式程序集)的文档很少。

数组按值在堆栈上传递。 return 值作为额外的最右边参数传递,由调用者读回。按照我链接的文档中的说明使用 (FP) 来访问函数参数。

除此之外,它非常简单。语法类似于(但不等于)AT&T 语法。请注意,寄存器名称不同,并且必须提供大小后缀。

如您所见,为单个操作编写汇编函数毫无意义。采用您需要的算法并完全用汇编编写它可能会更好。