Iphone 程序集:将floatingpointvalue转换为有符号字节
我目前正在尝试使用ARM汇编代码为iPhone的VFP单元编写一个程序。 VFP可以进行浮点运算,但不能进行整数运算。但是,它可以将浮点转换为有符号整数(4字节)。此外,根据此快速参考: 它似乎不支持任何换档操作 我想做的是将4个浮点数转换成4个有符号字节,其中每个浮点数大于-127,小于127 如果有移位操作可用,我可以将浮点转换为有符号整数,然后将值向左移位12个字节(接下来的两个值分别为8和4个字节),然后按位或全部四个字节一起移位 然而,由于不能换班,我需要找到另一种方法。此外,我不能使用整数算术(因此我不能将已转换的整数乘以2^n以进行移位,但我必须处理浮点运算) 有人知道我是怎么做到的吗 顺便说一句,对于那些熟悉ARM体系结构的人,我不想切换到Thumb指令,因为这是在一个对许多元素进行操作的循环中完成的,我不想在这个循环中切换Thumb指令和ARM指令(因为这很昂贵) 谢谢 编辑:Iphone 程序集:将floatingpointvalue转换为有符号字节,iphone,assembly,arm,visual-foxpro,Iphone,Assembly,Arm,Visual Foxpro,我目前正在尝试使用ARM汇编代码为iPhone的VFP单元编写一个程序。 VFP可以进行浮点运算,但不能进行整数运算。但是,它可以将浮点转换为有符号整数(4字节)。此外,根据此快速参考: 它似乎不支持任何换档操作 我想做的是将4个浮点数转换成4个有符号字节,其中每个浮点数大于-127,小于127 如果有移位操作可用,我可以将浮点转换为有符号整数,然后将值向左移位12个字节(接下来的两个值分别为8和4个字节),然后按位或全部四个字节一起移位 然而,由于不能换班,我需要找到另一种方法。此外,我不能使
附加问题:如何规范化包含三个元素的向量?您需要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设置回零)?