SIMD Comparaison result and use

hi,

when i do the diff

    // Compute diff
    int32x4_t diff1_4 = vabsq_s32(vsubq_s32(A, B));

I got 4 result. One for each test (A1,B1)(A2,B2)(A3,B3) and (A4,B4)

And than i have to do the comparaison

    uint32x4_t mask1_4 = vcltq_s32(diff1_4, X);

So in "uint32x4_t mask1_4" i got the comparaison for each test, so 4 résult.

the answer on post "SIMD help for exemple" was to use

    if (vmaxvq_u32(mask1_4) > 0) { ... }

I thinks my sentence was confuse in the previous post. I wrote  

   " if (mask1_4[0] > 0 && mask1_4[1] > 0)  and if (mask1_4[2] > 0 && mask1_4[3] > 0) "

but it is not    if(  mask1_4[0] > 0  &&  mask1_4[1] > 0  &&   mask1_4[2] > 0  &&  mask1_4[3] > 0) )

i need to do 2 test

   if (mask1_4[0] > 0 && mask1_4[1] > 0){

        process data1

   }

  if (mask1_4[2] > 0 && mask1_4[3] > 0){

      process data2

 }

I think that vmaxvq_u32(mask1_4) will check all the comparaison. like

    if(  mask1_4[0] > 0 && mask1_4[1] > 0  &&   mask1_4[2] > 0 && mask1_4[3] > 0  )

PS: i think i should have post it in the old post

Parents
  • it look like vmaxvq_u32 is for 128bits,"uint32x4_t", long and not 64bits,"uint32x2_t". I tried to find the correct function but without result.

    I need an vmaxvq_u32 or vminvq_u32 how work with uint32x2_t.

    NEON intrinsics are relatively regular in terms of naming convention, the "q" versions are 128-bit quad-word versions, the non-q versions are 64-bit double work versions.

    So vmaxvq_u32() is the 128-bit version, and vmaxv_u32() is the 64-bit version.

    why if ( mask1_4[0]  > 0 && mask1_4[1]  > 0) work with a -1 value. It does look at the sign ?

    mask1_4 is an unsigned uint32 type, so 4294967295 not -1. NEON compares just return a vector with all bits set if true, or all bits clear for false, which is useful for use in logical bitwise mask operations.

Reply
  • it look like vmaxvq_u32 is for 128bits,"uint32x4_t", long and not 64bits,"uint32x2_t". I tried to find the correct function but without result.

    I need an vmaxvq_u32 or vminvq_u32 how work with uint32x2_t.

    NEON intrinsics are relatively regular in terms of naming convention, the "q" versions are 128-bit quad-word versions, the non-q versions are 64-bit double work versions.

    So vmaxvq_u32() is the 128-bit version, and vmaxv_u32() is the 64-bit version.

    why if ( mask1_4[0]  > 0 && mask1_4[1]  > 0) work with a -1 value. It does look at the sign ?

    mask1_4 is an unsigned uint32 type, so 4294967295 not -1. NEON compares just return a vector with all bits set if true, or all bits clear for false, which is useful for use in logical bitwise mask operations.

Children