mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Add core:simd
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
@@ -96,6 +96,7 @@ import filepath "core:path/filepath"
|
|||||||
|
|
||||||
import reflect "core:reflect"
|
import reflect "core:reflect"
|
||||||
import runtime "core:runtime"
|
import runtime "core:runtime"
|
||||||
|
import simd "core:simd"
|
||||||
import slice "core:slice"
|
import slice "core:slice"
|
||||||
import sort "core:sort"
|
import sort "core:sort"
|
||||||
import strconv "core:strconv"
|
import strconv "core:strconv"
|
||||||
|
|||||||
Reference in New Issue
Block a user