我目前尝试写的程序的使用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

我真的不把任何努力来调整这个,因为你不会想要做的转换这样,如果他们的关键性能;关于价值观的大型阵列,你宁愿无论是工作,而这个管道代码,以便转换几个人同时在飞行中,或正在做有益的工作,以及其他业务交错的。

您还可以像ssats之前插入uxtbs进行任何外的范围内的值饱和,而不是包装。

此外,要知道,这种代码不会对ARMv7的芯性能较差;你一定会希望使用该平台上的NEON矢量操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top