为了账号安全,请及时绑定邮箱和手机立即绑定

_mm_add_epi32的Golang汇编实现

_mm_add_epi32的Golang汇编实现

Go
白衣染霜花 2022-06-21 16:16:00
我正在尝试_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 语法。请注意,寄存器名称不同,并且必须提供大小后缀。


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


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信