2017-10-04 75 views
2

我有两个浮点操作数的比较结果比较如下;我需要的是基于比较的结果做需要执行以下操作:即:NEON包装矢量比较结果到位图中

neon_gt_res = vcgtq_f32(temp1, temp2); 
if(neon_gt_res[0]) array[0] |= (unsigned char)0x01; 
if(neon_gt_res[1]) array[0] |= (unsigned char)0x02; 
if(neon_gt_res[2]) array[0] |= (unsigned char)0x04; 
if(neon_gt_res[3]) array[0] |= (unsigned char)0x08; 

但写这样再次相当于多重比较。我如何在霓虹C内在函数中最优化地编写它。

在x86上,这将是array[0] |= _mm_movemask_ps(cmp_gt_res);

+0

什么类型是'阵列[]'?我假设它是一个字节数组,但你的C类意味着什么。你会想要一个'1 2 4 8'的向量,你可以用比较结果进行掩码。但是,我认为,您需要进行洗牌以将结果打包到NEON寄存器的低4字节中。我不太了解NEON,但是如果你能做到这一点,那么你会想要做一个32位的阵列负载,做一个打包的OR,然后存储。 –

+0

array []是unsigned char类型。比较结果是int32x4_t类型,因此我不能使用该掩码。有没有其他方法可以帮助我使用这个 – Lakshmi

+0

但是NEON是否有任何可以用来从比较结果的每个元素打包1个字节的字节洗牌指令? –

回答

3
vmov.i32 qmask, #1 
vand qres, qmask, qres 
vsra.u64 qres, qres, #30 
vsli.64 dres_bottom, dres_top, #2 

而且你有你需要在qres的四个最低显著位的位。

////////////////////////编辑

的上述的改进版本:

vshr.u64 qres, qres, #31 
vsli.64 dres_bot, dres_top, #2 
// the four LSBs already contain the bitmap, the rest is optional: 
vbic.i16 dres_bot, #0xf0 
// you can now use byte 0 of dres_bot as the result.