aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-05-26 13:49:27 +0100
committergingerBill <bill@gingerbill.org>2022-05-26 13:49:27 +0100
commit59e9df2609ef3e22b4ea0eca158b736c3eba4a15 (patch)
treef9474da4940e2bc1bdb12e647e2fa30f3ec21f3e
parent66b5a35ec352b74e66ad866640669d920e9d0849 (diff)
`simd.bit_not`; `simd.copysign`
-rw-r--r--core/simd/simd.odin16
1 files changed, 15 insertions, 1 deletions
diff --git a/core/simd/simd.odin b/core/simd/simd.odin
index 1da0bd3e5..6df30fda7 100644
--- a/core/simd/simd.odin
+++ b/core/simd/simd.odin
@@ -27,7 +27,7 @@ add :: intrinsics.simd_add
sub :: intrinsics.simd_sub
mul :: intrinsics.simd_mul
div :: intrinsics.simd_div
-rem :: intrinsics.simd_rem
+rem :: intrinsics.simd_rem // integers only
// Keeps Odin's Behaviour
// (x << y) if y <= mask else 0
@@ -96,6 +96,8 @@ floor :: intrinsics.simd_floor
trunc :: intrinsics.simd_trunc
nearest :: intrinsics.simd_nearest
+to_bits :: intrinsics.simd_to_bits
+
reverse :: intrinsics.simd_reverse
rotate_left :: intrinsics.simd_rotate_left
@@ -123,3 +125,15 @@ from_slice :: proc($T: typeid/#simd[$LANES]$E, slice: []E) -> T {
}
return transmute(T)array
}
+
+bit_not :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) {
+ ones := splat(type_of(v), ~E(0))
+ return xor(v, ones)
+}
+
+copysign :: #force_inline proc "contextless" (v, sign: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_float(E) {
+ neg_zero := to_bits(splat(T, E(-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)
+} \ No newline at end of file