Browse Source

Document simd stuff in intrinsics.odin

gingerBill 3 years ago
parent
commit
12d19d21c4
2 changed files with 61 additions and 0 deletions
  1. 54 0
      core/intrinsics/intrinsics.odin
  2. 7 0
      core/simd/simd.odin

+ 54 - 0
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 ---
 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 targets only
 wasm_memory_grow :: proc(index, delta: uintptr) -> int ---
 wasm_memory_grow :: proc(index, delta: uintptr) -> int ---
 wasm_memory_size :: proc(index: uintptr)        -> int ---
 wasm_memory_size :: proc(index: uintptr)        -> int ---

+ 7 - 0
core/simd/simd.odin

@@ -61,7 +61,9 @@ le :: intrinsics.simd_le
 gt :: intrinsics.simd_gt
 gt :: intrinsics.simd_gt
 ge :: intrinsics.simd_ge
 ge :: intrinsics.simd_ge
 
 
+// extract :: proc(a: #simd[N]T, idx: uint) -> T
 extract :: intrinsics.simd_extract
 extract :: intrinsics.simd_extract
+// replace :: proc(a: #simd[N]T, idx: uint, elem: T) -> #simd[N]T
 replace :: intrinsics.simd_replace
 replace :: intrinsics.simd_replace
 
 
 reduce_add_ordered :: intrinsics.simd_reduce_add_ordered
 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_or          :: intrinsics.simd_reduce_or
 reduce_xor         :: intrinsics.simd_reduce_xor
 reduce_xor         :: intrinsics.simd_reduce_xor
 
 
+// swizzle :: proc(a: #simd[N]T, indices: ..int) -> #simd[len(indices)]T
 swizzle :: builtin.swizzle
 swizzle :: builtin.swizzle
+
+// shuffle :: proc(a, b: #simd[N]T, indices: #simd[max 2*N]u32) -> #simd[len(indices)]T
 shuffle :: intrinsics.simd_shuffle
 shuffle :: intrinsics.simd_shuffle
+
+// select :: proc(cond: #simd[N]any_boolean, true, false: #simd[N]T) -> #simd[N]T
 select :: intrinsics.simd_select
 select :: intrinsics.simd_select
 
 
 splat :: #force_inline proc "contextless" ($T: typeid/#simd[$LANES]$E, value: E) -> T {
 splat :: #force_inline proc "contextless" ($T: typeid/#simd[$LANES]$E, value: E) -> T {