具有回退的汇编函数实现

chm*_*ike 4 assembly go

我有一个写在Go上的函数,我想在汇编中进行优化.我目前只想为amd64编写它,这是最常见的目标.稍后可以添加其他目标的组装.默认情况下,它应该使用Go代码.

不幸的是,我无法实现这一目标.看看我在网上发现的文件,我必须声明一个外部函数,并为每个可能的目标提供程序集.

我可以提供一个具有不同名称的Go函数,然后在汇编代码中跳转到它.这看起来很乏味,我无法确保为所有可能的目标提供了汇编文件.

有没有办法提供Go函数,以及在编译特定目标时使用的替代版本(例如amd64)?

Tim*_*per 5

执行此操作的标准方法是至少有四个文件,其中三个受构建约束的保护,可以使用+build标记或文件名.

  • wrapper.go:
    • 包含函数和文档,用于调用有条件编译的实现函数的包装函数
  • impl_generic.go
    • 针对非优化平台实施
  • impl_asm.go
    • 任何程序集实现的函数声明
  • impl_amd64.s
    • amd64汇编实现你的函数

wrapper.go

package mypkg

import "fmt"

func Wrapper(s string) {
    fmt.Println(impl(s))
}
Run Code Online (Sandbox Code Playgroud)

impl_generic.go

// +build !amd64

package mypkg

func impl(s string) string {
    // TODO: non-assembly implementation
}
Run Code Online (Sandbox Code Playgroud)

impl_asm.go

// +build amd64

package mypkg

// defined in *.s

func impl(s string) string
Run Code Online (Sandbox Code Playgroud)

impl_amd64.s

TEXT ·impl(SB),$0
    // TODO: AMD64 implementation
    RET
Run Code Online (Sandbox Code Playgroud)

要为另一个体系结构添加程序集实现:

  1. Concat ,!$arch到第一个impl_generic.go构建约束项
  2. 添加$arch到impl_asm.go构建约束列表
  3. 编写汇编实现 impl_$arch.s