go - 具有回退功能的汇编函数实现

标签 go assembly

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

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

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

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

最佳答案

执行此操作的标准方法是拥有至少四个文件,其中三个受构建约束保护,通过使用 +build 标记或文件名。

  • wrapper.go:
    • 包含调用条件编译实现函数的包装函数的函数和文档
  • impl_generic.go
    • 未优化平台的 Go 实现
  • impl_asm.go
    • 任何程序集实现的函数声明
  • impl_amd64.s
    • 函数的 amd64 汇编实现

包装器.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中编写程序集实现

关于go - 具有回退功能的汇编函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51570867/

相关文章:

go - 如何在没有嵌套循环的情况下将嵌套结构塑造成另一个结构?

go - 关于 Go 中 channel 方向和阻塞的混淆

assembly - 实模式 x86 ASM : How are the Basics Done?

去代理中间件并修改响应

go - 在 CentOS 7 上将 Go 作为守护进程网络服务器运行

c++ - 将Windows上运行的Delphi中的汇编函数转换为delphi/c++以在Linux上执行

内联汇编的 gcc 编译错误 : operand type mismatch for ljmp

assembly - SSE4.1 带溢出的无符号整数比较

assembly - 什么时候可以在汇编语言中使用*?

go - 在我的案例中,如何以正确的方式测试方法?