_mm_add_epi32的Golang汇编实现

我正在尝试_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。


白衣染霜花
浏览 155回答 1
1回答

湖上湖

以下是此类添加功能的示例:&nbsp; &nbsp; // func add(x, y [8]int32) [8]int32&nbsp; &nbsp; // q = x + yTEXT ·add(SB),0,$0&nbsp; &nbsp; VMOVDQU x+0(FP), Y0&nbsp; &nbsp; VPADDD&nbsp; Y+32(FP), Y0, Y0&nbsp; &nbsp; VMOVDQU Y0, q+64(FP)&nbsp; &nbsp; VZEROUPPER&nbsp; &nbsp; RET在阅读本代码之前,请先熟悉本文档。不幸的是,Go 风格的程序集(又名 Plan 9 风格的程序集)的文档记录很差。数组按值在堆栈上传递。返回值作为调用者读回的额外最右边的参数传递。(FP)按照我链接到访问函数参数的文档中的说明使用。除此之外,它非常简单。语法类似于(但不等于)AT&T 语法。请注意,寄存器名称不同,并且必须提供大小后缀。如您所见,为单个操作编写汇编函数是毫无意义的。采用您需要的算法并将其完全用汇编语言编写可能会更好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go