NEON包装矢量比较结果到位图中
问题描述:
我有两个浮点操作数的比较结果比较如下;我需要的是基于比较的结果做需要执行以下操作:即: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);
答
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.
什么类型是'阵列[]'?我假设它是一个字节数组,但你的C类意味着什么。你会想要一个'1 2 4 8'的向量,你可以用比较结果进行掩码。但是,我认为,您需要进行洗牌以将结果打包到NEON寄存器的低4字节中。我不太了解NEON,但是如果你能做到这一点,那么你会想要做一个32位的阵列负载,做一个打包的OR,然后存储。 –
array []是unsigned char类型。比较结果是int32x4_t类型,因此我不能使用该掩码。有没有其他方法可以帮助我使用这个 – Lakshmi
但是NEON是否有任何可以用来从比较结果的每个元素打包1个字节的字节洗牌指令? –