diff options
| author | gingerBill <bill@gingerbill.org> | 2022-05-27 23:00:52 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-05-27 23:00:52 +0100 |
| commit | 026540040df94309280d6991eba6b2dcc303bd76 (patch) | |
| tree | c2b3aa4ff0d5ea87ac0a77f2a76f484988af5f91 | |
| parent | 8518d3b2327885538993afa2655b83abb71b82e3 (diff) | |
Add SSE3 support
| -rw-r--r-- | core/simd/x86/sse3.odin | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/core/simd/x86/sse3.odin b/core/simd/x86/sse3.odin new file mode 100644 index 000000000..6468ea268 --- /dev/null +++ b/core/simd/x86/sse3.odin @@ -0,0 +1,58 @@ +//+build i386, amd64 +package simd_x86 + +import "core:intrinsics" +import "core:simd" + +_mm_addsub_ps :: #force_inline proc "c" (a, b: __m128) -> __m128 { + return addsubps(a, b) +} +_mm_addsub_pd :: #force_inline proc "c" (a: __m128d, b: __m128d) -> __m128d { + return addsubpd(a, b) +} +_mm_hadd_pd :: #force_inline proc "c" (a: __m128d, b: __m128d) -> __m128d { + return haddpd(a, b) +} +_mm_hadd_ps :: #force_inline proc "c" (a, b: __m128) -> __m128 { + return haddps(a, b) +} +_mm_hsub_pd :: #force_inline proc "c" (a: __m128d, b: __m128d) -> __m128d { + return hsubpd(a, b) +} +_mm_hsub_ps :: #force_inline proc "c" (a, b: __m128) -> __m128 { + return hsubps(a, b) +} +_mm_lddqu_si128 :: #force_inline proc "c" (mem_addr: ^__m128i) -> __m128i { + return transmute(__m128i)lddqu(mem_addr) +} +_mm_movedup_pd :: #force_inline proc "c" (a: __m128d) -> __m128d { + return simd.shuffle(a, a, 0, 0) +} +_mm_loaddup_pd :: #force_inline proc "c" (mem_addr: [^]f64) -> __m128d { + return _mm_load1_pd(mem_addr) +} +_mm_movehdup_ps :: #force_inline proc "c" (a: __m128) -> __m128 { + return simd.shuffle(a, a, 1, 1, 3, 3) +} +_mm_moveldup_ps :: #force_inline proc "c" (a: __m128) -> __m128 { + return simd.shuffle(a, a, 0, 0, 2, 2) +} + +@(default_calling_convention="c") +@(private) +foreign _ { + @(link_name = "llvm.x86.sse3.addsub.ps") + addsubps :: proc(a, b: __m128) -> __m128 --- + @(link_name = "llvm.x86.sse3.addsub.pd") + addsubpd :: proc(a: __m128d, b: __m128d) -> __m128d --- + @(link_name = "llvm.x86.sse3.hadd.pd") + haddpd :: proc(a: __m128d, b: __m128d) -> __m128d --- + @(link_name = "llvm.x86.sse3.hadd.ps") + haddps :: proc(a, b: __m128) -> __m128 --- + @(link_name = "llvm.x86.sse3.hsub.pd") + hsubpd :: proc(a: __m128d, b: __m128d) -> __m128d --- + @(link_name = "llvm.x86.sse3.hsub.ps") + hsubps :: proc(a, b: __m128) -> __m128 --- + @(link_name = "llvm.x86.sse3.ldu.dq") + lddqu :: proc(mem_addr: rawptr) -> i8x16 --- +}
\ No newline at end of file |