如何使用 GNU GAS 或 LLVM 汇编 ARM SVE 指令并在 QEMU 上运行?

2023-12-15

我想玩新的ARM SVE指令使用开源工具。

首先,我想组装一个最小的示例:https://developer.arm.com/docs/dui0965/latest/getting-started-with-the-sve-compiler/assemble-sve-code

// example1.s
    .global main
main:
    mov     x0, 0x90000000
    mov     x8, xzr
    ptrue   p0.s                        //SVE instruction
    fcpy    z0.s, p0/m, #5.00000000     //SVE instruction
    orr     w10, wzr, #0x400
loop:
    st1w    z0.s, p0, [x0, x8, lsl #2]  //SVE instruction
    incw    x8                          //SVE instruction
    whilelt p0.s, x8, x10               //SVE instruction
    b.any   loop                        //SVE instruction
    mov     w0, wzr
    ret

然而,当我在 Ubuntu 16.04 上尝试时:

sudo apt-get install binutils-aarch64-linux-gnu
aarch64-linux-gnu-as example1.S

它无法识别任何 SVE 汇编指令,例如:

example1.S:6: Error: unknown mnemonic `ptrue' -- `ptrue p0.s'

我认为这是因为我的 GNU AS 2.26.1 太旧了,还没有 SVE 支持。

我也可以使用 LLVM 或任何其他开源汇编器。

一旦我成功组装,我就想在 QEMU 用户模式下运行它,因为3.0.0 有 SVE 支持.


带有断言的自动化示例

  • usage
  • source

下面我描述了这个例子是如何实现的。

Assembly

The aarch64-linux-gnu-asUbuntu 18.04 中的 2.30 对于 SVE 来说已经足够新了,如下所示:https://sourceware.org/binutils/docs-2.30/as/AArch64-Extensions.html#AArch64-Extensions

否则,在 Ubuntu 16.04 上从源代码编译 Binutils 很容易,只需执行以下操作:

git clone git://sourceware.org/git/binutils-gdb.git
cd binutils-gdb
# master that I tested with.
git checkout 4de5434b694fc260d02610e8e7fec21b2923600a
./configure --target aarch64-elf --prefix "$(pwd)/ble"
make -j `nproc`
make install

我没有检查标签,因为最后一个标签已经有几个月了,而且我不想在引入 SVE 时 grep 日志消息;-)

然后使用编译好的as并链接到 Ubuntu 16.04 上打包的 GCC:

./binutils-gdb/ble/bin/aarch64-elf-as -c -march=armv8.5-a+sve \
    -o example1.o example1.S
aarch64-linux-gnu-gcc -march=armv8.5-a -nostdlib -o example1 example1.o

在 Ubuntu 16.04 上,aarch64-linux-gnu-gcc5.4 没有-march=armv8.5-a,所以只需使用-march=armv8-a应该没问题。无论如何,Ubuntu 16.04 和 18.04 都没有-march=armv8-a+sve当它到达时,这将是最好的选择。

或者,不要通过-march=armv8.5-a+sve,您还可以将以下内容添加到开头.S源代码:

.arch armv8.5-a+sve

在Ubuntu 19.04 Binutils 2.32上,我还了解并测试了:

aarch64-linux-gnu-as -march=all

这也适用于 SVE,我想我将来会更多地使用它,因为它似乎一次性启用了所有功能,而不仅仅是 SVE!

QEMU 模拟

在 QEMU 上进行单步调试的过程解释如下:如何在 QEMU 上的 GDB 中单步执行 ARM 汇编?

首先,我将示例制作成一个最小的自包含 Linux 可执行文件:

.data
    x: .double        1.5,  2.5,  3.5,  4.5
    y: .double        5.0,  6.0,  7.0,  8.0
    y_expect: .double 8.0, 11.0, 14.0, 17.0
    a: .double        2.0
    n: .word          4

