drygauost253590142
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函数,然后在汇编代码中跳转至该函数。 这看起来很乏味,我无法确保已为所有可能的目标提供了程序集文件。

是否可以提供Go函数,以及在针对特定目标(例如amd64)进行编译时要使用的替代版本?

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

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

    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
    

    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
    点赞 评论

相关推荐 更多相似问题