21,459
社区成员
发帖
与我相关
我的任务
分享
最近在看一些别人写的C/C++ 嵌入内联汇编代码,发现在32位和64位中有一些写法找不到文档介绍,比如下面代码
// arm32
asm volatile(
// ...省略
"vmla.f32 q6, q12, %q16 \n"
// ...省略
};
// arm64
asm volatile(
// ...省略
"fmla v16.4s, v22.4s, %16.s[0] \n"
// ...省略
};
以上两段汇编中在操作数 16 上,这个百分号后面的字母如何理解?
我看32位上有出现过 %e %f %q,64位的这个 %16.s[] 似乎是代表按4字节取?
已找到 ARM 官方文档
目前没有找到文档介绍这个,在 GCC 源码中可以找到相关线索
gcc/config/arm/arm.c
可以看到 e 和 f 分别代表操作数的 低32位 和 高32位,如果是 pair-structure 也可以代表 低/高 64位寄存器。
至于 q ,表示 double 精度或者 quad 精度的 VFP/NEON 寄存器
输入参数,vmla指令相当于x64的fma3指令,dest=dest+src1*src2,它这里的src2是可宏替换的参数,而不是直接指定寄存器