ARMv8浮点输出内联汇编 [英] ARMv8 floating point output inline assembly
本文介绍了ARMv8浮点输出内联汇编的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
要加两个整数,我写:
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
修饰符
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.
源代码定义点
- ARM: https://github.com/gcc-mirror/gcc/blob/gcc-8_2_0-release/gcc/config/arm/arm.c#L22466
- aarch64: https://github.com/gcc-mirror/gcc/blob/gcc-8_2_0-release/gcc/config/aarch64/aarch64.c#L6743
- ARM: https://github.com/gcc-mirror/gcc/blob/gcc-8_2_0-release/gcc/config/arm/arm.c#L22466
- aarch64: https://github.com/gcc-mirror/gcc/blob/gcc-8_2_0-release/gcc/config/aarch64/aarch64.c#L6743
这篇关于ARMv8浮点输出内联汇编的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文