具有后备功能的汇编功能实现

时间:2018-07-28 11:17:12

标签: go assembly

我在Go上编写了一个函数,希望在汇编中进行优化。我目前只想为amd64编写它,这是最常见的目标。其他目标的程序集可能会在以后添加。默认情况下,它应使用Go代码。

不幸的是,我没有实现这一目标。查看在线文档,发现必须声明一个外部函数,并为每个可能的目标提供程序集。

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

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

1 个答案:

答案 0 :(得分: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))
}

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

要为另一种体系结构添加程序集实现,

  1. 将Concat ,!$arch绑定到第一个impl_generic.go构建约束项
  2. $arch添加到impl_asm.go构建约束列表
  3. impl_$arch.s中编写程序集实现