NEON pack vector将结果比较到位图

时间:2017-10-04 15:44:31

标签: c arm intrinsics 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;

但是这样的写作再次等同于多重比较。如何在neon C内在函数中以最佳方式编写它。

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

1 个答案:

答案 0 :(得分:3)

<table class="x">
 <tbody>
  <tr class="y">
    <th>Id</th>
    <th>Title</th>
    <th>Is valid</th>
    <th>Added date</th>
    <th>Expiration date</th>
  </tr>

  <tr>
      <td>1</td>
      <td>Title1</td>
      <td>Yes</td>          
      <td>11.09.2017</td>
      <td>30.09.2017</td>
  </tr>
  <tr>
      <td>1</td>
      <td>Title2</td>
      <td>Yes</td>          
      <td>1.10.2017</td>
      <td>2.11.2017</td>
  </tr>
  <tr>
      <td>1</td>
      <td>Title3</td>
      <td>Yes3</td>          
      <td>11.11.2017</td>
      <td>30.12.2017</td>
  </tr>
  (...)
 </tbody>
</table>

你在qres的四个最低有效位上有你需要的位。

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

以上的改进版本:

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