drygauost253590142 2018-07-28 11:17
浏览 80
已采纳

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

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) ?

  • 写回答

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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据