aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-05-29 13:40:16 +0100
committergingerBill <bill@gingerbill.org>2022-05-29 13:40:16 +0100
commit77d4409549d27b904676af5f33d8d034c6cae53e (patch)
tree0fdcfb36ebae0e5d83ee26adf24c655e56be378e
parent7f3540b7f541b75b1c4b4db558636d8295297c3f (diff)
Add adx.odin
-rw-r--r--core/simd/x86/adx.odin53
1 files changed, 53 insertions, 0 deletions
diff --git a/core/simd/x86/adx.odin b/core/simd/x86/adx.odin
new file mode 100644
index 000000000..4de4324a2
--- /dev/null
+++ b/core/simd/x86/adx.odin
@@ -0,0 +1,53 @@
+//+build i386, amd64
+package simd_x86
+
+import "core:intrinsics"
+
+_addcarry_u32 :: #force_inline proc "c" (c_in: u8, a: u32, b: u32, out: ^u32) -> u8 {
+ x, y := llvm_addcarry_u32(c_in, a, b)
+ out^ = y
+ return x
+}
+_addcarryx_u32 :: #force_inline proc "c" (c_in: u8, a: u32, b: u32, out: ^u32) -> u8 {
+ return llvm_addcarryx_u32(c_in, a, b, out)
+}
+_subborrow_u32 :: #force_inline proc "c" (c_in: u8, a: u32, b: u32, out: ^u32) -> u8 {
+ x, y := llvm_subborrow_u32(c_in, a, b)
+ out^ = y
+ return x
+}
+
+when ODIN_ARCH == .amd64 {
+ _addcarry_u64 :: #force_inline proc "c" (c_in: u8, a: u64, b: u64, out: ^u64) -> u8 {
+ x, y := llvm_addcarry_u64(c_in, a, b)
+ out^ = y
+ return x
+ }
+ _addcarryx_u64 :: #force_inline proc "c" (c_in: u8, a: u64, b: u64, out: ^u64) -> u8 {
+ return llvm_addcarryx_u64(c_in, a, b, out)
+ }
+ _subborrow_u64 :: #force_inline proc "c" (c_in: u8, a: u64, b: u64, out: ^u64) -> u8 {
+ x, y := llvm_subborrow_u64(c_in, a, b)
+ out^ = y
+ return x
+ }
+}
+
+@(default_calling_convention="c")
+@(private)
+foreign _ {
+ @(link_name="llvm.x86.addcarry.32")
+ llvm_addcarry_u32 :: proc(a: u8, b: u32, c: u32) -> (u8, u32) ---
+ @(link_name="llvm.x86.addcarryx.u32")
+ llvm_addcarryx_u32 :: proc(a: u8, b: u32, c: u32, d: rawptr) -> u8 ---
+ @(link_name="llvm.x86.subborrow.32")
+ llvm_subborrow_u32 :: proc(a: u8, b: u32, c: u32) -> (u8, u32) ---
+
+ // amd64 only
+ @(link_name="llvm.x86.addcarry.64")
+ llvm_addcarry_u64 :: proc(a: u8, b: u64, c: u64) -> (u8, u64) ---
+ @(link_name="llvm.x86.addcarryx.u64")
+ llvm_addcarryx_u64 :: proc(a: u8, b: u64, c: u64, d: rawptr) -> u8 ---
+ @(link_name="llvm.x86.subborrow.64")
+ llvm_subborrow_u64 :: proc(a: u8, b: u64, c: u64) -> (u8, u64) ---
+}