ARMv8 浮点输出内联汇编 [英] ARMv8 floating point output inline assembly

查看:31
本文介绍了ARMv8 浮点输出内联汇编的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于两个整数相加,我写:

For adding two integers, I write:

int sum;
asm volatile("add %0, x3, x4" : "=r"(sum) : :);

我怎样才能用两个浮点数来做到这一点?我试过了:

How can I do this with two floats? I tried:

float sum;
asm volatile("fadd %0, s3, s4" : "=r"(sum) : :);

但它给了我一个错误:

错误:操作数 1 应该是 SIMD 向量寄存器 -- `fadd x0,s3,s4'

Error: operand 1 should be a SIMD vector register -- `fadd x0,s3,s4'

有什么想法吗?

推荐答案

ARMv7 double: %P modifier

ARMv7 double: %P modifier

GCC 开发人员在 https 上告诉我正确的未记录的 ARMv7 双打修饰符://gcc.gnu.org/bugzilla/show_bug.cgi?id=89482#c4 也许有一天我应该停止偷懒并使用 grep GCC :

GCC devs informed me the correct undocumented modifier for ARMv7 doubles at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89482#c4 Maybe I should stop being lazy and grep GCC some day:

main.c

#include <assert.h>

int main(void) {
    double my_double = 1.5;
    __asm__ (
        "vmov.f64 d0, 1.0;"
        "vadd.f64 %P[my_double], %P[my_double], d0;"
        : [my_double] "+w" (my_double)
        :
        : "d0"
    );
    assert(my_double == 2.5);
}

编译运行:

sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-gcc -O3 -std=c99 -ggdb3 -march=armv7-a -marm \
  -pedantic -Wall -Wextra -o main.out main.c
qemu-arm -L /usr/arm-linux-gnueabihf main.out

反汇编包含:

   0x00010320 <+4>:     08 7b b7 ee     vmov.f64        d7, #120        ; 0x3fc00000  1.5
   0x00010324 <+8>:     00 0b b7 ee     vmov.f64        d0, #112        ; 0x3f800000  1.0
   0x00010328 <+12>:    00 7b 37 ee     vadd.f64        d7, d7, d0

在 Ubuntu 16.04、GCC 5.4.0、QEMU 2.5.0 中测试.

Tested in Ubuntu 16.04, GCC 5.4.0, QEMU 2.5.0.

源代码定义点

这篇关于ARMv8 浮点输出内联汇编的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