On Wed, Mar 6, 2024 at 3:02 PM Masahiko Sawada <sawada.m...@gmail.com> wrote: > > ../../src/include/port/simd.h:326:71: error: incompatible type for > argument 1 of \342\200\230vshrq_n_s8\342\200\231 > uint8x16_t masked = vandq_u8(vld1q_u8(mask), (uint8x16_t) vshrq_n_s8(v, 7)); > ^ > > Since 'v' is uint8x16_t I think we should have used vshrq_n_u8() instead.
I've looked around and it seems clang is more lax on conversions. Since it works fine for clang, I think we just need a cast here for gcc. I've attached a blind attempt at a fix -- I'll apply shortly unless someone happens to test and find it doesn't work.
diff --git a/src/include/port/simd.h b/src/include/port/simd.h index 326b4faff5..597496f2fb 100644 --- a/src/include/port/simd.h +++ b/src/include/port/simd.h @@ -323,7 +323,7 @@ vector8_highbit_mask(const Vector8 v) 1 << 4, 1 << 5, 1 << 6, 1 << 7, }; - uint8x16_t masked = vandq_u8(vld1q_u8(mask), (uint8x16_t) vshrq_n_s8(v, 7)); + uint8x16_t masked = vandq_u8(vld1q_u8(mask), (uint8x16_t) vshrq_n_s8((int8x16_t) v, 7)); uint8x16_t maskedhi = vextq_u8(masked, masked, 8); return (uint32) vaddvq_u16((uint16x8_t) vzip1q_u8(masked, maskedhi));