我正在尝试_mm_add_epi32在 golang 程序集中实现,可选地在 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是我们需要的,但不知道如何将切片转换为[]byte256 位寄存器YMM。
1 回答
湖上湖
TA贡献2003条经验 获得超2个赞
以下是此类添加功能的示例:
// func add(x, y [8]int32) [8]int32
// q = x + y
TEXT ·add(SB),0,$0
VMOVDQU x+0(FP), Y0
VPADDD Y+32(FP), Y0, Y0
VMOVDQU Y0, q+64(FP)
VZEROUPPER
RET
在阅读本代码之前,请先熟悉本文档。不幸的是,Go 风格的程序集(又名 Plan 9 风格的程序集)的文档记录很差。
数组按值在堆栈上传递。返回值作为调用者读回的额外最右边的参数传递。(FP)按照我链接到访问函数参数的文档中的说明使用。
除此之外,它非常简单。语法类似于(但不等于)AT&T 语法。请注意,寄存器名称不同,并且必须提供大小后缀。
如您所见,为单个操作编写汇编函数是毫无意义的。采用您需要的算法并将其完全用汇编语言编写可能会更好。
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报
0/150
提交
取消