tools/asm2arm_tool/README.md
asm2arm_tool 是一个用于将 ARM64 汇编代码转换为 Go 语言可调用代码的工具,支持 JIT 和静态链接两种模式。
构建依赖
编译器需要支持C++17与完整的SVE支持,推荐GCC9或者CLANG9以上版本
构建工具
cd tools/asm2arm_tool/scripts
bash build_tool.sh
构建脚本会:
tools/asm2arm_tool/llvm-projecttools/asm2arm_tool/build/llvm-build构建LLVM(仅启用clang和lld)tools/asm2arm_tool/build/llvm-install 目录tools/asm2arm_tool/build构建asm2arm_tool工具运行测试
native与recover测试:
cd tools/asm2arm_tool/scripts
bash test_native_recover.sh
test_native_recover.sh测试脚本会:
internal/native/neon 下的文件到 output/neon 目录internal/native/sve_linkname 下的文件到 output/sve_linkname 目录internal/native/sve_wrapgoc 下的文件到 output/sve_wrapgoc 目录generate_native_go.sh 生成对应平台的go代码文件到上述output/neon、output/sve_linkname、output/sve_wrapgoc目录encoder与api测试:
cd tools/asm2arm_tool/scripts
bash test_encoder_api.sh
test_encoder_api.sh测试脚本会:
| 选项 | 描述 | 必需 |
|---|---|---|
--mode | 工具模式:JIT 或 SL | 是 |
--source | 输入汇编文件路径 | 是 |
--output | 生成的 Go 文件输出路径 | 是 |
--link-ld | 链接脚本路径 | 是 |
--package | 生成的 Go 文件所属的包名 | 是 |
--features | 特性,如 +sve,+aes | 否 |
--debug | 启用调试输出 | 否 |
| 选项 | 描述 | 必需 |
|---|---|---|
--tmpl | 模板文件路径 | 是 |
| 选项 | 描述 | 必需 |
|---|---|---|
--goproto | Go 函数接口声明文件路径 | 是 |
cd tools/asm2arm_tool
./build/asm2arm_tool --help
./build/asm2arm_tool --mode JIT --source input.s --output output_dir --link-ld scripts/link.ld --package sve_wrapgoc --tmpl input.tmpl
执行完成后,会在output_dir下生成对应的input_subr.go、input_text_arm64.go、input.go三个文件
./build/asm2arm_tool --mode SL --source input.s --output output_dir --link-ld scripts/link.ld --package sve_linkname --goproto input_arm64.go
执行完成后,会在output_dir下生成对应的input_subr_arm64.go、input_arm64.s两个文件
输入给工具的汇编文件,在生成时可参考下列选项:
${CLANG_PATH} \
-g0 -fverbose-asm -fstack-usage -fsigned-char -Wa,--no-size-directive -fno-ident -fno-jump-tables \
-ffixed-x28 -ffixed-x9 -Wno-error -Wno-nullability-completeness -Wno-incompatible-pointer-types \
-mllvm=--go-frame -mllvm=--enable-shrink-wrap=0 -mno-red-zone \
-fno-stack-protector -nostdlib -O3 -fno-asynchronous-unwind-tables -fno-builtin -fno-exceptions \
-march=armv8-a -I${SIMDE_INCLUDE_DIR} -S -o "${asm_file}" "${src_file}"