我在Go上编写了一个函数,希望在汇编中进行优化。我目前只想为amd64编写它,这是最常见的目标。其他目标的程序集可能会在以后添加。默认情况下,它应使用Go代码。
不幸的是,我没有实现这一目标。查看在线文档,发现必须声明一个外部函数,并为每个可能的目标提供程序集。
我可以提供一个具有不同名称的Go函数,然后在汇编代码中跳转至该函数。这看起来很乏味,我无法确保已为所有可能的目标提供了程序集文件。
是否有提供Go函数的方法,以及在编译特定目标(例如amd64)时使用的替代版本?
答案 0 :(得分:5)
执行此操作的标准方法是至少拥有四个文件,其中三个文件受构建约束(通过使用+build
标记或文件名的保护)。
wrapper.go
package mypkg
import "fmt"
func Wrapper(s string) {
fmt.Println(impl(s))
}
impl_generic.go
// +build !amd64
package mypkg
func impl(s string) string {
// TODO: non-assembly implementation
}
impl_asm.go
// +build amd64
package mypkg
// defined in *.s
func impl(s string) string
impl_amd64.s
TEXT ·impl(SB),$0
// TODO: AMD64 implementation
RET
要为另一种体系结构添加程序集实现,
,!$arch
绑定到第一个impl_generic.go构建约束项$arch
添加到impl_asm.go构建约束列表impl_$arch.s
中编写程序集实现