From 12d19d21c4a77bce5ff4acd8f0184e72709fb364 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 May 2022 23:40:59 +0100 Subject: [PATCH] Document simd stuff in intrinsics.odin --- core/intrinsics/intrinsics.odin | 54 +++++++++++++++++++++++++++++++++ core/simd/simd.odin | 7 +++++ 2 files changed, 61 insertions(+) diff --git a/core/intrinsics/intrinsics.odin b/core/intrinsics/intrinsics.odin index d71522936..a24f1d868 100644 --- a/core/intrinsics/intrinsics.odin +++ b/core/intrinsics/intrinsics.odin @@ -186,6 +186,60 @@ type_hasher_proc :: proc($T: typeid) -> (hasher: proc "contextless" (data: rawpt constant_utf16_cstring :: proc($literal: string) -> [^]u16 --- +// SIMD related +simd_add :: proc(a, b: #simd[N]T) -> #simd[N]T --- +simd_sub :: proc(a, b: #simd[N]T) -> #simd[N]T --- +simd_mul :: proc(a, b: #simd[N]T) -> #simd[N]T --- +simd_div :: proc(a, b: #simd[N]T) -> #simd[N]T --- +simd_rem :: proc(a, b: #simd[N]T) -> #simd[N]T --- + +// Keeps Odin's Behaviour +// (x << y) if y <= mask else 0 +simd_shl :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T --- +simd_shr :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T --- + +// Similar to C's Behaviour +// x << (y & mask) +simd_shl_masked :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T --- +simd_shr_masked :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T --- + +simd_and :: proc(a, b: #simd[N]T) -> #simd[N]T --- +simd_or :: proc(a, b: #simd[N]T) -> #simd[N]T --- +simd_xor :: proc(a, b: #simd[N]T) -> #simd[N]T --- + +simd_neg :: proc(a: #simd[N]T) -> #simd[N]T --- + +simd_abs :: proc(a: #simd[N]T) -> #simd[N]T --- +simd_min :: proc(a, b: #simd[N]T) -> #simd[N]T --- +simd_max :: proc(a, b: #simd[N]T) -> #simd[N]T --- + +// Return an unsigned integer of the same size as the input type +// NOT A BOOLEAN +// element-wise: +// false => 0x00...00 +// true => 0xff...ff +simd_eq :: proc(a, b: #simd[N]T) -> #simd[N]Integer --- +simd_ne :: proc(a, b: #simd[N]T) -> #simd[N]Integer --- +simd_lt :: proc(a, b: #simd[N]T) -> #simd[N]Integer --- +simd_le :: proc(a, b: #simd[N]T) -> #simd[N]Integer --- +simd_gt :: proc(a, b: #simd[N]T) -> #simd[N]Integer --- +simd_ge :: proc(a, b: #simd[N]T) -> #simd[N]Integer --- + +simd_extract :: proc(a: #simd[N]T, idx: uint) -> T --- +simd_replace :: proc(a: #simd[N]T, idx: uint, elem: T) -> #simd[N]T --- + +simd_reduce_add_ordered :: proc(a: #simd[N]T) -> T --- +simd_reduce_mul_ordered :: proc(a: #simd[N]T) -> T --- +simd_reduce_min :: proc(a: #simd[N]T) -> T --- +simd_reduce_max :: proc(a: #simd[N]T) -> T --- +simd_reduce_and :: proc(a: #simd[N]T) -> T --- +simd_reduce_or :: proc(a: #simd[N]T) -> T --- +simd_reduce_xor :: proc(a: #simd[N]T) -> T --- + +simd_shuffle :: proc(a, b: #simd[N]T, indices: #simd[max 2*N]u32) -> #simd[len(indices)]T --- +simd_select :: proc(cond: #simd[N]any_boolean, true, false: #simd[N]T) -> #simd[N]T --- + + // WASM targets only wasm_memory_grow :: proc(index, delta: uintptr) -> int --- wasm_memory_size :: proc(index: uintptr) -> int --- diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 1819f3951..c5473a92c 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -61,7 +61,9 @@ le :: intrinsics.simd_le gt :: intrinsics.simd_gt ge :: intrinsics.simd_ge +// extract :: proc(a: #simd[N]T, idx: uint) -> T extract :: intrinsics.simd_extract +// replace :: proc(a: #simd[N]T, idx: uint, elem: T) -> #simd[N]T replace :: intrinsics.simd_replace reduce_add_ordered :: intrinsics.simd_reduce_add_ordered @@ -72,8 +74,13 @@ reduce_and :: intrinsics.simd_reduce_and reduce_or :: intrinsics.simd_reduce_or reduce_xor :: intrinsics.simd_reduce_xor +// swizzle :: proc(a: #simd[N]T, indices: ..int) -> #simd[len(indices)]T swizzle :: builtin.swizzle + +// shuffle :: proc(a, b: #simd[N]T, indices: #simd[max 2*N]u32) -> #simd[len(indices)]T shuffle :: intrinsics.simd_shuffle + +// select :: proc(cond: #simd[N]any_boolean, true, false: #simd[N]T) -> #simd[N]T select :: intrinsics.simd_select splat :: #force_inline proc "contextless" ($T: typeid/#simd[$LANES]$E, value: E) -> T {