aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMarat Dukhan <maratek@google.com>2019-09-30 21:24:46 -0700
committerMarat Dukhan <maratek@google.com>2019-09-30 21:24:46 -0700
commit4afd402a4ab25e127220301b56929ad5216b0803 (patch)
treef61e07d2755af1d8ec7e6695e5c7896b2b7a5fcb /include
parent58f1cea240b080593ee95520e4b1a381efc529ce (diff)
downloadpsimd-4afd402a4ab25e127220301b56929ad5216b0803.tar.gz
Require signed mask in blend of unsigned SIMD vectors
The result of comparison of unsigned SIMD vectors is a signed SIMD vector. Using it as a mask with previous specification was incompatible with gcc.
Diffstat (limited to 'include')
-rw-r--r--include/psimd.h14
1 files changed, 7 insertions, 7 deletions
diff --git a/include/psimd.h b/include/psimd.h
index 0aadfd1..06d5fee 100644
--- a/include/psimd.h
+++ b/include/psimd.h
@@ -690,13 +690,13 @@
#endif
}
- PSIMD_INTRINSIC psimd_u8 psimd_blend_u8(psimd_u8 mask, psimd_u8 a, psimd_u8 b) {
+ PSIMD_INTRINSIC psimd_u8 psimd_blend_u8(psimd_s8 mask, psimd_u8 a, psimd_u8 b) {
#if defined(__ARM_NEON__) || defined(__ARM_NEON)
return (psimd_u8) vbslq_u8((uint8x16_t) mask, (uint8x16_t) a, (uint8x16_t) b);
#elif defined(__wasm__) && defined(__wasm_simd128__) && defined(__clang__)
return (psimd_u8) __builtin_wasm_bitselect(a, b, mask);
#else
- return (mask & a) | (~mask & b);
+ return (psimd_u8) ((mask & (psimd_s8) a) | (~mask & (psimd_s8) b));
#endif
}
@@ -710,13 +710,13 @@
#endif
}
- PSIMD_INTRINSIC psimd_u16 psimd_blend_u16(psimd_u16 mask, psimd_u16 a, psimd_u16 b) {
+ PSIMD_INTRINSIC psimd_u16 psimd_blend_u16(psimd_s16 mask, psimd_u16 a, psimd_u16 b) {
#if defined(__ARM_NEON__) || defined(__ARM_NEON)
return (psimd_u16) vbslq_u16((uint16x8_t) mask, (uint16x8_t) a, (uint16x8_t) b);
#elif defined(__wasm__) && defined(__wasm_simd128__) && defined(__clang__)
return (psimd_u16) __builtin_wasm_bitselect(a, b, mask);
#else
- return (mask & a) | (~mask & b);
+ return (psimd_u16) ((mask & (psimd_s16) a) | (~mask & (psimd_s16) b));
#endif
}
@@ -730,13 +730,13 @@
#endif
}
- PSIMD_INTRINSIC psimd_u32 psimd_blend_u32(psimd_u32 mask, psimd_u32 a, psimd_u32 b) {
+ PSIMD_INTRINSIC psimd_u32 psimd_blend_u32(psimd_s32 mask, psimd_u32 a, psimd_u32 b) {
#if defined(__ARM_NEON__) || defined(__ARM_NEON)
return (psimd_u32) vbslq_u32((uint32x4_t) mask, (uint32x4_t) a, (uint32x4_t) b);
#elif defined(__wasm__) && defined(__wasm_simd128__) && defined(__clang__)
return (psimd_u32) __builtin_wasm_bitselect(a, b, mask);
#else
- return (mask & a) | (~mask & b);
+ return (psimd_u32) ((mask & (psimd_s32) a) | (~mask & (psimd_s32) b));
#endif
}
@@ -746,7 +746,7 @@
#elif defined(__wasm__) && defined(__wasm_simd128__) && defined(__clang__)
return (psimd_f32) __builtin_wasm_bitselect(a, b, mask);
#else
- return (psimd_f32) psimd_blend_s32(mask, (psimd_s32) a, (psimd_s32) b);
+ return (psimd_f32) ((mask & (psimd_s32) a) | (~mask & (psimd_s32) b));
#endif
}