From 59e9df2609ef3e22b4ea0eca158b736c3eba4a15 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 26 May 2022 13:49:27 +0100 Subject: [PATCH] `simd.bit_not`; `simd.copysign` --- core/simd/simd.odin | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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