_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 语法。请注意,寄存器名称不同,并且必须提供大小后缀。
如您所见,为单个操作编写汇编函数毫无意义。采用您需要的算法并完全用汇编编写它可能会更好。
我正在尝试在 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 语法。请注意,寄存器名称不同,并且必须提供大小后缀。
如您所见,为单个操作编写汇编函数毫无意义。采用您需要的算法并完全用汇编编写它可能会更好。