aboutsummaryrefslogtreecommitdiff
path: root/core/simd
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-05-26 17:48:51 +0100
committergingerBill <bill@gingerbill.org>2022-05-26 17:48:51 +0100
commit20e7b5c88acb2e0cee64ccdec7247227306a345f (patch)
tree9f58fb43f939595bbd75a9d70af1bdd14a722086 /core/simd
parent7092273a8f5a2ae8c60ece297e7114a29e0f3652 (diff)
Support `count_ones` etc with #simd
Diffstat (limited to 'core/simd')
-rw-r--r--core/simd/simd.odin15
1 files changed, 10 insertions, 5 deletions
diff --git a/core/simd/simd.odin b/core/simd/simd.odin
index c54d2a480..17d97f918 100644
--- a/core/simd/simd.odin
+++ b/core/simd/simd.odin
@@ -104,6 +104,11 @@ reverse :: intrinsics.simd_reverse
rotate_left :: intrinsics.simd_rotate_left
rotate_right :: intrinsics.simd_rotate_right
+count_ones :: intrinsics.count_ones
+count_zeros :: intrinsics.count_zeros
+count_trailing_zeros :: intrinsics.count_trailing_zeros
+count_leading_zeros :: intrinsics.count_leading_zeros
+
to_array_ptr :: #force_inline proc "contextless" (v: ^#simd[$LANES]$E) -> ^[LANES]E {
return (^[LANES]E)(v)
}
@@ -129,16 +134,16 @@ bit_not :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where i
copysign :: #force_inline proc "contextless" (v, sign: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_float(E) {
neg_zero := to_bits(T(-0.0))
- sign_bit := and(to_bits(sign), neg_zero)
- magnitude := and(to_bits(v), bit_not(neg_zero))
- return transmute(T)or(sign_bit, magnitude)
+ sign_bit := to_bits(sign) & neg_zero
+ magnitude := to_bits(v) &~ neg_zero
+ return transmute(T)(sign_bit|magnitude)
}
signum :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_float(E) {
- is_nan := ne(v, v)
+ is_nan := lanes_ne(v, v)
return select(is_nan, v, copysign(T(1), v))
}
recip :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_float(E) {
- return div(T(1), v)
+ return T(1) / v
}