Iphone 程序集:将floatingpointvalue转换为有符号字节

Iphone 程序集:将floatingpointvalue转换为有符号字节,iphone,assembly,arm,visual-foxpro,Iphone,Assembly,Arm,Visual Foxpro,我目前正在尝试使用ARM汇编代码为iPhone的VFP单元编写一个程序。 VFP可以进行浮点运算,但不能进行整数运算。但是,它可以将浮点转换为有符号整数(4字节)。此外,根据此快速参考: 它似乎不支持任何换档操作 我想做的是将4个浮点数转换成4个有符号字节,其中每个浮点数大于-127,小于127 如果有移位操作可用,我可以将浮点转换为有符号整数,然后将值向左移位12个字节(接下来的两个值分别为8和4个字节),然后按位或全部四个字节一起移位 然而,由于不能换班,我需要找到另一种方法。此外,我不能使

我目前正在尝试使用ARM汇编代码为iPhone的VFP单元编写一个程序。 VFP可以进行浮点运算,但不能进行整数运算。但是,它可以将浮点转换为有符号整数(4字节)。此外,根据此快速参考: 它似乎不支持任何换档操作

我想做的是将4个浮点数转换成4个有符号字节,其中每个浮点数大于-127,小于127

如果有移位操作可用,我可以将浮点转换为有符号整数,然后将值向左移位12个字节(接下来的两个值分别为8和4个字节),然后按位或全部四个字节一起移位

然而,由于不能换班,我需要找到另一种方法。此外,我不能使用整数算术(因此我不能将已转换的整数乘以2^n以进行移位,但我必须处理浮点运算)

有人知道我是怎么做到的吗

顺便说一句,对于那些熟悉ARM体系结构的人,我不想切换到Thumb指令,因为这是在一个对许多元素进行操作的循环中完成的,我不想在这个循环中切换Thumb指令和ARM指令(因为这很昂贵)

谢谢

编辑:


附加问题:如何规范化包含三个元素的向量?

您需要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
用一条指令进行四次转换


编辑要回答您的后续问题,下面是一个简单的示例函数,它将指向内存中四个浮点的指针作为输入,并返回打包成单个整数的转换值:

_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
我并没有在这方面投入任何精力,因为如果转换是性能关键的,您就不会希望以这种方式进行转换;您更希望对大型值数组进行操作,并将此代码管道化,以便同时进行多个转换,或者将其与其他正在进行有用工作的操作交错

您还可以在
uxtb
s之前插入
ssat
s,以使任何超出范围的值饱和,而不是包裹


另外,请注意,此代码在ARMv7内核上的性能较差;您肯定希望在该平台上使用NEON vector操作。

是的,我知道这一点,但问题是从带符号int到带符号字节的转换!最后,我希望在一个寄存器orry中没有4个4字节的整数,而是4个11字节的有符号字节;根本不清楚你想从你的问题中得到什么(“然后将值向左移动12个字节”,等等)。您可以直接在NEON上执行此操作,但在仅具有VFP的ARM内核上,您需要将转换后的值移回通用寄存器,并将它们打包到那里的字节。您确定吗?有位OR,所以我想也许我可以用浮点算法构建一些东西。如果我的浮点值在-127范围内,如果VFP上有一个按位
可以工作,但是没有。那么-我可以将转换后的值移回通用寄存器,在那里进行转换而不离开VFP循环吗?(即,没有切换回THUMB,也没有将vectorsize设置回零)?