mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-09 11:58:10 +00:00
Add core:simd
This commit is contained in:
58
core/simd/simd.odin
Normal file
58
core/simd/simd.odin
Normal file
@@ -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 runtime "core:runtime"
|
||||
import simd "core:simd"
|
||||
import slice "core:slice"
|
||||
import sort "core:sort"
|
||||
import strconv "core:strconv"
|
||||
|
||||
Reference in New Issue
Block a user