sse3.odin 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //+build i386, amd64
  2. package simd_x86
  3. import "core:intrinsics"
  4. import "core:simd"
  5. @(require_results, enable_target_feature="sse3")
  6. _mm_addsub_ps :: #force_inline proc "c" (a, b: __m128) -> __m128 {
  7. return addsubps(a, b)
  8. }
  9. @(require_results, enable_target_feature="sse3")
  10. _mm_addsub_pd :: #force_inline proc "c" (a: __m128d, b: __m128d) -> __m128d {
  11. return addsubpd(a, b)
  12. }
  13. @(require_results, enable_target_feature="sse3")
  14. _mm_hadd_pd :: #force_inline proc "c" (a: __m128d, b: __m128d) -> __m128d {
  15. return haddpd(a, b)
  16. }
  17. @(require_results, enable_target_feature="sse3")
  18. _mm_hadd_ps :: #force_inline proc "c" (a, b: __m128) -> __m128 {
  19. return haddps(a, b)
  20. }
  21. @(require_results, enable_target_feature="sse3")
  22. _mm_hsub_pd :: #force_inline proc "c" (a: __m128d, b: __m128d) -> __m128d {
  23. return hsubpd(a, b)
  24. }
  25. @(require_results, enable_target_feature="sse3")
  26. _mm_hsub_ps :: #force_inline proc "c" (a, b: __m128) -> __m128 {
  27. return hsubps(a, b)
  28. }
  29. @(require_results, enable_target_feature="sse3")
  30. _mm_lddqu_si128 :: #force_inline proc "c" (mem_addr: ^__m128i) -> __m128i {
  31. return transmute(__m128i)lddqu(mem_addr)
  32. }
  33. @(require_results, enable_target_feature="sse3")
  34. _mm_movedup_pd :: #force_inline proc "c" (a: __m128d) -> __m128d {
  35. return simd.shuffle(a, a, 0, 0)
  36. }
  37. @(require_results, enable_target_feature="sse3")
  38. _mm_loaddup_pd :: #force_inline proc "c" (mem_addr: [^]f64) -> __m128d {
  39. return _mm_load1_pd(mem_addr)
  40. }
  41. @(require_results, enable_target_feature="sse3")
  42. _mm_movehdup_ps :: #force_inline proc "c" (a: __m128) -> __m128 {
  43. return simd.shuffle(a, a, 1, 1, 3, 3)
  44. }
  45. @(require_results, enable_target_feature="sse3")
  46. _mm_moveldup_ps :: #force_inline proc "c" (a: __m128) -> __m128 {
  47. return simd.shuffle(a, a, 0, 0, 2, 2)
  48. }
  49. @(private, default_calling_convention="none")
  50. foreign _ {
  51. @(link_name = "llvm.x86.sse3.addsub.ps")
  52. addsubps :: proc(a, b: __m128) -> __m128 ---
  53. @(link_name = "llvm.x86.sse3.addsub.pd")
  54. addsubpd :: proc(a: __m128d, b: __m128d) -> __m128d ---
  55. @(link_name = "llvm.x86.sse3.hadd.pd")
  56. haddpd :: proc(a: __m128d, b: __m128d) -> __m128d ---
  57. @(link_name = "llvm.x86.sse3.hadd.ps")
  58. haddps :: proc(a, b: __m128) -> __m128 ---
  59. @(link_name = "llvm.x86.sse3.hsub.pd")
  60. hsubpd :: proc(a: __m128d, b: __m128d) -> __m128d ---
  61. @(link_name = "llvm.x86.sse3.hsub.ps")
  62. hsubps :: proc(a, b: __m128) -> __m128 ---
  63. @(link_name = "llvm.x86.sse3.ldu.dq")
  64. lddqu :: proc(mem_addr: rawptr) -> i8x16 ---
  65. }