我有一个写在Go上的函数,我想在汇编中进行优化.我目前只想为amd64编写它,这是最常见的目标.稍后可以添加其他目标的组装.默认情况下,它应该使用Go代码.
不幸的是,我无法实现这一目标.看看我在网上发现的文件,我必须声明一个外部函数,并为每个可能的目标提供程序集.
我可以提供一个具有不同名称的Go函数,然后在汇编代码中跳转到它.这看起来很乏味,我无法确保为所有可能的目标提供了汇编文件.
有没有办法提供Go函数,以及在编译特定目标时使用的替代版本(例如amd64)?
执行此操作的标准方法是至少有四个文件,其中三个受构建约束的保护,可以使用+build标记或文件名.
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)
要为另一个体系结构添加程序集实现:
,!$arch到第一个impl_generic.go构建约束项$arch到impl_asm.go构建约束列表impl_$arch.s