Browse Source

Add `core:simd`

gingerBill 3 years ago
parent
commit
8ac12886ed
2 changed files with 59 additions and 0 deletions
  1. 58 0
      core/simd/simd.odin
  2. 1 0
      examples/all/all_main.odin

+ 58 - 0
core/simd/simd.odin

@@ -0,0 +1,58 @@
+package simd
+
+import "core:intrinsics"
+
+add        :: intrinsics.simd_add
+sub        :: intrinsics.simd_sub
+mul        :: intrinsics.simd_mul
+div        :: intrinsics.simd_div
+rem        :: intrinsics.simd_rem
+
+// Keeps Odin's Behaviour
+// (x << y) if y <= mask else 0
+shl        :: intrinsics.simd_shl
+shr        :: intrinsics.simd_shr
+
+// Similar to C's Behaviour
+// x << (y & mask)
+shl_masked :: intrinsics.simd_shl_masked
+shr_masked :: intrinsics.simd_shr_masked
+
+and     :: intrinsics.simd_and
+or      :: intrinsics.simd_or
+xor     :: intrinsics.simd_xor
+neg     :: intrinsics.simd_neg
+abs     :: intrinsics.simd_abs
+min     :: intrinsics.simd_min
+max     :: intrinsics.simd_max
+eq      :: intrinsics.simd_eq
+ne      :: intrinsics.simd_ne
+lt      :: intrinsics.simd_lt
+le      :: intrinsics.simd_le
+gt      :: intrinsics.simd_gt
+ge      :: intrinsics.simd_ge
+extract :: intrinsics.simd_extract
+replace :: intrinsics.simd_replace
+
+splat :: #force_inline proc "contextless" ($T: typeid/#simd[$LANES]$E, value: E) -> T {
+	return T{0..<LANES = value}
+}
+
+to_array_ptr :: #force_inline proc "contextless" (v: ^#simd[$LANES]$E) -> ^[LANES]E {
+	return (^[LANES]E)(v)
+}
+to_array :: #force_inline proc "contextless" (v: #simd[$LANES]$E) -> [LANES]E {
+	return transmute([LANES]E)(v)
+}
+from_array :: #force_inline proc "contextless" (v: $A/[$LANES]$E) -> #simd[LANES]E where LANES & (LANES-1) == 0 {
+	return transmute(#simd[LANES]E)v
+}
+
+from_slice :: proc($T: typeid/#simd[$LANES]$E, slice: []E) -> T where LANES & (LANES-1) == 0 {
+	assert(len(slice) >= LANES, "slice length must be a least the number of lanes")
+	array: [LANES]E
+	#no_bounds_check for i in 0..<LANES {
+		array[i] = slice[i]
+	}
+	return transmute(T)array
+}

+ 1 - 0
examples/all/all_main.odin

@@ -96,6 +96,7 @@ import filepath       "core:path/filepath"
 
 import reflect        "core:reflect"
 import runtime        "core:runtime"
+import simd           "core:simd"
 import slice          "core:slice"
 import sort           "core:sort"
 import strconv        "core:strconv"