2018-07-28 11:17
浏览 70


I have a function written on Go that I would like to optimize in assembly. I currently only want to write it for amd64 which is the most frequent target. Assembly for other targets may be added later. By default it should use the Go code.

Unfortunately I didn't manage to achieve this. Looking at the documentation I found online it seam that I have to declare an external function, and provide the assembly for every possible target.

I can provide a Go function with a different name, and then in the assembly code jump to it. This looks tedious and I can't ensure I have provided the assembly file for all possible targets.

Is there a way to provide a Go function, and an alternate version to use instead when compiling for particular targets (e.g. amd64) ?

图片转代码服务由CSDN问答提供 功能建议

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

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

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


  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dongshun1884 2018-07-28 11:34

    The standard way to do this is to have at least four files, three of which are protected by build constraints, either by use of the +build tag or by the filename.

    • wrapper.go:
      • Contains function and documentation for a wrapper function which calls the conditionally compiled implementation function
    • impl_generic.go
      • Go implementation for non-optimized platforms
    • impl_asm.go
      • Function declaration of any assembly implementations
    • impl_amd64.s
      • amd64 assembly implementation of your function


    package mypkg
    import "fmt"
    func Wrapper(s string) {


    // +build !amd64
    package mypkg
    func impl(s string) string {
        // TODO: non-assembly implementation


    // +build amd64
    package mypkg
    // defined in *.s
    func impl(s string) string


    TEXT ·impl(SB),$0
        // TODO: AMD64 implementation

    To add an assembly implementation for another architecture:

    1. Concat ,!$arch to the first impl_generic.go build constraint item
    2. Add $arch to the impl_asm.go build constraint list
    3. Write the assembly implementation in impl_$arch.s
    点赞 评论

相关推荐 更多相似问题