大会:转换floatingpointvalue到符号字节
-
21-09-2019 - |
题
我目前尝试写的程序的使用ARM汇编代码的iPhone VFP部。 该VFP能做的浮点运算,但据我所知没有整数运算。但是,它可以浮子转换为符号整数(4个字节)。另外,根据本quickreference: http://www.voti.nl/hvu/arm /ARMquickref.pdf 看来它不支持任何变速操作
我想要做的是转换4个浮点,而我敢肯定,每个比-127大,比127小到4个符号字节。
如果我不得不移可用的操作,我可以转换浮子符号整数,然后由12个字节的值向左移动(分别为8首4个字节用于接下来的两个值)和按位或所有四个在一起。
然而,由于换挡是不可用的,我需要找到另一种方法来做到这一点。还 - 我不能使用整数算术(所以我不能由2 ^ N以移位乘以已经转换的整数,但我不得不在浮子工作代替)
任何人都知道我怎么能做到这一点?
顺便说一句那些familar与ARM架构 - 我不希望切换到Thumb指令,因为这是在一个循环中完成的许多元件上操作的,我不希望这个循环内的拇指和臂指令之间切换(因为这是昂贵的)
谢谢!
编辑:
附加的问题:如何可以归一化矢量包含三个元素
解决方案
您想要的VFP ftosis
指令,它转换一个单精度FP值到一个4字节整数。如果您在S0-S3四个浮点,然后做后:
ftosis s0, s0
ftosis s1, s1
ftosis s2, s2
ftosis s3, s3
你在S0-S3四个4字节整数,它可以连续地被存储到存储器与fstm
。
在支持NEON ARM处理器,则可以使用vcvt.s32.f32 q0, q0
做四个转换与一个指令。
修改以回答您的后续问题,这里有一个简单的例子函数,它接受作为输入的指针到四个漂浮在存储器,并返回包装成单个int32_t转换后的值:
_floatToPackedInt:
fldmias r0, {s4-s7}
ftosizs s0, s4
ftosizs s1, s5
ftosizs s2, s6
ftosizs s3, s7
fmrrs r0, r1, {s0,s1}
fmrrs r2, r3, {s2,s3}
uxtb r0, r0
uxtb r1, r1
uxtb r2, r2
orr r0, r0, r1, lsl #8
orr r0, r0, r2, lsl #16
orr r0, r0, r3, lsl #24
bx lr
我真的不把任何努力来调整这个,因为你不会想要做的转换这样,如果他们的关键性能;关于价值观的大型阵列,你宁愿无论是工作,而这个管道代码,以便转换几个人同时在飞行中,或正在做有益的工作,以及其他业务交错的。
您还可以像ssat
s之前插入uxtb
s进行任何外的范围内的值饱和,而不是包装。
此外,要知道,这种代码不会对ARMv7的芯性能较差;你一定会希望使用该平台上的NEON矢量操作。