.text
.global _start
_start:
    ldr x0, =x
    ldr x1, =y
    ldr x2, =a
    ldr x3, =n
    bl daxpy

    /* exit */
    mov x0, #0
    mov x8, #93
    svc #0


/* Multiply by a scalar and add.
 *
 * Operation:
 *
 *      Y += a * X
 *
 * C signature:
 *
 *      void daxpy(double *x, double *y, double *a, int *n)
 *
 * The name "daxpy" comes from LAPACK:
 * http://www.netlib.org/lapack/explore-html/de/da4/group__double__blas__level1_ga8f99d6a644d3396aa32db472e0cfc91c.html
 *
 * Adapted from: https://alastairreid.github.io/papers/sve-ieee-micro-2017.pdf
 */
daxpy:
    ldrsw x3, [x3]
    mov x4, #0
    whilelt p0.d, x4, x3
    ld1rd z0.d, p0/z, [x2]
.loop:
    ld1d z1.d, p0/z, [x0, x4, lsl #3]
    ld1d z2.d, p0/z, [x1, x4, lsl #3]
    fmla z2.d, p0/m, z1.d, z0.d
    st1d z2.d, p0, [x1, x4, lsl #3]
    incd x4
    whilelt p0.d, x4, x3
    b.first .loop
    ret

您可以使用以下命令运行它:

qemu-aarch64 -L /usr/aarch64-linux-gnu -E LD_BIND_NOW=1 ./example1

然后它就很好地退出了。

接下来,我们可以进行调试以确认总和确实已完成:

qemu-aarch64 -g 1234 -L /usr/aarch64-linux-gnu -E LD_BIND_NOW=1 ./example1

and:

./binutils-gdb/ble/bin/aarch64-elf-gdb -ex 'file example1' \
  -ex 'target remote localhost:1234' -ex 'set sysroot /usr/aarch64-linux-gnu'

现在,紧随其后bl daxpy,然后运行:

>>> p (double[4])y_expect
$1 = {[0] = 8, [1] = 11, [2] = 14, [3] = 17}
>>> p (double[4])y
$2 = {[0] = 8, [1] = 11, [2] = 14, [3] = 17}

这证实了这笔款项实际上是按预期完成的。

观察 SVE 寄存器似乎未实现,因为我在以下位置找不到任何内容:https://github.com/qemu/qemu/tree/v3.0.0/gdb-xml但是通过复制其他FP寄存器来实现应该不会太难吧?询问于:http://lists.nongnu.org/archive/html/qemu-discuss/2018-10/msg00020.html

您目前已经可以通过执行以下操作来部分和间接地观察它:

i r d0 d1 d2

因为SVE寄存器的第一个条目zX与长者共享vXFP 注册了,但我们看不到p at all.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 GNU GAS 或 LLVM 汇编 ARM SVE 指令并在 QEMU 上运行? 的相关文章

  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 使用可加载内核模块修改帧缓冲区(/dev/graphics/fb0)参数

    Problem 我必须配置 Android 平台使用的各种 LCD 显示器 几乎在所有情况下 都没有针对感兴趣的 LCD 显示器免费提供的电气规格 但通过经验和逆向工程 可以很好地猜测参数 我正在尝试使用可加载内核模块来微调显示参数 也欢迎
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 我们可以优化代码来降低功耗吗?

    有没有什么技术可以优化代码以确保更低的功耗 架构是ARM 语言是C 来自 ARM 技术参考网站 ARM11 MPCore 的特性 提高能源效率的处理器 效率包括 准确的分支和子程序返回预测 减少数量 错误的指令获取和 解码操作 使用物理寻址
  • 为什么无符号类型在arm cpu中效率更高?

    我正在阅读手臂手册并提出这个建议 但没有提到原因 为什么无符号类型更快 在 ARMv4 之前 ARM 没有对加载半字和有符号字节的本机支持 要加载有符号的字节 你必须LDRB然后对值进行符号扩展 LSL那就起来吧ASR它回落 这很痛苦所以c
  • ARM NEON:如何实现 256 字节查找表

    我正在使用内联汇编将我编写的一些代码移植到 NEON 我需要的一件事是将范围 0 128 的字节值转换为表中采用完整范围 0 255 的其他字节值 该表很短 但其背后的数学并不容易 因此我认为不值得每次 即时 计算它 所以我想尝试查找表 我
  • 如何创建具有自定义外设和内存映射的 QEMU ARM 机器?

    我正在为 Cortex M3 cpu 编写代码 并且正在使用以下命令执行单元测试qemu arm二进制 现在一切都很好 但我想知道我是否能够使用测试整个系统qemu system arm 我的意思是 我想为 qemu 编写自定义 机器 我将
  • ARM 汇编不能同时使用立即值和 ADDS/ADCS

    我目前正在尝试使用汇编来加速 Cortex M0 Freescale KL25Z 上的一些 C 函数 我遇到这个最小测试程序的问题 syntax unified cpu cortex m0 text global test code 16
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • 理解这部分手臂的汇编代码

    syntax unified thumb cpu cortex m4 arch armv7e m fpu fpv4 sp d16 Changes from unprivileged to privileged mode thumb func
  • 使用 GCC 编译器为代码的特定部分保留寄存器

    是否可以为 C 代码的特定部分保留寄存器 ffixed reg 选项或声明全局寄存器变量不是我正在寻找的答案 我想保留特定范围 比如说特定函数 的寄存器值 使用局部寄存器变量是不可能的 因为它不能保证在整个范围内保留寄存器的值 我正在寻找类
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • AOSP 的“午餐”组合是什么意思?我需要选择什么?

    我是 Android 设备 ROM 开发的新手 无论如何 我现在正在为具有 64 位处理器的中国设备构建 AOSP 我按照 source android com 上的菜单进行操作 当我运行 午餐 命令时 终端显示 午餐菜单 选择一个组合 我
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点

随机推荐

  • 从c中的另一个文件链接静态函数

    我有两个源文件 A c 和 B c A c 有一个函数 call me static int call me void call me register register call me call me 正如你所看到的 call me函数被
  • 从 UWP 应用程序中提取图标

    在尝试实现 打开方式 功能时 我遇到了从 UWP 应用程序提取图标的问题 因此 在收到推荐的应用程序列表后 借助以下命令打开特定文件SHAssocEnumHandlers 我试图在以下命令的帮助下提取每个应用程序的图标IAssocHandl
  • Windows 上 Boost.Python 1.54(调试版本)对 Python27.lib 的令人困惑的依赖关系

    我一定犯了某种明显的错误 但经过几个小时的战斗 我无法取得进一步的进展 升级到 Boost 1 54 CMake 2 8 12 和 Python 2 7 5 所有三个均来自slightly早期的次要版本 我的 Python 绑定projec
  • 如何获取 Pandas 数据框中所有非 NaN 项的行、列索引

    如何迭代如下所示的数据帧并将非 NaN 值位置作为元组返回 IE df 0 1 2 0 NaN NaN 1 1 1 NaN NaN 2 NaN 2 NaN 我会得到 0 1 2 0 1 2 的输出 最好的方法是执行嵌套 for 循环吗 或者
  • C++中M个盒子中N个球的组合列表

    我想编写一个函数 生成一个元组数组 其中包含 C 中 M 个盒子中 N 个球的所有可能排列 顺序 编辑 在结果列表中 并不重要 只是第一个必须是 N 0 0 和最后一个 0 0 N 我在网上没有找到这样的C 实现 只有字符的排列或排列数量的
  • 如何在 matplotlib 中使用交互式事件编辑表格数据

    在图中创建了一个表格 现在我想在双击单元格后编辑表格 添加 删除或修改该单元格中的数据 就像Excel中的编辑功能一样 我的python版本是3 64 代码如下 import matplotlib pyplot as plt import
  • 如何使用列表理解生成不同 lambda 函数的列表?

    这个问题是从涉及 Tkinter 按钮回调函数的原始应用程序中提炼出来的 这是说明该行为的一行 lambdas lambda i for i in range 3 如果您随后尝试调用生成的 lambda 函数 lambdas 0 lambd
  • mechanize 标签 br.set_handle_gzip 的作用是什么?

    我正在尝试 python mechanize 模块来编写一些脚本 当我运行它时 出现以下错误 set handle gzip 实际上是什么 manoj ubuntu pyth python rock py rock py 15 UserWa
  • 如何使用 Watir-Webdriver 不等待

    所以我正在编写一个 watir webdriver 脚本 并且我的应用程序正在使用 javascript 来呈现我想要与之交互的模式窗口 当我单击显示模态窗口的元素时 watir webdriver 只是坐在那里 直到最终超时 我在控制台窗
  • 撤销git中已删除的文件?

    新手需要一些帮助来解决混乱 我试图将我的网站推送到 git 存储库 所以我使用了 git add 命令 然后 在提交之前 我意识到我已经添加了根文件夹中的所有内容 而不仅仅是我想要的目录 由于我不想进行该提交 因此我使用 git rm ch
  • 大熊猫的累计不同计数

    我有一个数据框 其中有一列名为group另一列称为country 我想创建一个新列 输出不同值的累积计数country列同时分组group column 原始数据框 group country A usa A germany A germa
  • 如何比较 char* 和 NSString?

    您好 我正在比较数据库中的 UserName char 和 UITextField 中的 UserName NSString 这个怎么做 以下是我的代码 if UserName isEqual char sqlite3 column tex
  • htaccess 阻止热链接图像中的域

    我阻止了文件中的一些站点 但它们不断访问我的服务器并要求提供会减慢我的服务器速度的图像 我如何为它们添加规则 以便它们会看到大红色标志 停止热链接 RewriteEngine on RewriteCond HTTP REFERER Rewr
  • Rails 3 自定义 mime 类型 - 默认视图格式

    我需要渲染一些没有布局的视图 要跳过控制器操作中的 render layout gt false 行和 if else 逻辑 我有自定义 mime 类型 例如 phtml 纯 html Mime Type register text pht
  • 在 Bicep 模板上设置 Azure 应用服务服务器堆栈

    我正在尝试使用 Azure CLI 中的 Bicep 模板在 Linux 上部署 NET Core 3 1 Azure 应用服务 应用程序服务和相应的应用程序服务计划已正确部署 但 Azure 门户上的应用程序服务堆栈设置为空 我必须手动设
  • 当 WIFI 网络没有互联网连接时,.net 或 Xamarin 互联网可用性检查

    我知道如何检查设备是否有可用的互联网连接是一个大讨论 我尝试了 Ping WebClient 和 HTTPClient 我还使用 Xamarin Essentials 和连接插件 所有这些事情都有效 只需向谷歌或您选择的服务器发出请求 您就
  • Android:Vimeo 视频无法在 webview 中播放

    我必须在 webview 中播放 vimeo 视频 请考虑以下代码 当我播放它时 它只播放音频 但视频是黑色的 我正在使用下面的代码 WebSettings s wv getSettings wv setWebChromeClient ne
  • 有没有办法去掉重音符号并将整个字符串转换为常规字母?

    除了使用之外 是否有更好的方法来消除重音并使这些字母变得规则String replaceAll 方法并一一替换字母 例子 Input or p s d Output orcpzsiayd 它不需要包含所有带有重音符号的字母 例如俄语字母表或
  • C# 中字符串的第一个单词

    如何获取字符串的第一个单词 string test hello world I used test Split FirstOrDefault 但它返回 hello 我可以尝试将分隔符添加为逗号 但即使有逗号或空格 我也只需要单词 hello
  • 如何使用 GNU GAS 或 LLVM 汇编 ARM SVE 指令并在 QEMU 上运行?

    我想玩新的ARM SVE指令使用开源工具 首先 我想组装一个最小的示例 https developer arm com docs dui0965 latest getting started with the sve compiler as