bmi.odin 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #+build i386, amd64
  2. package simd_x86
  3. import "base:intrinsics"
  4. @(require_results, enable_target_feature="bmi")
  5. _andn_u32 :: #force_inline proc "c" (a, b: u32) -> u32 {
  6. return a &~ b
  7. }
  8. @(require_results, enable_target_feature="bmi")
  9. _andn_u64 :: #force_inline proc "c" (a, b: u64) -> u64 {
  10. return a &~ b
  11. }
  12. @(require_results, enable_target_feature="bmi")
  13. _bextr_u32 :: #force_inline proc "c" (a, start, len: u32) -> u32 {
  14. return bextr_u32(a, (start & 0xff) | (len << 8))
  15. }
  16. @(require_results, enable_target_feature="bmi")
  17. _bextr_u64 :: #force_inline proc "c" (a: u64, start, len: u32) -> u64 {
  18. return bextr_u64(a, cast(u64)((start & 0xff) | (len << 8)))
  19. }
  20. @(require_results, enable_target_feature="bmi")
  21. _bextr2_u32 :: #force_inline proc "c" (a, control: u32) -> u32 {
  22. return bextr_u32(a, control)
  23. }
  24. @(require_results, enable_target_feature="bmi")
  25. _bextr2_u64 :: #force_inline proc "c" (a, control: u64) -> u64 {
  26. return bextr_u64(a, control)
  27. }
  28. @(require_results, enable_target_feature="bmi")
  29. _blsi_u32 :: #force_inline proc "c" (a: u32) -> u32 {
  30. return a & -a
  31. }
  32. @(require_results, enable_target_feature="bmi")
  33. _blsi_u64 :: #force_inline proc "c" (a: u64) -> u64 {
  34. return a & -a
  35. }
  36. @(require_results, enable_target_feature="bmi")
  37. _blsmsk_u32 :: #force_inline proc "c" (a: u32) -> u32 {
  38. return a ~ (a-1)
  39. }
  40. @(require_results, enable_target_feature="bmi")
  41. _blsmsk_u64 :: #force_inline proc "c" (a: u64) -> u64 {
  42. return a ~ (a-1)
  43. }
  44. @(require_results, enable_target_feature="bmi")
  45. _blsr_u32 :: #force_inline proc "c" (a: u32) -> u32 {
  46. return a & (a-1)
  47. }
  48. @(require_results, enable_target_feature="bmi")
  49. _blsr_u64 :: #force_inline proc "c" (a: u64) -> u64 {
  50. return a & (a-1)
  51. }
  52. @(require_results, enable_target_feature = "bmi")
  53. _tzcnt_u16 :: #force_inline proc "c" (a: u16) -> u16 {
  54. return intrinsics.count_trailing_zeros(a)
  55. }
  56. @(require_results, enable_target_feature = "bmi")
  57. _tzcnt_u32 :: #force_inline proc "c" (a: u32) -> u32 {
  58. return intrinsics.count_trailing_zeros(a)
  59. }
  60. @(require_results, enable_target_feature = "bmi")
  61. _tzcnt_u64 :: #force_inline proc "c" (a: u64) -> u64 {
  62. return intrinsics.count_trailing_zeros(a)
  63. }
  64. @(private, default_calling_convention = "none")
  65. foreign _ {
  66. @(link_name = "llvm.x86.bmi.bextr.32")
  67. bextr_u32 :: proc(a, control: u32) -> u32 ---
  68. @(link_name = "llvm.x86.bmi.bextr.64")
  69. bextr_u64 :: proc(a, control: u64) -> u64 ---
  70. }