|
@@ -0,0 +1,79 @@
|
|
|
+#+build i386, amd64
|
|
|
+package simd_x86
|
|
|
+
|
|
|
+import "base:intrinsics"
|
|
|
+
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_andn_u32 :: #force_inline proc "c" (a, b: u32) -> u32 {
|
|
|
+ return a &~ b
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_andn_u64 :: #force_inline proc "c" (a, b: u64) -> u64 {
|
|
|
+ return a &~ b
|
|
|
+}
|
|
|
+
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_bextr_u32 :: #force_inline proc "c" (a, start, len: u32) -> u32 {
|
|
|
+ return bextr_u32(a, (start & 0xff) | (len << 8))
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_bextr_u64 :: #force_inline proc "c" (a: u64, start, len: u32) -> u64 {
|
|
|
+ return bextr_u64(a, cast(u64)((start & 0xff) | (len << 8)))
|
|
|
+}
|
|
|
+
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_bextr2_u32 :: #force_inline proc "c" (a, control: u32) -> u32 {
|
|
|
+ return bextr_u32(a, control)
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_bextr2_u64 :: #force_inline proc "c" (a, control: u64) -> u64 {
|
|
|
+ return bextr_u64(a, control)
|
|
|
+}
|
|
|
+
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_blsi_u32 :: #force_inline proc "c" (a: u32) -> u32 {
|
|
|
+ return a & -a
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_blsi_u64 :: #force_inline proc "c" (a: u64) -> u64 {
|
|
|
+ return a & -a
|
|
|
+}
|
|
|
+
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_blsmsk_u32 :: #force_inline proc "c" (a: u32) -> u32 {
|
|
|
+ return a ~ (a-1)
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_blsmsk_u64 :: #force_inline proc "c" (a: u64) -> u64 {
|
|
|
+ return a ~ (a-1)
|
|
|
+}
|
|
|
+
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_blsr_u32 :: #force_inline proc "c" (a: u32) -> u32 {
|
|
|
+ return a & (a-1)
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature="bmi")
|
|
|
+_blsr_u64 :: #force_inline proc "c" (a: u64) -> u64 {
|
|
|
+ return a & (a-1)
|
|
|
+}
|
|
|
+
|
|
|
+@(require_results, enable_target_feature = "bmi")
|
|
|
+_tzcnt_u16 :: #force_inline proc "c" (a: u16) -> u16 {
|
|
|
+ return intrinsics.count_trailing_zeros(a)
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature = "bmi")
|
|
|
+_tzcnt_u32 :: #force_inline proc "c" (a: u32) -> u32 {
|
|
|
+ return intrinsics.count_trailing_zeros(a)
|
|
|
+}
|
|
|
+@(require_results, enable_target_feature = "bmi")
|
|
|
+_tzcnt_u64 :: #force_inline proc "c" (a: u64) -> u64 {
|
|
|
+ return intrinsics.count_trailing_zeros(a)
|
|
|
+}
|
|
|
+
|
|
|
+@(private, default_calling_convention = "none")
|
|
|
+foreign _ {
|
|
|
+ @(link_name = "llvm.x86.bmi.bextr.32")
|
|
|
+ bextr_u32 :: proc(a, control: u32) -> u32 ---
|
|
|
+ @(link_name = "llvm.x86.bmi.bextr.64")
|
|
|
+ bextr_u64 :: proc(a, control: u64) -> u64 ---
|
|
|
+}
|