NEON pack vector将结果比较到位图

我有两个浮点操作数的比较结果如下; 我需要做的是基于比较的结果需要执行以下操作:即:

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.