32位ARM架构下,能否将双精度浮点位模式高位存入整数寄存器?
在32位ARM架构中获取float64高位比特的方法
在32位ARM架构中,要提取float64寄存器的高位32比特(包含符号位、指数位,这部分正是控制符号、NaN与无穷大的核心区域),可以通过以下两种简洁的方式实现:
直接拆分VFP寄存器
32位ARM的VFP架构中,每个float64寄存器d<n>由两个32位单精度寄存器组成:s<2n>对应低32位,s<2n+1>对应高32位。而float64的符号位、指数位恰好存储在高32位中,因此可以直接用vmov.f32指令将对应高编号的s寄存器内容复制到整数寄存器:vmov.f32 r0, s1 @ 提取d0寄存器的高位32比特到r0比如
d0的高32位对应s1,d1的高32位对应s3,以此类推,直接访问对应s寄存器就能拿到目标比特段。内存中转提取
如果场景中需要避免依赖寄存器映射关系,也可以先将float64值存入内存,再读取高位字:vstr.f64 d0, [sp, #-8]! @ 将d0的64位值压栈 ldr r0, [sp, #4] @ 读取栈中存储的高32位 add sp, sp, #8 @ 恢复栈指针这种方式虽然多了内存操作,但兼容性更强,无需关注寄存器的配对规则。
内容的提问来源于stack exchange,提问作者David Monniaux
相关产品推荐
相关产品推荐

